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