如何在Redis中存储的有序集合中更新元素?

4

我使用Redis作为我的有序集合数据的持久化。我的数据看起来像下面这样:

{text: 'Some text1', data: [1, 2, 3]},
{test: 'Some text2', data: [1, 3]}
.
.
.

如何更新列表中的某些元素?比如说我需要更新:
{test: 'Some text2', data: [1, 3]}

to

{test: 'Some text2', data: [1, 3, 7]}
2个回答

6

您只能向已排序的集合中添加值或删除值。除了分数之外,您不能更改/更新它们。

相反,您可以直接将值保存为字符串:

SET text2 "{\"test\": \"Some text2\", data: [1, 3]}"

然后通过替换原始值来更新它们。

SET text2 "{\"test\": \"Some text2\", data: [1, 3, 7]}"

另一种选择是将值存储在哈希表中。

更新:

假设您有作为json持久化的用户对象且使用键“users:[id]”:

SET users:1 "{\"id\":1,\"name\":\"Santtu\"}"

然后将用户对象的键存储在排序集合"users"中。

ZADD users 1 "users:1"
ZADD users 2 "users:2"

现在,您可以通过先查询键,再查询每个用户数据来获取用户:
ZRANGE users 0 9 # returns [ "users:1", "users:2", ...]
GET "users:1"
GET "users:2"
...

改变用户集合中用户的顺序,只需改变分数即可:
ZADD users 2 "users:123"
ZADD users 1 "users:456"

谢谢回复,但我需要一个排序集合。因为我的JSON对象应该保持有序的方式。 - Erik
你应该有一个单独的排序集合,仅包含正确顺序中对象的ID。然后,您可以通过哈希/键从对象ID获取实际内容。 - santervo
在这种情况下,删除旧成员并添加一个带有更新列表的新成员。使用MULTI/EXEC或Lua脚本实现原子性。 - Itamar Haber
谢谢回复。更改文档顺序是否也可能? - Erik
当然可以。但是如果你想要更新它,你需要知道确切的字符串序列化(或者排名/分数),首先删除它,然后添加新的序列化(如@ItamarHaber所建议的)。 - santervo
显示剩余3条评论

0
请在redis-cli中使用以下命令: zincrby <set_name> <amount_to_be_changed> <key> 例如:
redis> ZADD myzset 1 "one"
(integer) 1
redis> ZADD myzset 2 "two"
(integer) 1
redis> ZINCRBY myzset 2 "one"
"3"
redis> ZRANGE myzset 0 -1 WITHSCORES
1) "two"
2) "2"
3) "one"
4) "3"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接