仅在Redis中存储ID?

时间:2014-10-14 20:53:39

标签: redis scalability lookup infrastructure

我正在构建一个查询服务,我期望每秒可以收到0.1万个请求。该服务只是存储一组具有到期时间(例如1小时)的ID,并且在到期之前将查找这些ID中的极少数并且将被查找的那些将被查询一次。一旦他们被抬起,我会删除密钥。

我有几个问题围绕这个问题,很高兴得到一个对Redis有深刻理解的人的答案

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

1 个答案:

答案 0 :(得分:2)

  1. 是的,Redis非常适合这项任务。

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

  3. redis-benchmark命令应该有帮助。安装redis命令行客户端(redis-cli)时会安装它。看看redis-benchmark --help,然后尝试通过以下方式运行1000000 GET,SET测试:redis-benchmark -t get,set -n 1000000 -q

  4. 更新(在评论中的后续问题之后):

    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__。将它们放入脚本中并在调整值后将其中一个在后台运行,使其更像您的真实问题。

    4. 请注意,基准测试中的setex命令会污染redis数据库:它会创建大量的xxx:键,你需要处理它们(redis-cli keys xxx:* | xargs redis-cli del ) - 不要在生产系统上运行,但只需要测试实例!