2013-07-16 62 views
0

你好,我是新来Memcache.I有5个内存缓存服务器(1.22版),我使用Python的memcache library.When我使用一个服务器中的所有工作正常,但是当我使用memc.set_servers(memcL)至配置5个服务器一些密钥被缓存,而其他密钥不被缓存。这种奇怪行为的原因是什么?Python的内存缓存

代码摘录:

 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"))) 

谢谢您的帮助。

回答

0

Memcached实际上不是分布式服务器;这是一个简单的键值存储。在每台服务器上运行的每个memcached实例都是独立运行的,不知道还有其他的memcached服务器。你的软件给服务器一个密钥,它会收到一个值;就是这样。

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

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

nc 192.168.1.18 11211 

其中192.168.1.18是memcached服务器。

还要注意的是,如果你改变了客户端配置(例如,通过添加服务器),那么所有的按键变化分布,让你改变配置可能无法在新配置检索之前已经缓存某些键(因为他们的服务器已更改),并需要重新缓存。

+0

谢谢你的帮助。最后问题是我设置的缓存密钥的过期时间大于30天,Memcache不支持超过30天的过期时间。这种情况导致了Memcache的奇怪行为。 – amartin

0

最后我通过设置关键问题解决了到期时间为0(没有到期)。将上述参数设置为大于2592000s(30天)的值时,Memcache有一个奇怪的行为。

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

“的项目的到期时间。如果是等于零,该项目将永远不会过期,您还可以使用Unix时间戳或一些从当前时间开始秒,但在后者。的情况下秒数不得超过2592000(30天)。“

谢谢你的帮助。