我是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关于延迟问题了,但是我还没有真正跳出来。
我不确定在一个密钥中存储大量数据是否是一个非常糟糕的主意,或者我的配置是否有问题。任何帮助或建议或要阅读的内容将不胜感激。
答案 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)
这很可能只是字符串的大小。我会看看你的对象是否有效序列化。