为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
长风秋雁 2022-06-01 17:45:10
在我的 Go 程序中,我正在使用一个名为的 Redis Sorted Set MyEntries,它具有三个元素:EntryA,EntryB以及EntryC排名1、2和3(等等..)。它都是有序的,元素是唯一的(这就是我不使用 LIST 的原因)。但是问题是,如果删除一个元素,排名顺序显然不再是这种情况!例如,如果我删除EntryB,EntryC仍然会有排名 3(而不是 2)。我知道我基本上可以按索引查询,因为索引号确实会动态变化。但不幸的是,我刚刚发现在 Redis 中无法按元素名称查询索引。你能帮我解决这个问题吗?如果删除了一个元素,Redis 中是否有任何方法可以动态更新排序集中的排名?PS 我正在构建一个 FIFO 排队程序,它使用户还可以从队列中删除元素(除了最旧的先离开)。您还想知道您在队列中的位置(这就是我面临此排名更新问题的原因)。
查看完整描述

1 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

而不是放置排名,您可以放置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.


查看完整回答
反对 回复 2022-06-01
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信