Redis获取大字符串的速度很慢

时间:2012-08-07 23:56:33

标签: django performance caching redis

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

我正在使用Django和Redis作为缓存。

我正在腌制约200个对象的集合并将其存储在Redis中。

当我从Redis请求收集时,Django Debug Toolbar通知我对Redis的请求大约需要3个。我必须做一些可怕的错误。

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

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

  • 从redis-cli的密钥上运行strlen我被告知长度约为2000万(这个太大了吗?)

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

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

2 个答案:

答案 0 :(得分:16)

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

此外,pickle格式未针对空间进行优化...您需要更紧凑的格式。协议缓冲区,MessagePack甚至普通的JSON可能更适合这种情况。您应该考虑在存储数据之前应用轻压缩算法(如Snappy,LZO,Quicklz,LZF等)。

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

最后一点:请务必使用最新的Redis版本 - 已经进行了大量优化以处理大型对象。

答案 1 :(得分:0)

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