Python Memcache

时间:2013-07-16 11:27:04

标签: python memcached

你好我是Memcache的新手。我有5个Memcache服务器(版本1.22),我正在使用Python内存缓存库。当我使用一台服务器时,一切正常,但是当我使用memc.set_servers(memcL)配置时5台服务器某些密钥被缓存,而其他密钥则没有。这种奇怪行为的原因是什么?

代码摘录:

     itemsForCache=queries[1].execute(settings.getDBCursor_1(),queries[1].getQuery(settings.getParameters()))     
     cacheDataEntry="" 
     for CacheItems in itemsForCache:
         cacheDataEntry+=str(CacheItems[0])+" "

     cache_time = time.time() - start_time
     cachingTime+=cache_time;
     li.info(recommendation.getIdRec()+str(iterator[0])+"_"+pKey+" | "+cacheDataEntry+" | "+str(cache_time))
     settings.getMemCacheClient().set(recommendation.getIdRec()+str(iterator[0])+"_"+pKey,cacheDataEntry,int(settings.getConfigurationValue("memcache-data-life-time")))

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

Memcached实际上不是分布式服务器;它是一个简单的键值存储。每个服务器中运行的每个memcached实例都独立运行,但不知道还有其他的memcached服务器。您的软件为服务器提供密钥,它接收一个值;就是这样。

那么如何实现数据分发?这是客户端库。 memcached客户端库(即程序使用的python memcache库)实际上是在为其配置了它的所有服务器之间分配数据的库。它的数据分发算法是这样的,给定的密钥总是会转到同一个memcached服务器。

因此,某些键被缓存,而其他键则没有。这可能意味着缓存的密钥将转到正在运行的memcached服务器,而未缓存的密钥将转到无法访问的memcached服务器。您应该验证客户端设置是否正确,并尝试依次从客户端连接到每个服务器,例如与

  nc 192.168.1.18 11211

其中192.168.1.18是memcached服务器。

另请注意,如果更改客户端配置(例如,通过添加服务器),则所有键的分发都会更改,因此在更改配置之前已经缓存的某些键可能无法在新配置中检索(因为他们的服务器已经改变了)并且需要重新缓存。

答案 1 :(得分:0)

最后,我通过将密钥到期时间设置为0(无到期)来解决问题。将上述参数设置为大于2592000s(30天)的值时,Memcache会出现奇怪的行为。

来自http://php.net/manual/en/memcache.set.php

“项目的到期时间。如果它等于零,则项目永不过期。您也可以使用Unix时间戳或从当前时间开始的秒数,但在后一种情况下,秒数不得超过2592000(30天)。“

感谢您的帮助。