gpt4 book ai didi

redis - 如何以服务器端时间戳作为分数存储在Redis排序集中?

转载 作者:行者123 更新时间:2023-12-03 06:42:43 27 4
gpt4 key购买 nike

我想使用一个排序集来存储使用 redis-server 时间戳作为分数的对象。

我知道我可以将 Redis Streams 与 * 一起使用id,但是Redis Streams有限制,包括我不能编辑对象,我不能使用排名或字典排序,我不能真正删除中间的对象,联合或交叉等。

我想以原子方式执行此操作,并使用 redis-server 时间戳,以便我可以使用多个客户端到 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 TIME command .该命令返回:
  • Unix 时间(以秒为单位)
  • 微秒

  • 所以我们可以连接这两者并使用微秒时间戳。我们需要对微秒部分进行零填充。

    由于排序集适用于高达 2^53 的整数值,因此我们的时间戳一直到 2255 年都是安全的。

    这是 Redis 集群安全的,因为我们存储在一个键中。要使用多个 key ,请确保使用 hash tags 将它们放在同一节点上如果你想比较时间戳。

    您可以修改脚本以使用低于微秒的分辨率。

    这里 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

    与往常一样,您可能想要 load the script并使用 EVALSHA .
    > 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

    关于 Redis 版本的说明。如果您正在使用:
  • Redis 3.2 之前的版本:抱歉,您不能使用 TIME (非确定性命令)然后用 ZADD 写入.
  • Redis 版本大于 3.2 但小于 5.0:添加 redis.replicate_commands()在脚本之上。见 Scripts as pure functions
  • Redis 5.0 一上来:你很好。
  • 关于redis - 如何以服务器端时间戳作为分数存储在Redis排序集中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59846503/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com