你好我是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")))
感谢您的帮助。
答案 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天)。“
感谢您的帮助。