redis lua脚本

245 阅读2分钟

一、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中,这样其他客户端可以复用这一脚本,而不需要使用代码完成相同的逻辑。