redis - Redis 中的哈希集还是排序集?

标签 redis hash sortedset

我的网站中有一个用例,其中我需要以如下形式存储用户特定的日常统计信息

user:1 {field1: value, field2: value, field3: value}

以上表示适用于 n 个用户 目前,我已经使用排序集来实现它,其中字段表示排序集的值,值表示分数。我还为这些 key 设置了每日到期时间。

考虑到当用户数量很大时单个 key 创建和过期的开销,我正在考虑使用散列的替代表示,如下所示,考虑到其优点如下

Map of field1 <user_id, value> 
Map of field2 <user_id, value>
Map of field3 <user_id, value>
Also a map for expiry <user_id, last_updated_time>

我很困惑是坚持现有的实现还是使用哈希来实现用例。有人可以帮忙吗?

最佳答案

如果您不需要按值对字段进行排序,那么使用排序集可能不是解决您问题的最佳解决方案。使用哈希来存储用户字段值肯定更惯用。

hmset user:1 field1 value1 field2 value2 field3 value3

排序集可用于存储到期日期。键是用户 ID,值是过期日期的 unix 时间戳。对于用户:1,到期日期将通过如下命令设置为 1234567890:

zadd expirations 1 1234567890

它允许您使用 ZRANGEBYSCORE 在一次操作中获取当前时间的过期 key 列表

更新

您可以使用简单的键来存储您的数据:

SET user:1:field1 value1
SET user:1:field2 value2
SET user:1:field3 value3

它允许您让 Redis 处理过期问题: 使用户:1:field1 过期 过期用户:1:字段2 使用户过期:1:field3

用于删除过期 key 的 Redis 算法不会引入任何明显的延迟。使用它肯定比实现自己的更好。如果您需要更多详细信息,请查看 EXPIRE documentation

如果您想指定到期日期而不是持续时间,也可以使用 EXPIREAT。

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

相关文章:

node.js - Nodejs redis 查询数据

redis - BRPOP在Redis中是如何实现的?

redis - 如何将扫描限制为特定的一组键

c - 使用hiredis一次调用发送多条记录

Redis:过期集元素 - 成员必须是唯一的

python - 可扩展散列 - 最高有效位

ruby - 谁能解释一下?

c++ - Unordered_set迭代器随机

redis - 从 Redis 中的排序集中获取随机项目

node.js - 在 Redis 中存储事件时间线