动态更新redis排序集中元素的列组

mjqavswn  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(393)

在我的围棋程序中,我使用的是一个redis排序集,叫做 MyEntries 它有三个要素: EntryA , EntryB 以及 EntryC 排名1、2和3(以此类推)。
它是有序的,元素是唯一的(这就是为什么我不使用列表)。
但问题是,如果删除一个元素,那么排名顺序显然就不再是这样了!例如,如果我删除 EntryB , EntryC 仍然排名第三(而不是第二)。
我知道我基本上可以按索引进行查询,因为索引号是动态变化的。但我刚刚发现,不幸的是,在redis中没有办法按元素名查询索引。
你能帮我解决这个问题吗?在redis中,如果删除一个元素,有没有办法动态更新排序集中的排名?
ps我正在构建一个fifo队列程序,它允许用户从队列中删除元素(除了最老的元素先离开)。您还想知道您在队列中的位置(这就是为什么我面临这个排名更新问题)。

iq3niunx

iq3niunx1#

你可以把 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 .

相关问题