0

您好,我是 Memcache 的新手。我有 5 台 Memcache 服务器(版本 1.22),我正在使用 Python memcache 库。当我使用一台服务器时一切正常,但是当我使用 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")))

谢谢您的帮助。

4

2 回答 2

0

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

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

"item的过期时间。如果等于0,则item永远不会过期。你也可以使用Unix时间戳或从当前时间开始的秒数,但在后一种情况下,秒数不能超过2592000(30天)。”

谢谢您的帮助。

于 2013-07-17T08:27:14.030 回答
0

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

那么数据分布是如何实现的呢?执行此操作的是客户端库。memcached 客户端库(即您的程序使用的python memcache 库)实际上是在您为其配置了它的所有服务器之间分发数据的库。它的数据分发算法使得给定的密钥将始终发送到同一个 memcached 服务器。

所以,有些键被缓存了,有些则没有。这可能意味着缓存的键会转到正在工作的 memcached 服务器,而未缓存的键会转到无法访问的 memcached 服务器。您应该验证客户端设置是否正确,并尝试依次从客户端连接到每个服务器,例如使用

  nc 192.168.1.18 11211

其中 192.168.1.18 是 memcached 服务器。

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

于 2013-07-16T12:12:55.163 回答