我的网站中有一个用例,其中我需要以如下形式存储用户特定的日常统计信息
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/