Redis使用lua脚本
使用Lua脚本的好处:
减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延。
原子操作。redis会将整个脚本作为一个整体执行,中间不会被其他命令插入。因此在编写脚本的过程中无需担心会出现竞态条件,无需使用事务。
复用。客户端发送的脚本会永久存在redis中,这样,其他客户端可以复用这一脚本而不需要使用代码完成相同的逻辑。
EVAL script numkeys key [key ...] arg [arg ...]
说明:script
是第一个参数,为Lua 5.1脚本。该脚本不需要定义Lua函数(也不应该)。numkeys
指定后续参数有几个key。key [key ...]
,是要操作的键,可以指定多个,在lua脚本中通过KEYS[1]
, KEYS[2]
获取arg [arg ...]
,参数,在lua脚本中通过ARGV[1]
, ARGV[2]
获取。
127.0.0.1:6379> eval "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 value1 value2
1) "key1"
2) "key2"
3) "value1"
4) "value2"
127.0.0.1:6379>
127.0.0.1:6379> eval "redis.call('SET', KEYS[1], ARGV[1]);redis.call('EXPIRE', KEYS[1], ARGV[2]); return 1;" 1 key1 value1 60
(integer) 1
127.0.0.1:6379> get key1
"value1"
127.0.0.1:6379> ttl key1
(integer) 53
127.0.0.1:6379>
这个脚本相当于执行了2条命令 SET key1 value1
EXPIRE key1 60
参考资料
[1] Redis使用lua脚本
[2] EVAL script numkeys key arg
[3] EVAL
[4] Scripting with Lua