【问题标题】:Storing only ids in Redis?只在 Redis 中存储 id?
【发布时间】:2014-12-09 19:07:10
【问题描述】:

我正在构建一个查找服务,我希望它每秒会收到 10 万个请求。该服务将仅存储一组具有到期时间(例如 1 小时)的 id,并且在到期之前将查找这些 id 中的极少数,并且将查找的那些将最多查找一次。一旦查找到密钥,我将删除它们。

我对此有几个问题,希望对 Redis 有深入了解的人回答一下

  1. 经过充分研究,我正在考虑使用 Redis 来完成这项任务,而不是 Aerospike、Hbase、Cassandra 等。Redis 是一个不错的选择吗?
  2. 我的用例只需要 ids(keys)。仅将 id 存储为没有相应值的键是否有意义。在 Redis 中如何做到这一点?
  3. 我的密钥是 32 个字符长的十六进制,有效期为 1 小时,预计每秒有 10 万个请求。我希望 2% 的密钥在到期前被查询一次,其余的永远不会被查询。有没有直接的方法来进行这种基准测试?

【问题讨论】:

    标签: redis scalability lookup infrastructure


    【解决方案1】:
    1. 是的,Redis 非常适合这项任务。

    2. 将 ID 存储在 redis 中也很有意义。正如您所表示的那样,您希望逐个使它们过期,这将要求它们是单独的键(有一个使用排序集的解决方案,但在您的情况下我不建议这样做)。您可以通过以下方式仅存储一个 ID:SET 01234567890abcdef0123456789abcdef "" - 这将创建一个名为“0123456789abcdef0123456789abcdef”的键并为其分配一个空值。如果同时您想为密钥设置过期时间,您可以使用:SETEX 01234567890abcdef0123456789abcdef 3600 "" - 这会创建相同的密钥并在一小时(3600 秒)后过期。

    3. redis-benchmark 命令在这里应该有所帮助。它是在您安装 redis 命令行客户端 (redis-cli) 时安装的。查看redis-benchmark --help,然后尝试通过redis-benchmark -t get,set -n 1000000 -q

    4. 运行 1000000 GET、SET 测试

    更新(在 cmets 中的后续问题之后):

    1. 很遗憾,我无法告诉您 redis 是否是 最佳 解决方案,因为这意味着我了解所有其他可能的解决方案 :-) 还有更多因素需要要考虑缩小问题空间:是否有多个客户端访问 ID 列表?还是只有一个客户?过期时间是1小时吗?或者更多/更少?在任何给定时间,将存在多少个 ID(您只提到 req/sec,但没有提及存在的项目数)? 也就是说,对于我从事的项目,我发现 redis 非常快速和可靠。以我有限的知识,我会向你推荐 redis 作为最好的解决方案。

    2. 鉴于 redis 提供的数据结构,我会说是的。如果有其他数据对您有用而不是空值,您当然可以将其存储在 ID 位置,而不会影响性能。

    3. 嗯 - 也许你可以玩这两个:设置密钥 - redis-benchmark -n 1000000 -r 1000000 -q setex xxx:__rand_int__ 3600 '' 和检索密钥 - redis-benchmark -n 1000000 -r 1000000 -q get xxx:__rand_int__。将它们放入脚本中,然后在将值调整为更类似于您的实际问题后在后台运行其中一个。

    请注意,基准测试中的 setex 命令会污染 redis 数据库:它会创建很多 xxx: 密钥,您需要处理这些密钥 (redis-cli keys xxx:* | xargs redis-cli del ) - 不要在生产系统上运行它,而只能在测试实例上运行!

    【讨论】:

    • 谢谢托比亚什。我有几个后续问题 1. 我确实知道 Redis 适合这项任务。然而,我的问题是它是否是给定任务的最佳选择。 2. 存储空值是解决此问题的最有效方法吗? 3. 我知道 Redis-benchmark,但有没有办法使用它来密切模仿我的用例。谢谢!
    • 我在任何时候都在查看大约 400 万个 ID。每个 id 的过期时间为 1 小时
    猜你喜欢
    • 2011-10-02
    • 2020-07-20
    • 1970-01-01
    • 2012-10-08
    • 2012-10-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多