Lua语言
先介绍下背景,Lua是一种强大、高效、轻量级、可嵌入的脚本语言。它支持过程式编程、面向对象编程、函数式编程、数据驱动编程和数据描述。有个比较特殊的点是下标从1开始。
数据结构
localmy_table= {} table字典、数组;metaTable
生态
- require "test"
- luarocks:包管理
- Lapis:web框架
- luasql:数据库操作
应用
- redis,相关命令:EVAL、script load、script exists版本7之后支持lua的函数(function),对应命令,FUNCTION LOAD、FCALL
- nginx,可以嵌入到nginx的生命周期中,用于操作header、cookie等非常方便
demo
#!/usr/local/bin/luaprint("hello world") _table = {key1=100, value1=200, "name"} _table2 = {"sife","sife"} function_table.fun01( name, age ) print(name,age) endfori,vinpairs(_table) doprint(i,v) endfori,vinpairs(_table2) doprint(i,v) endprint(_table.fun01("uptown", 18)) return_table
redis中的应用
最近搞了一个小工具,其中用到了一个类似白名单的东西,为了做的轻量级,设计成将白名单放到redis中,然后用后台任务不断的从数据库中刷新到redis从而保证更新。
这里有一个问题,白名单用queue保存,理论上每次都要先删除再新增,众所周知redis是不保证原子性的。为了保证redis原子性需要引入lua脚本。
结合springboot引入spring-boot-starter-data-redis依赖,使用StringRedisTemplate 提交lua脚本
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>
为了保证删除与push的原子性
"redis.call('del', 'topic_uptown')" + "local topics = KEYS " + "for i, v in pairs(topics) do " + " redis.call('lpush', 'topic_uptown', v) " + "end";
Longresult = stringRedisTemplate.execute(redisScript, topics);
入参是从数据库查出来的List。