redis - 在 Redis 中只存储 ID?

标签 redis scalability lookup infrastructure

我正在构建一个查询服务,我预计它每秒会收到 10 万个请求。该服务将只存储一组具有过期时间(比如 1 小时)的 ID,并且在过期之前很少会查找这些 ID,而那些将要查找的 ID 最多只会查找一次。一旦查找到 key ,我就会将其删除。

我有几个关于这个的问题,很高兴能得到对 Redis 有深刻理解的人的回答

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

最佳答案

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

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

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

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

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

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

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

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

关于redis - 在 Redis 中只存储 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26370122/

相关文章:

arrays - Excel VBA比较两个二维数组的有效方法

c# - 如何基于多个xml属性存储和查找数据?

redis如何在1个查询中组合多个命令

performance - Redis 性能问题?

java - 在 GAE 上高效实现 "following"功能

c# - 有哪些最佳实践可确保您的 .NET 代码能够很好地扩展?

Django 自递归 ManyToManyField 过滤查询

redis - 无法识别的选项或args的参数数量错误: '--evalsha'

phpredis : RedisException [ 0 ]: protocol error, 得到 't' 作为回复类型字节

heroku - Heroku 平台上的扩展指南