使用Redis更新排序集
Updating Sorted Set with Redis
当前我正在尝试更新已排序的集合成员。查看文档,使用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对此进行了解释,我正在解释如何使用分数和元素的示例更新元素。
- NX=添加新元素
- 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));
相关文章:
- 如何在动态表更新后刷新整个表排序缓存
- 可拖动和可排序项目编号在更改时更新
- 更新标签数组时如何对其进行排序
- 更新“项目”选项以进行排序
- 使用一次更新对有序列表中的元素重新排序
- MongoDB使用排序和切片更新嵌套数组,不会对代码进行排序
- jQuery - 排序后更新可排序列表
- React Native ListView 不会在排序或检索新数据后更新
- 从服务器更新的 meteor 集合,不会在客户端上被动排序
- D3 - 为什么此排序函数不更新其选择中的所有元素
- 使用 AJAX 回调更新挖空可观察数组会生成随机排序的结果
- knockoutjs ObservableArrays 和排序函数:UI 未更新
- 如何在主干中对列表进行排序时更新模型的顺序属性
- jQuery UI's未激发可排序更新事件
- 使用Redis更新排序集
- 根据数字排序顺序更新自动重新排列HTML列表
- 在backbone.js中,如何使用新的模型数据更新视图,同时在没有完整渲染的情况下保持排序顺序
- 如何区分在同一列表中拖动和从一个列表移动到连接列表时的可排序更新事件
- jQuery可排序更新的数据没有被序列化
- 表排序器不能正确排序更新的行