为什么Django的缓存在locmem下有效但在memcached中失败?
在使用Django的缓存功能时,如果用的是locmem(也就是在内存中存储简单的Python类,像列表、元组或字典),一切运行得很好。但如果换成memcached,就出现问题了。
尽管分配了足够的内存和设置了较长的超时时间,只有一小部分的键能够存入memcached,而且这些键似乎没有任何值和它们关联。
当尝试取出这些键时,什么值也得不到,它们就从缓存中消失了。
如果强制给一个值,比如“hi”,那么这些键就能在缓存中找到,但这并不能解释为什么大多数键根本就不在。
有几个问题:
- 为什么只有某些键能存入memcached,而其他的却不行,即使所有的值都设置成“hi”?
- 有没有办法开启更多的日志记录或错误报告?(现在一切似乎都默默失败了)
- 为什么Python类在locmem中能正确序列化,但在Memcached中却没有存进去?
2 个回答
3
要了解发生了什么,可以运行 memcached -vv 2>/tmp/mc_debug_log
(我假设你是在某种Unix系统上),并且运行一段短时间——完成后,你会在那个日志文件中找到详细的信息。
根据你使用的Python接口来连接memcached,可能只支持字符串作为值(就像在cmemcache中的StringClient模块),或者支持所有可以被序列化的对象(当然,这会有序列化和反序列化的开销),就像在同一个cmemcache中的更通用的Client模块,GAE的memcache,以及python-memcached;如果你只能使用字符串作为值,那你大概是在使用前者的接口吧?
3
显然,键(key)里面不能有空格:
http://code.djangoproject.com/ticket/6447
http://blog.pos.thum.us/2009/05/22/memcached-keys-cant-have-spaces-in-them/
一旦我用了一个带空格的键,结果就变得不可预测了。