使用Redis更新排序集

Updating Sorted Set with Redis

本文关键字:排序 更新 Redis 使用      更新时间:2023-09-26

当前我正在尝试更新已排序的集合成员。查看文档,使用ZADD似乎应该更新一个成员(如果其分数已经存在)。然而,在使用此代码尝试更新成员时,

db.zadd("users", parseInt(key, 10) + 1, JSON.stringify(newData));

即使分数已经存在,也会添加新的条目!如何使用redis更新已排序的集合成员?

ZADD将替换旧成员的分数,只要密钥和成员在条目之间匹配:

redis localhost:6379> ZADD test-key 40 blah
(integer) 1
redis localhost:6379> ZRANGE test-key 0 -1 WITHSCORES
1) "blah"
2) "40"
redis localhost:6379> ZADD test-key 45 blah
(integer) 0
redis localhost:6379> ZRANGE test-key 0 -1 WITHSCORES
1) "blah"
2) "45"

也许您在ZADD命令之间使用了不同的键或成员?

@Eli已经解释了如何更新元素分数,现在zadd添加了新选项,@ZettaCircl对此进行了解释,我正在解释如何使用分数和元素的示例更新元素。

  1. NX=添加新元素
  2. XX=更新元素

将三个国家/地区添加到排序集中

 127.0.0.1:6379> zadd country nx 1 'pakistan' // nx = add new element
(integer) 1
127.0.0.1:6379> zadd country nx 2 'turkey'
(integer) 1
127.0.0.1:6379> zadd country nx 3 'UK'
(integer) 1

用分数获取国家

127.0.0.1:6379> zrange country 0 10 withscores
1) "pakistan"
2) "1"
3) "turkey"
4) "2"
5) "UK"
6) "3"

更新国家

使用分数将国家/地区巴基斯坦(元素)更新为新名称

127.0.0.1:6379> zadd country xx ch 1 'islamic republic of pakistan'
(integer) 0 // 0 means not updated

使用元素名称("巴基斯坦")更新巴基斯坦的国家得分

127.0.0.1:6379> zadd country xx ch 4 'pakistan'
(integer) 1 // updated successfully 

用分数获取国家

我们可以在这里看到我们只更新了分数。

127.0.0.1:6379> zrange country 0 10 withscores
1) "turkey"
2) "2"
3) "UK"
4) "3"
5) "pakistan"
6) "4" // score updated

结论

我们只能使用元素名称更新排序集合中的分数。


我们如何更新元素

首先,我们需要清除巴基斯坦。

127.0.0.1:6379> zrem country pakistan
(integer) 1 // removed successfully

获取有分数的国家

127.0.0.1:6379> zrange country 0 10 withscores
1) "turkey"
2) "2"
3) "UK"
4) "3"

用新名称添加巴基斯坦

将新元素添加到具有新名称和以前分数的国家/地区排序集中

127.0.0.1:6379> zadd country nx 1 'islamic republic of pakistan'
(integer) 1

获取有分数的国家

127.0.0.1:6379> zrange country 0 10 withscores
1) "islamic republic of pakistan"
2) "1"
3) "turkey"
4) "2"
5) "UK"
6) "3"

结论

首先,我们需要删除元素,然后将新元素添加到排序集中。

自2013年的回答以来,文档似乎发生了变化。

ZADD options (Redis 3.0.2 or greater)
ZADD supports a list of options, specified after the name of the key and before the first score argument. Options are:
XX: Only update elements that already exist. Never add elements.
NX: Don't update already existing elements. Always add new elements.
CH: Modify the return value from the number of new elements added, to the total number of elements changed (CH is an abbreviation of changed). Changed elements are new elements added and elements already existing for which the score was updated. So elements specified in the command line having the same score as they had in the past are not counted. Note: normally the return value of ZADD only counts the number of new elements added.
INCR: When this option is specified ZADD acts like ZINCRBY. Only one score-element pair can be specified in this mode.

发件人https://redis.io/commands/zadd

现在,您可以判断ZADD对您的期望行为。如果你的答案是,选择XX就可以了。所以类似于:

db.zadd("users", XX, parseInt(key, 10) + 1, JSON.stringify(newData));