使用Redis更新排序集

时间:2013-09-04 23:45:58

标签: javascript node.js nosql redis

目前我正在尝试更新已排序的集成员。查看文档时,如果成员已经存在,则应使用ZADD来更新成员。但是,在使用此代码尝试更新成员时,

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

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

3 个答案:

答案 0 :(得分:4)

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命令之间使用不同的键或成员?

答案 1 :(得分:1)

@Eli已经解释了如何更新元素分数,现在 zadd 添加了新选项,这由@ZettaCircl解释,我正在解释如何使用分数和元素的示例更新元素< / strong>。

  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

结论

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


我们如何更新元素

首先,我们需要删除国家paksitan。

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"

结论

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

答案 2 :(得分:0)

自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));