10

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

我使用 Django 和 Redis 作为缓存。

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

当我从 Redis 请求集合时,Django Debug Toolbar 通知我对 Redis 的请求需要 ~3 seconds。我一定是做错了什么。

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

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

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

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

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

4

2 回答 2

22

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

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

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

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

于 2012-08-08T09:31:26.740 回答
1

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

于 2012-08-08T00:03:29.917 回答