go之动态更新Redis排序集中的元素等级

softidea 阅读:34 2025-06-02 22:19:02 评论:0

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

所有这些都是有序的,并且元素是唯一的(这就是为什么我使用LIST而不是的原因)。

但是问题是,如果删除了一个元素,则排名顺序显然不再是了!例如,如果我删除EntryBEntryC仍将排名3(而不是2)。

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

您能帮我解决这个问题吗?如果删除一个元素,Redis中有什么方法可以动态更新排序集中的排名?

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

请您参考如下方法:

除了放置排名,您还可以放置用于识别排名的score

如果用户a的分数为100,则b的分数为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 

在这里,您将元素与它们的分数一起添加到已排序的集合中,分数越高,表示排名越低-当您使用 0时,最高分数将是 zrevrank。当您使用 zrem删除得分最高的元素时,得分第二高的元素将以 0的值排名最高。


标签:Redis
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号