Redis中使用Lua脚本的开发思路(2)

--[[
Pattern delete key
KEYS[1]:pattern
--]]
 
redis.log(redis.LOG_NOTICE, "call keys "..KEYS[1]);
 
local keys=redis.call("keys", KEYS[1]);
local count = 0;
if(keys and (table.maxn(keys) > 0)) then
    for index, key in ipairs(keys) do
        redis.log(redis.LOG_NOTICE, "del "..key);
        count = count +  redis.call("del", key);
    end
end
return count;

需要注意的是场景二可以作为一种思路,通过Lua脚本组合redis内置命令来实现特定功能的命令。而这里的模式key批量删除并未一个好的命令,因为如果key的数量很大时,将会有比较严重的性能问题。redis默认限制Lua脚本执行时间最大为5秒,如果超过5秒将继续接受来自客户端的请求,并简单的返回BUSY结果。这时候则需要SCRIPT KILL或者SHUTDOWN NOSAVE命令做相应的处理。因此应该尽力保证脚本的执行速度极快。

场景三:生成随机数

对于Redis而且,脚本执行在相同数据集,相同参数下执行写命令具有一致性的。其不依赖与隐式的数据集,脚本执行过程中不同执行时期的状态变化,也不依赖外部I/O设备的输入。

要符合Redis服务执行的脚本条件,需要注意的地方比较多,可以参见:                       

下面是实现随机数列表的Lua脚本:

--[[
Random lpush a list key-value
KEYS[1]:key name
ARGV[1]:ramdom seed value
ARGV[2]:add element count
--]]
 
math.randomseed(ARGV[1]);
for i=1, ARGV[2], 1 do
    redis.call("lpush", KEYS[1], math.random());
end
redis.log(redis.LOG_NOTICE, "lpush " .. KEYS[1]);
return true;

上述脚本通过改变randomseed函数的参数来实现随机数,如果两次执行上述脚本,ARGV[1]参数值相同,则产生的随机数是相同的。

通过执行上述脚本,记录每次生产的值,然后删除对应key,再次生成。
 

Redis中使用Lua脚本的开发思路

Redis中使用Lua脚本的开发思路

Redis中使用Lua脚本的开发思路

对比上述结果,在执行该脚本时,随机数的生成由seed参数(第一个参数)决定的。
  相同随机数种子下生成的随机数是相同的,如果再次执行脚本,指定生成的随机数个数n小于已经生成的随机数个数m,则取已经生成的前n个,如果指定生成的随机数个数n大于已经生成的随机数个数m,则次数再生成(n-m)个随机数,并固定下来。

4.Redis中使用Lua脚本总结
    Redis内置了Lua解释器,这为操作Redis服务器和数据提供了巨大的灵活性。
    文中几个场景并不见得实际,有效,但并不能掩盖Lua与Redis结合将为Redis的使用提供了更大的想象和操作空间。
    我们可以通过Lua来实现更多特定功能的命令;用Lua来封装复杂了Redis操作的业务;计数,统计,分析,收集数据;实现业务操作事务控制等等。更多场景,还需在实际中不断摸索和尝试。

Ubuntu 14.04下Redis安装及简单测试

Redis集群明细文档

Ubuntu 12.10下安装Redis(图文详解)+ Jedis连接Redis

Redis系列-安装部署维护篇

CentOS 6.3安装Redis

Redis安装部署学习笔记

Redis配置文件redis.conf 详解

Redis 的详细介绍请点这里
Redis 的下载地址请点这里

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e4400caa7fe26e77c02afae55c108ad6.html