Lua脚本是一种轻量级脚本,采用C语言编写
为什么使用Lua脚本
- 批量执行命令,减少网络开销
- 原子性,redis会将Lua脚本中的命令当做一个整体来执行,不会被其他的请求打断
- 操作集合的复用,或者复杂命令的复用
redis中执行lua脚本
redis> eval lua-script key-num [key1 key2 key3 ...] [value1 value2 value3 ...]
- eval代表执行Lua语言的命令
- lua-script代表Lua语言脚本内容
- key-num 表示参数中有多少个key,需要注意的是Redis中key是从1开始的,如果没有key的参数,那么写0
- [key1 key2 key3 ...]是key作为参数传递给Lua语言,也可以不填,但是需要和key-num的个数对应起来
- [value1 value2 value3 ...]这些参数传递给Lua语言,它们是可填可不填的
在Lua脚本中执行redis命令
redis.call(command,key [param1,param2...])
- command是命令,包括set、get、del等
- key是被操作的键
- param1,param2...代表给key的参数
Lua脚本文件
redis-cli --eval qs.lua 0
案例
对IP进行限流
在x秒内只能访问y次
key:ip
value:记录访问次数
keys和argv中间用逗号隔开,逗号前后都有空格
缓存Lua脚本
如果lua脚本文件较大的话,每次客户端请求都会造成比较大的网络开销,所以将lua脚本缓存在服务端,生成lua脚本的摘要,通过摘要直接调用lua脚本
执行script load "return 'hello word'"
会生成一个sha1的摘要
执行的时候执行 evalsha 命令
缓存大脚本时,每行命令用分号;
隔开,写成1行
脚本超时
执行SCRIPT KILL
或者SHUTDOWN NOSAVE
可以结束正在进行的脚本
如果lua脚本中没有进行值的修改,执行SCRIPT KILL
即可,否则执行SHUTDOWN NOSAVE
关闭客户端