【问题标题】:Hash or Sorted set in redis?redis中的哈希或排序集?
【发布时间】:2014-09-22 03:25:05
【问题描述】:

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

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

上述表示适用于 n 个用户 目前我已经使用排序集实现了它,其中字段表示排序集的值和值表示分数。我还在这些密钥上设置了每天到期。

考虑到当用户数量很大时单个密钥创建和到期的开销,我正在考虑使用哈希的替代表示,考虑到它的如下优点

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>

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

【问题讨论】:

    标签: redis hash sortedset


    【解决方案1】:

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

    hmset user:1 field1 value1 field2 value2 field3 value3
    

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

    zadd expirations 1 1234567890
    

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

    更新

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

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

    这将允许您让 Redis 处理过期: 过期用户:1:field1 过期用户:1:field2 过期用户:1:field3

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

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

    【讨论】:

    • 好的,谢谢。也给我你的建议,为单独的字段设置单独的哈希值?并且使密钥过期会占用大量 CPU 开销吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    • 2023-03-27
    • 2010-10-20
    • 2017-06-01
    相关资源
    最近更新 更多