大家好,我是新接触Memcache.我有5个Memcache服务器(版本1.22),我使用的是Python memcache library.When,我只使用一个服务器,一切正常,但是当我使用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")))谢谢你的帮助。
发布于 2013-07-16 20:12:55
Memcached实际上不是分布式服务器;它只是一个简单的键值存储。在您的每台服务器上运行的每个memcached实例都独立运行,而不知道周围还有其他memcached服务器。你的软件给服务器一个密钥,它接收一个值;仅此而已。
那么数据分发是如何实现的呢?执行此操作的是客户端库。memcached客户端库(即您的程序使用的python memcache库)实际上是在您为其配置了memcached的所有服务器之间分发数据的库。它的数据分发算法是这样的:给定的键总是去往相同的memcached服务器。
所以,有些键被缓存,另一些没有,这可能意味着被缓存的键被放到一个正在工作的memcached服务器上,而没有被缓存的键被放到一个不可访问的memcached服务器上。您应该验证客户端设置是否正确,并尝试依次从客户端连接到每个服务器,例如
nc 192.168.1.18 11211其中192.168.1.18是memcached服务器。
还要注意,如果您更改了客户端配置(例如,通过添加服务器),则所有键的分布都会更改,因此在更改配置之前已经缓存的一些键可能无法在新配置中检索到(因为它们的服务器已经更改),需要重新缓存。
发布于 2013-07-17 16:27:14
最后,我通过将密钥过期时间设置为0(无过期)解决了这个问题。将上述参数设置为大于2592000 (30天)的值时,Memcache有一个奇怪的行为。
来自http://php.net/manual/en/memcache.set.php
项目的过期时间。如果它等于零,则项目永远不会过期。您也可以使用Unix时间戳或从当前时间开始的秒数,但在后一种情况下,秒数不能超过2592000 (30天)。
谢谢你的帮助。
https://stackoverflow.com/questions/17675289
复制相似问题