【发布时间】:2013-11-18 17:32:59
【问题描述】:
在检查了一大堆东西之后,我发现对于某些键,python-memcached 就是无法获取或在我的机器上设置它们(Mac OSX 10.9,自制 memcache 1.4.15,pip 安装了 python-内存缓存 1.53)。我的第一个问题是在黑暗中拍摄,不清楚发生了什么,但经过更多挖掘后,我现在确定了。
一切都围绕着 def _get_server(self, key):
如果我们添加两个调试打印输出行,
def _get_server(self, key):
if isinstance(key, tuple):
serverhash, key = key
else:
serverhash = serverHashFunction(key)
for i in range(Client._SERVER_RETRIES):
server = self.buckets[serverhash % len(self.buckets)]
if server.connect():
#print "(using server %s)" % server,
print 'got server {} for {}'.format(serverhash % len(self.buckets),
key)
return server, key
print 'server {} failed for {}'.format(serverhash % len(self.buckets),
key)
serverhash = serverHashFunction(str(serverhash) + str(i))
return None, None
试图获取或设置密钥 'NFL::CAR_TB',
import memcache
mc_cl = memcache.Client('127.0.0.1')
mc_cl.set('JAC_SF', 1)
mc_cl.get('JAC_SF')
mc_cl.set('UAC_SF', 1)
mc_cl.get('UAC_SF')
结果,在我的机器上,
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 2 (inet:7:11211 (dead until 1384821475)) failed for JAC_SF
server 5 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 2 (inet:7:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 2 (inet:7:11211 (dead until 1384821475)) failed for JAC_SF
server 5 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for JAC_SF
server 2 (inet:7:11211 (dead until 1384821475)) failed for JAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for UAC_SF
got server 6 for UAC_SF
server 7 (inet:.:11211 (dead until 1384821475)) failed for UAC_SF
got server 6 for UAC_SF
如果我将 _get_server 更改为
def _get_server(self, key):
choices = range(len(self.buckets) - 1)
random.shuffle(choices)
if isinstance(key, tuple):
choice, key = key
else:
choice = choices.pop()
for _ in range(Client._SERVER_RETRIES):
server = self.buckets[choice]
if server.connect():
#print "(using server %s)" % server,
print 'got server {} for {}'.format(choice,
key)
return server, key
print 'server {} ({}) failed for {}'.format(choice, server, key)
choice = choices.pop()
return None, None
然后一切都会好很多,
got server 4 for JAC_SF
server 0 (inet:1:11211 (dead until 1384821552)) failed for JAC_SF
server 3 (inet:.:11211 (dead until 1384821552)) failed for JAC_SF
got server 4 for JAC_SF
server 7 (inet:.:11211 (dead until 1384821552)) failed for UAC_SF
server 0 (inet:1:11211 (dead until 1384821552)) failed for UAC_SF
got server 6 for UAC_SF
server 7 (inet:.:11211 (dead until 1384821552)) failed for UAC_SF
server 2 (inet:7:11211 (dead until 1384821552)) failed for UAC_SF
server 5 (inet:.:11211 (dead until 1384821552)) failed for UAC_SF
server 1 (inet:2:11211 (dead until 1384821552)) failed for UAC_SF
got server 6 for UAC_SF
尝试在我的 python 程序中设置多个键时,我得到了非常不一致的结果,
导入内存缓存
TWO_HOURS = 2 * 60 * 60
mc_cl = memcache.Client('127.0.0.1')
映射 = {...}
mc_cl.flush_all()
ret = mc_cl.set_multi(mapping=mapping, time=TWO_HOURS)
getret = mc_cl.get_multi(mapping.keys())
如果 len(映射)!= len(getret):
print 'not set\n\t{}'.format('\n\t'.join([str((k, mapping[k])) for k in
[a for a in mapping.keys()
如果 a 不在 getret.keys()]]))
在分析了原始的内存缓存输出之后,似乎并不是所有的键都被设置了,之后也不是所有的键都被请求了。在 Mac OSX 10.9 上的 homebrew 和 pip 上完成的所有事情都是最新的。
下面的 Memcache 输出和读取表明只有 101 个键被尝试写入和读取,而有 228 个项目。
重新进口
游戏集 = []
游戏获取 = []
使用 open('memout.log') 作为 f:
对于 f.read().split('\n') 中的行:
匹配 = re.match('^21 OK
22 好
21 已储存
【问题讨论】:
标签: python memcached python-memcached