我正在构建一个查询服务,我期望每秒可以收到0.1万个请求。该服务只是存储一组具有到期时间(例如1小时)的ID,并且在到期之前将查找这些ID中的极少数并且将被查找的那些将被查询一次。一旦他们被抬起,我会删除密钥。
我有几个问题围绕这个问题,很高兴得到一个对Redis有深刻理解的人的答案
答案 0 :(得分:2)
是的,Redis非常适合这项任务。
将ID存储在redis中也很有意义。正如您所指出的那样,您希望在单独的基础上使它们过期,这将要求它们是单独的密钥(使用有序集合的解决方案,但我建议您不要这样做)。您可以通过以下方式存储一个ID:SET 01234567890abcdef0123456789abcdef ""
- 这将创建一个名为" 0123456789abcdef0123456789abcdef"并为其分配一个空值。如果您同时想要在密钥上设置过期时间,则可以使用:SETEX 01234567890abcdef0123456789abcdef 3600 ""
- 这会创建相同的密钥,并在一小时(3600秒)后过期。
redis-benchmark命令应该有帮助。安装redis命令行客户端(redis-cli)时会安装它。看看redis-benchmark --help
,然后尝试通过以下方式运行1000000 GET,SET测试:redis-benchmark -t get,set -n 1000000 -q
更新(在评论中的后续问题之后):
不幸的是,我无法告诉你redis是否是最佳解决方案,因为这意味着我知道其他所有可能的解决方案:-)还有很多因素需要考虑缩小问题空间:是否有多个客户端访问ID列表?或者它只是一个客户?到期时间是1小时吗?或者更多/更少?在任何给定的时间,将存在多少个ID(您只提到req / sec,但没有提到存在的项目数量)? 也就是说,对于我所从事的项目,我发现redis非常快速可靠。凭借我有限的知识,我会向您推荐redis作为最佳解决方案。
鉴于redis提供的数据结构,我说是的。如果有其他数据对您有用而不是空值,您当然可以将其存储在ID位置而不会影响性能。
嗯 - 也许你可以玩这两个:设置键 - 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 ) - 不要在生产系统上运行,但只需要测试实例!