为什么Django的缓存在locmem下有效但在memcached中失败?

4 投票
2 回答
1204 浏览
提问于 2025-04-15 12:46

在使用Django的缓存功能时,如果用的是locmem(也就是在内存中存储简单的Python类,像列表、元组或字典),一切运行得很好。但如果换成memcached,就出现问题了。

尽管分配了足够的内存和设置了较长的超时时间,只有一小部分的键能够存入memcached,而且这些键似乎没有任何值和它们关联。

当尝试取出这些键时,什么值也得不到,它们就从缓存中消失了。

如果强制给一个值,比如“hi”,那么这些键就能在缓存中找到,但这并不能解释为什么大多数键根本就不在。

有几个问题:

  1. 为什么只有某些键能存入memcached,而其他的却不行,即使所有的值都设置成“hi”?
  2. 有没有办法开启更多的日志记录或错误报告?(现在一切似乎都默默失败了)
  3. 为什么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/

一旦我用了一个带空格的键,结果就变得不可预测了。

撰写回答