使用Redis更新排序集

der*_*can 2 javascript nosql redis node.js

目前,我正在尝试更新已排序的集合成员。查看文档,使用ZADD似乎可以更新成员(如果其分数已经存在)。但是,使用此代码尝试更新成员时,

db.zadd("users", parseInt(key, 10) + 1, JSON.stringify(newData));
Run Code Online (Sandbox Code Playgroud)

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

Muh*_*eed 6

@Eli 已经解释了如何更新元素分数,现在zadd添加了由 @ZettaCircl 解释的新选项,我正在解释如何使用 Score 和 element 的示例来更新元素

  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
Run Code Online (Sandbox Code Playgroud)

获取有分数的国家

127.0.0.1:6379> zrange country 0 10 withscores
1) "pakistan"
2) "1"
3) "turkey"
4) "2"
5) "UK"
6) "3"
Run Code Online (Sandbox Code Playgroud)

更新国家

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

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

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

127.0.0.1:6379> zadd country xx ch 4 'pakistan'
(integer) 1 // updated successfully 
Run Code Online (Sandbox Code Playgroud)

获取有分数的国家

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

127.0.0.1:6379> zrange country 0 10 withscores
1) "turkey"
2) "2"
3) "UK"
4) "3"
5) "pakistan"
6) "4" // score updated
Run Code Online (Sandbox Code Playgroud)

结论

我们可以使用元素名称仅更新排序集中的分数。


我们如何更新元素

首先,我们需要删除国家巴基斯坦。

127.0.0.1:6379> zrem country pakistan
(integer) 1 // removed successfully
Run Code Online (Sandbox Code Playgroud)

获取有分数的国家/地区

127.0.0.1:6379> zrange country 0 10 withscores
1) "turkey"
2) "2"
3) "UK"
4) "3"
Run Code Online (Sandbox Code Playgroud)

使用新名称添加巴基斯坦

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

127.0.0.1:6379> zadd country nx 1 'islamic republic of pakistan'
(integer) 1
Run Code Online (Sandbox Code Playgroud)

获取有分数的国家/地区

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"
Run Code Online (Sandbox Code Playgroud)

结论

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


Eli*_*Eli 5

只要条目之间的键和成员匹配,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"
Run Code Online (Sandbox Code Playgroud)

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