首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以在redis中存储已排序集的哈希?

是否可以在redis中存储已排序集的哈希?
EN

Stack Overflow用户
提问于 2020-01-31 11:23:18
回答 1查看 275关注 0票数 1

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

下面是一个示例:

代码语言:javascript
复制
zadd feedbacks 1 feedback1 2 feedback2 3 feedback3 1 feedback4

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

如果我使用ZRANGEBYSCORE feedbacks 1 1

我将能够看到来自用户#1的反馈:

代码语言:javascript
复制
1) "feedback1"
2) "feedback4"

然而,我想存储的不仅仅是文本。例如,我希望能够检索timestamp。有没有办法将散列值插入到上面的密钥feedbacks中?

zadd feedbacks 1 text:feedback1 timestamp:123456这样的东西

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-31 12:23:58

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

但是,您可以使用JSON或您喜欢的格式对字段-值对进行字符串化。

代码语言:javascript
复制
ZADD feedbacks 1 "{\"text\":\"feedback1\",\"timestamp\":\"123456\""

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

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

二级索引

但您可能希望通过多种方式进行查询:按用户id、按时间戳等。

在这种情况下,可以考虑使用普通键来存储反馈对象,比如哈希。

代码语言:javascript
复制
HSET feedbacks:feedback1 text feedback1 timestamp 123456 user 1 ...

和你的索引:

代码语言:javascript
复制
ZADD feedbacks-by-user 1 feedback1
ZADD feedbacks-by-timestamp 123456 feedback1
...

假设你想要一个给定用户的所有反馈:

代码语言:javascript
复制
ZRANGEBYSCORE feedbacks-by-user 1 1

然后获取返回的键的值。当然,您可能希望避免两次往返。再一次,Lua script

脚本:

代码语言:javascript
复制
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

用法:

代码语言:javascript
复制
> 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"

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

您可以使用ZINTERSTOREZUNIONSTORE混合和匹配您的查询。

您可能会对How to store in Redis sorted set with server-side timestamp as score?感兴趣。您可以创建一个不错的Lua脚本来创建散列和二级索引项,所有这些都可以通过redis服务器端时间戳一次性完成。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59997466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档