Redis在2.6版推出了脚本功能,允许开发者在Redis中运行Lua语言编写的脚本,而在Lua脚本中我们可以编写大部分的Redis命令,那么使用Lua脚本有什么好处呢?
- 减少网络开销:如果我们需要执行一系列Redis命令的话,一句一句发送给Redis会产生很多次网络请求,影响效率,有了Lua脚本我们可以把这一系列命令写入到脚本中一次性发送给Redis执行,只有一次请求。
- 原子操作:Redis会将整个脚本作为一个整体执行,中间不会被其他命令插入,也就是说在执行期间数据不会被其他命令修改,从而也就不会产生并发问题,作为一个整体执行也意味着使用Lua脚本可以完成事务的功能,即同时成功或者同时失败。
- 复用:客户端发送的脚本会被存在Redis中,所以其他客户端可以复用这一脚本从而不必自己去重新写命令完成同样的逻辑。
那在Redis中如何使用Lua脚本呢?先来看一段Redis命令:
eval lua-script key-num [key1 key2 key3...] [value1 value2 value3...]
其中:
eval:代表执行lua脚本的命令。
lua-script:代表你自己编写的lua脚本。
key-num :代表传入lua脚本中的参数有多少个key
[key1 key2 key3...]:这些参数将作为key值传入脚本
[value1 value2 value3...]:这些参数将作为value值传入脚本
看下面的举例:
eval "redis.call('set',KEYS[1] , ARGV[1])" 1 key-1 value-1
其中:
redis.call('set',KEYS[1] , ARGV[1]) 为lua脚本,redis.call代表在脚本中调用redis命令,其中的参数代表redis命令:
set KEYS[1] ARGV[1],其中KEYS[1]和ARGV[1]用于接收传递给脚本的参数
数字 1 代表后面的参数中有一个key,剩下的都为value。
有时候Lua脚本会很长,当需要多次执行同样的脚本时,如果每次都在Redis命令中写显然是不现实的,这个时候就用到了Redis 的缓存脚本功能,我们可以通过script load 命令给lua脚本生成一个字符串,称为SHA-1签名,之后如果需要执行lua脚本,只要执行这个脚本对应的SHA-1签名就可以了,如以下示例:(其中第三行由于大小原因显示不全,完整是:evalsha 签名 1 key1 value1)