在说事务的时候有说事务更像是批处理的感觉,而脚本也是批处理,不同的是,我们可以根据上一个指令的结果作为我们下个指令的参数,这是处理逻辑问题的时候特别有用。
Redis脚本是通过Eval命令实现,当客户都安使用Eval命令的时候,Redis实例会通过lua解释器来执行脚本,我们这里的脚本也是lua脚本,用Abp中清除缓存的的源码作为示例
EVAL "local keys = redis.call('keys', ARGV[1]) for i=1,#keys,5000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end" 0 'Test_*'这个脚本第一步将以Test做为前缀的key全部取出来存入变量keys,接着从1开始,以keys的长度为最大值,步长为5000进行遍历,每一步都是删除5000个key。为什么要用每次5000遍历来执行呢?因为unpack函数在数量太多的时候会出现 'too many results to unpack' 的错误,我们来实际操作下,往实例中添加10个用Test_为前缀的值,然后执行上面的脚本
可以看到我们以Test_做为前缀的Key都被删除了
发布/订阅模式前面有讲到过,Redis实例和客户都之间是双工连接的,但是前面所说的不管是简单的命令还是事务脚本都是客户端主动发起请求,Redis实例被动回应的,而发布/订阅模式则是可以由Redis实例主动给客户端发送消息,在下一节会详细说这种模式。