gpt4 book ai didi

redis - 是否可以将哈希存储到Redis的排序集中?

转载 作者:行者123 更新时间:2023-12-03 06:41:25 25 4
gpt4 key购买 nike

我想在Redis中保留一些用户反馈。一些用户可能会给出多个反馈。为用户分配了数字用户ID

这是一个例子:

zadd feedbacks 1 feedback1 2 feedback2 3 feedback3 1 feedback4

在这种情况下,用户#1提供了反馈feedback1和feedback4,#2反馈2和#3 feedback3。

如果我使用 ZRANGEBYSCORE feedbacks 1 1
我将能够看到用户#1的反馈:
1) "feedback1"
2) "feedback4"

但是,我想存储的不仅仅是文本。我希望能够检索例如 timestamp。有什么办法可以将哈希值插入上方的 feedbacks键?

喜欢 zadd feedbacks 1 text:feedback1 timestamp:123456

最佳答案

你不能。列表,集合,哈希和排序集合仅支持Redis的字符串数据类型的值。

不过,您可以使用JSON或首选格式对字段值对进行字符串化。

ZADD feedbacks 1 "{\"text\":\"feedback1\",\"timestamp\":\"123456\""

除非您需要自动修改给定的字段,否则此方法应该可以做到。

即使在这种情况下,您也可以使用Lua脚本来实现服务器端JSON操作和更新。有关类似的解决方案,请参见 How to nest a list into a structure in Redis to reduce top level?

次要指标

但是您可能想查询多种方式:按用户ID,按时间戳等。

在这种情况下,请考虑使用常规键来存储反馈对象,例如作为哈希。
HSET feedbacks:feedback1 text feedback1 timestamp 123456 user 1 ...

和您的索引:
ZADD feedbacks-by-user 1 feedback1
ZADD feedbacks-by-timestamp 123456 feedback1
...

假设您需要给定用户的所有反馈:
ZRANGEBYSCORE feedbacks-by-user 1 1

然后,您将获得返回键的值。当然,您可能要避免两次往返。同样, Lua script

剧本:
local keys = redis.call('ZRANGEBYSCORE', KEYS[1], ARGV[1], ARGV[1])
for i, v in ipairs(keys) do
local k = {}
k[1] = v
k[2] = redis.call('HGETALL', 'feedbacks:'..v)
keys[i] = k
end
return keys

用法:
> EVAL "local keys = redis.call('ZRANGEBYSCORE', KEYS[1], ARGV[1], ARGV[1]) \n for i, v in ipairs(keys) do \n     local k = {} \n k[1] = v \n k[2] = redis.call('HGETALL', 'feedbacks:'..v) \n keys[i] = k \n end \n return keys" 1 feedbacks-by-user 1
1) 1) "feedback1"
2) 1) "text"
2) "feedback1"
3) "timestamp"
4) "123456"
5) "user"
6) "1"
2) 1) "feedback4"
2) 1) "text"
2) "feedback4"
3) "timestamp"
4) "465465"
5) "user"
6) "1"

您可以类似地查询一系列时间戳。

您可以使用 ZINTERSTORE ZUNIONSTORE 混合和匹配查询。

您可能对 How to store in Redis sorted set with server-side timestamp as score?感兴趣。您可以制作一个不错的Lua脚本来处理创建哈希和辅助索引条目的工作,这些操作都与redis服务器端时间戳一起使用。

最后,每当在Redis上使用Lua时,请考虑使用 load the script并使用 EVALSHA

关于redis - 是否可以将哈希存储到Redis的排序集中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59997466/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com