【问题标题】:Redis is slow to get large stringsRedis 获取大字符串很慢
【发布时间】:2012-08-05 01:09:38
【问题描述】:

我是 Redis 的新手,所以如果这是一个愚蠢的问题,我深表歉意。

我使用 Django 和 Redis 作为缓存。

我正在挑选大约 200 个对象的集合并将其存储在 Redis 中。

当我从 Redis 请求集合时,Django 调试工具栏通知我对 Redis 的请求大约需要 3 。我一定是做错了什么。

  • 服务器有 3.5GB 的内存,看起来 Redis 当前只使用了大约 50mb,所以我很确定它没有内存不足。

  • 当我 get 使用 redis-cli 的密钥时,它所花费的时间与我从 Django 中执行的时间一样长

  • 在 redis-cli 的密钥上运行 strlen 我得知长度约为 2000 万(这是否太大?)

如何让 Redis 更快地返回数据?如果这看起来不寻常,那么可能有哪些常见的陷阱?我已经看到 this page 关于延迟问题,但我还没有真正跳出来。

我不确定将大量数据存储在一个键中是否是一个非常糟糕的主意,或者我的配置是否有问题。任何帮助、建议或阅读内容将不胜感激。

【问题讨论】:

  • 有没有机会不必存储整个对象/集合?

标签: django performance caching redis


【解决方案1】:

这很可能只是字符串的大小。我会看看你的对象是否被有效地序列化。

【讨论】:

    【解决方案2】:

    Redis 不是为存储非常大的对象而设计的。您不应该将整个集合存储在 Redis 中的单个字符串中,而是使用 Redis 列表或集合作为对象的容器。

    此外,pickle 格式未针对空间进行优化……您需要更紧凑的格式。 Protocol Buffers、MessagePack,甚至是普通的 JSON,可能更适合这个。您应该考虑在存储数据之前应用轻量级压缩算法(如 Snappy、LZO、Quicklz、LZF 等......)。

    最后,性能可能受网络限制。在我的机器上,从 Redis 检索一个 20 MB 的对象需要 85 毫秒(不是 3 秒)。现在,如果我使用远程服务器运行相同的测试,则需要 1.781 秒,这在这个 100 Mbit/s 网络上是预期的。持续时间完全取决于网络带宽。

    最后一点:一定要使用最近的 Redis 版本 - 已经做了一些优化来处理大对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2022-11-14
      • 1970-01-01
      • 2020-07-01
      • 1970-01-01
      相关资源
      最近更新 更多