动态更新 Redis 有序集中元素的等级

Dynamically update ranks of elements in a Redis Sorted Set

在我的 Go 程序中,我正在使用名为 MyEntries 的 Redis 有序集,它包含三个元素:EntryAEntryBEntryC,排名为 123(依此类推...)。

它都是有序的并且元素是唯一的(这就是为什么我使用列表)。

但是接下来的问题是当排名顺序明显不再是这样的时候如果一个元素被移除!例如,如果我删除 EntryBEntryC 的排名仍然是 3(而不是 2)。

我知道我基本上可以按索引查询,因为索引号会动态变化。但不幸的是,我刚刚发现 Redis 中没有办法按元素名称查询索引。

你能帮我解决这个问题吗?如果删除一个元素,Redis 中是否有任何方法可以动态更新 Sorted Sets 中的排名?

PS 我正在构建一个 FIFO 排队程序,使用户能够 从队列中删除元素(除了最老的先离开)。您还想知道您在队列中的位置是什么(这就是为什么我面临这个排名更新问题)。

您可以放置​​标识排名的 score 而不是排名。

如果用户 a 的得分为 100b 的得分为 200 等。

127.0.0.1:6379> zadd mysort 100 a 200 b 300 c 500 d 50 e
(integer) 5
127.0.0.1:6379> zrevrange mysort 0 -1 withscores
 1) "d"
 2) "500"
 3) "c"
 4) "300"
 5) "b"
 6) "200"
 7) "a"
 8) "100"
 9) "e"
10) "50"
127.0.0.1:6379> zrevrank mysort d
(integer) 0
127.0.0.1:6379> zrevrank mysort e
(integer) 4
127.0.0.1:6379> zrem mysort b
(integer) 1
127.0.0.1:6379> zrevrank mysort e
(integer) 3
127.0.0.1:6379> zrem mysort d
(integer) 1
127.0.0.1:6379> zrevrange mysort 0 -1 withscores
1) "c"
2) "300"
3) "a"
4) "100"
5) "e"
6) "50"
127.0.0.1:6379> zrevrank mysort e
(integer) 2
127.0.0.1:6379> zadd mysort 500 q 25 f 350 p
(integer) 3
127.0.0.1:6379> zrevrange mysort 0 -1 withscores
 1) "q"
 2) "500"
 3) "p"
 4) "350"
 5) "c"
 6) "300"
 7) "a"
 8) "100"
 9) "e"
10) "50"
11) "f"
12) "25"
127.0.0.1:6379> zrevrank mysort q
(integer) 0

在这里你不断地把你的元素和他们的分数一起添加到排序集中,分数越高意味着排名越低 - 当你使用 zrevrank 时最高分数将是 0。当您使用 zrem 删除得分最高的元素时,得分第二高的元素将以 0.

的值排名最高