【问题标题】:Reset scores of Redis sorted set after zremrangebyscore在 zremrangebyscore 之后重置 Redis 排序集的分数
【发布时间】:2022-01-12 11:48:53
【问题描述】:

我正在使用 Redis 排序集来保持某些值的顺序。例如:

score | data
0     |  a
1     |  b
2     |  c
3     |  d

在我的应用程序的某些情况下,我必须删除一些条目。例如,我删除分数 1 和 2 的成员:

score | data
0     |  a
3     |  d

我想把上面的改成:

score | data
0     |  a
1     |  d

我该怎么做?

请帮忙,提前谢谢。

【问题讨论】:

  • 你的分数总是从0开始,每个新元素的分数总是等于集合的大小吗?换句话说,您的分数是否始终处于以下模式:0、1、2、3、4、...?
  • @for_stack 是的,它正好是 0,1,2,3,....

标签: javascript node.js redis software-distribution


【解决方案1】:

经过搜索和努力,我找到了解决方案。

您可以使用 Lua 脚本和 EVAL 命令:

EVAL 
"
redis.call('ZREMRANGEBYSCORE', KEYS[1], KEYS[2], KEYS[2]);
local otherMembers = redis.call('ZRANGEBYSCORE', KEYS[1], KEYS[2], 1/0);
for k, v in ipairs(otherMembers) do
redis.call('ZINCRBY', KEYS[1], -1], v);
"
2 key index;

【讨论】:

    【解决方案2】:

    看来你不需要分数,而是需要排名。

    你可以保留一个从0开始单调递增的计数器,每次需要向集合中添加元素时,在计数器上调用incr获取分数,并将元素插入集合中。这样一来,每个新元素的得分总是最高的,即新元素的排名低于旧元素。

    127.0.0.1:6379> incr counter
    (integer) 1
    127.0.0.1:6379> zadd set 1 a
    (integer) 1
    127.0.0.1:6379> incr counter
    (integer) 2
    127.0.0.1:6379> zadd set 2 b
    (integer) 1
    127.0.0.1:6379> incr counter
    (integer) 3
    127.0.0.1:6379> zadd set 3 c
    (integer) 1
    127.0.0.1:6379> incr counter
    (integer) 4
    127.0.0.1:6379> zadd set 4 d
    

    您可以使用ZREMRANGEBYRANK 删除元素,使用ZRANK 获取每个元素的排名(排名总是从0开始)。

    127.0.0.1:6379> zremrangebyrank set 1 2
    (integer) 2                              <------- remove b and c
    127.0.0.1:6379> zrank set a
    (integer) 0
    127.0.0.1:6379> zrank set d
    (integer) 1
    

    【讨论】:

    • 感谢您的建议,但它无法解决我的问题。我的应用程序从具有索引的服务器获取一些数据,并且这些数据的顺序很重要。另一方面,有时可以删除一个,可以修改一个,有时可以删除一些数据,必须重新设置索引。
    【解决方案3】:

    我认为在 Redis 中不能像索引数组那样使用排序列表。

    如果您想要一个带有连续分数的排序列表,您应该自己处理它,以便在每次删除后,您可以用新分数覆盖您的排序列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      • 2018-01-26
      • 2014-06-05
      • 2021-09-19
      • 1970-01-01
      相关资源
      最近更新 更多