【问题标题】:Dynamically update ranks of elements in a Redis Sorted Set动态更新 Redis 排序集中元素的等级
【发布时间】:2020-05-10 11:54:41
【问题描述】:

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

一切都是有序的,元素也是独一无二的(这就是我使用 LIST 的原因)。

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

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

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

PS 我正在构建一个 FIFO 排队程序,使用户能够从队列中移除元素(除了最旧的先离开)。您还想知道您在队列中的位置(这就是我遇到此排名更新问题的原因)。

【问题讨论】:

  • no way in Redis to query index by element name 是什么意思?您的查询是什么?获取给定元素的排名?
  • 所以他们在这里讨论:stackoverflow.com/questions/8899111/… 我在文档中也找不到任何关于它的内容..(命令参考页面)
  • 我正在使用它。但这让我想到了我上面描述的问题!如果我删除一个元素怎么办......新元素的排名应该改变!
  • 我添加了一个可能的解决方案作为答案,包括添加、删除、排名、所有列表等。

标签: go redis fifo


【解决方案1】:

您可以输入标识排名的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

在这里,您不断将元素添加到带有分数的排序集中,分数越高意味着排名越低 - 当您使用 zrevrank 时,最高分数将是 0。当您使用zrem 删除得分最高的元素时,得分第二高的元素将以0 的值排名最高。

【讨论】:

  • 解决了!谢谢你:)
猜你喜欢
  • 2013-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-29
  • 2014-05-12
  • 1970-01-01
  • 2021-01-27
相关资源
最近更新 更多