如何将服务器端时间戳作为分数存储在Redis排序集中?
我想使用一个排序集来存储使用redis服务器时间戳作为分数的对象如何将服务器端时间戳作为分数存储在Redis排序集中?,redis,Redis,我想使用一个排序集来存储使用redis服务器时间戳作为分数的对象 我知道我可以使用ReISIS流使用 */Cord>ID,但是ReDIS流有限制,包括我不能编辑对象,我不能使用秩或字典排序,我不能真正删除中间的对象,联合或交叉,等等。 我想以原子方式完成这项工作,并使用redis服务器时间戳,这样我就可以使用多个客户端来ZADD,而不用担心时钟同步 如何执行此操作?解决方案是使用Lua脚本: local time = redis.call('TIME') local ts = time[1]..
我知道我可以使用ReISIS流使用<代码> */Cord>ID,但是ReDIS流有限制,包括我不能编辑对象,我不能使用秩或字典排序,我不能真正删除中间的对象,联合或交叉,等等。 我想以原子方式完成这项工作,并使用redis服务器时间戳,这样我就可以使用多个客户端来
ZADD
,而不用担心时钟同步
如何执行此操作?解决方案是使用Lua脚本:
local time = redis.call('TIME')
local ts = time[1]..string.format('%06d', time[2])
return redis.call('ZADD', KEYS[1], ts, ARGV[1])
这里我们使用Redis。该命令返回:
- unix时间(秒)
- 微秒
EVAL
命令,简单地传递键和值作为参数,无需事先创建排序集:
EVAL "local time = redis.call('TIME') local ts = time[1]..string.format('%06d', time[2]) return redis.call('ZADD', KEYS[1], ts, ARGV[1])" 1 ssetKey myVal
和往常一样,您可能希望使用
关于Redis版本的说明。如果您正在使用:
- Redis 3.2之前的版本:抱歉,您不能使用
(非确定性命令)然后使用TIME
进行写入ZADD
- Redis版本大于3.2但小于5.0:在脚本顶部添加
。看Redis.replicate_commands()
- Redis 5.0升级版:你很好
> SCRIPT LOAD "local time = redis.call('TIME') local ts = time[1]..string.format('%06d', time[2]) return redis.call('ZADD', KEYS[1], ts, ARGV[1])"
"81e366e422d0b09c9b395b5dfe03c03c3b7b3bf7"
> EVALSHA 81e366e422d0b09c9b395b5dfe03c03c3b7b3bf7 1 ssetKey myNewVal
(integer) 1