一、Redis中Lua的常用命令
- EVAL
- EVALSHA
- SCRIPT LOAD - SCRIPT EXISTS
- SCRIPT FLUSH
- SCRIPT KILL
1 EVAL命令
命令格式:EVAL script numkeys key [key …] arg [arg …]
127.0.0.1:6379> EVAL "return KEYS[1]" 1 key1
"key1"
127.0.0.1:6379> EVAL "return ARGV[1]" 0 value1
"value1"
127.0.0.1:6379> EVAL "return redis.call('get', 'foo')" 0
(nil)
2 SCRIPT LOAD命令 和 EVALSHA命令
SCRIPT LOAD命令格式:SCRIPT LOAD script
EVALSHA命令格式:EVALSHA sha1 numkeys key [key …] arg [arg …]
127.0.0.1:6379> SCRIPT LOAD "redis.call('SET', KEYS[1], ARGV[1]);redis.call('EXPIRE', KEYS[1], ARGV[2]); return 1;"
"6aeea4b3e96171ef835a78178fceadf1a5dbe345"
127.0.0.1:6379> evalsha 6aeea4b3e96171ef835a78178fceadf1a5dbe345 1 userAge 10 60
(integer) 1
3 SCRIPT EXISTS 命令
SCRIPT EXISTS sha1 [sha1 …]
127.0.0.1:6379> SCRIPT EXISTS 6aeea4b3e96171ef835a78178fceadf1a5dbe345
1) (integer) 1
4 SCRIPT FLUSH 命令
清除Redis服务端所有 Lua 脚本缓存
127.0.0.1:6379> SCRIPT EXISTS 6aeea4b3e96171ef835a78178fceadf1a5dbe345
1) (integer) 1
127.0.0.1:6379> SCRIPT FLUSH
OK
127.0.0.1:6379> SCRIPT EXISTS 6aeea4b3e96171ef835a78178fceadf1a5dbe345
1) (integer) 0
5 SCRIPT KILL 命令
二.Redis执行Lua脚本文件
场景:如果key1存在且旧的value值是arg1,则更新为arg2
1.编写Lua脚本文件 first.lua
local key = KEYS[1]
local val = redis.call("GET", key);
if val == ARGV[1]
then
redis.call('SET', KEYS[1], ARGV[2])
return 1
else
return 0
end
2.执行Lua脚本文件
redis-cli --eval first.lua key1 , arg2 arg3
"--eval"而不是命令模式中的"eval",一定要有前端的两个-
脚本路径后紧跟key [key …],相比命令行模式,少了numkeys这个key数量值 key [key …] 和 arg [arg …] 之间的“ , ”,英文逗号前后必须有空格
三、redis使用lua的优点
1.减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。
2.原子操作。Redis会将整个脚本作为一个整体执行,中间不会被其他请求插入。因此在脚本运行过程中无需担心会出现竞态条件,无需使用事务。
3.复用。客户端发送的脚本会永久存在redis中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑。