Redis与lua脚本配合操作zset的简单例子
By:Roy.LiuLast updated:2021-08-15
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脚本的两种方式
From:一号门
Previous:一个利用redis zset统计在线用户数的方法.
COMMENTS