Redis与lua脚本配合操作zset的简单例子

摘要: lua脚本执行redis的多项操作,当做一个原子事务,比如分布式锁,用来判断当前任务是否被锁定。很多都是执行LUA脚本来实现的。包括Redssion框架都是这样。今天主要记录自己在springboot中,如何利用lua脚本来操作zset

lua脚本执行redis的多项操作,当做一个原子事务,比如分布式锁,用来判断当前任务是否被锁定。很多都是执行LUA脚本来实现的。包括Redssion框架都是这样。今天主要记录自己在springboot中,如何利用lua脚本来操作zset.


一个简单的场景,用户设备是否在线,通过心跳发送到后台。后台更新数据到zset. 详细的参考这篇文章(一个利用redis zset统计在线用户数的方法.)。 数据已经存到redis 的 zset 中了。现在需要在设备列表页面展示设备状态(在线/离线), 这里就需要在分页查出设备列表之后,再根据列表中的关键字比如用户ID,或者设备ID 去ZSET中判断当前设备是否在线。 如果分页是20条数据一页,如果自己用java redis api去查,可能要查询20次。这是很大的一个浪费。但如果用lua脚本去查,就可以只用一次批量请求,就返回20条数据的在线状态。性能会高很多。所以编写一个lua脚本如下:

--zset.lua
--用来获取ZSET里面的数据
-- KEYS 表示要查询的 列表。 ARGV[1] 表示对比的 SCORE值.
local result = {}
local totalLength = #KEYS
local compareScore = tonumber(ARGV[1])
-- 遍历所有KEY
for i=1,totalLength do
    local tmpKey = KEYS[i]
    local tmpScore = redis.call('zscore', 'online:devices', tmpKey)

    if tmpScore then
        local scoreNumber = tonumber(tmpScore)
        if scoreNumber>=compareScore then
            result[i]=1;
        else
            result[i]=0;
        end
    else
        result[i]=0;
    end
end

return result

返回的result, 可以当做一个数组,存储对应的数据,1表示在线,0表示离线。这个返回的数据,与传递进来的参数KEYS数组是一一对应的。在java 程序中得到result结果后,自己包装设备状态,然后在返回到前端,这样就好多了。


如果想知道,怎么在springboot中跑lua脚本,可以参考: Redis跑lua脚本的两种方式

上一篇: 一个利用redis zset统计在线用户数的方法.
下一篇: 利用Python脚本调用ssh scp命令批量拷贝文件
 评论 ( What Do You Think )
名称
邮箱
网址
评论
验证
   
 

 


  • 微信公众号

  • 我的微信

站点声明:

1、一号门博客CMS,由Python, MySQL, Nginx, Wsgi 强力驱动

2、部分文章或者资源来源于互联网, 有时候很难判断是否侵权, 若有侵权, 请联系邮箱:summer@yihaomen.com, 同时欢迎大家注册用户,主动发布无版权争议的 文章/资源.

3、鄂ICP备14001754号-3, 鄂公网安备 42280202422812号