- lua脚本是作为一个整体执行的.所以中间不会被其他命令插入(隔离性);
- 可以把多条命令一次性打包,所以可以有效减少网络开销;
- lua脚本可以常驻在redis内存中,所以在使用的时候,可以直接拿来复用.也减少了代码量.
EVAL命令。例如:eval "return redis.call('set',KEYS[1],ARGV[1])" 1 company_name xiaobu
= (set company_name xiaobu)
在Worker接收到消息时,尝试先从redis缓存中根据消息的ID获取值,有以下两种情况:
Compare and set : 就是在执行get和set命令时,没有保持原子性操作,导致其他命令有机可趁,那是不是可以把get和set命令当成一整个部分执行,不让其他命令插入执行呢?
eval "if redis.call('get', KEYS[1]) == false then redis.call('set', KEYS[1], ARGV[1]) return 0 else return 1 end" 1 msg_push_1 "1"
- - redis.call("命令名称",参数1,参数2...) :执行指定的redis指令,执行遇到错误会直接返回错误
- - redis.pcall("命令名称",参数1,参数2) :执行指定的redis指令,执行遇到错误以lua表的形式返回。
- 执行脚本文件和缓存脚本
SCRIPT LOAD script
EVALSHA sha1 numkeys key [key ...] arg [arg ...]
Redis 还支持直接执行 Lua 脚本文件。首先编写并存储一个 Lua 脚本。
Redis-cli –eval 命令语法基本与原 eval 语法相同。