如何用python-memcache导出memcached中的所有键值?
我想用python-memcache从memcached服务器导出所有的键和值。可是这个模块里没有这样的功能,那我该怎么做呢?
也许需要用到更复杂的东西,比如“socket”模块。
7 个回答
7
这件事是做不到的。Memcache协议并没有规定任何可以用来遍历键的命令。你必须知道具体的键才能获取到对应的值。
15
使用来自libmemcached工具包中的memdump和memcat工具。虽然它们不能保证你能获取到所有的数据,但使用起来非常简单。
注意:在ubuntu或debian系统上,你可以通过安装libmemcached-tools
这个软件包来获取它们,安装后它们的名字会变成memcdump
和memccat
。
要导出所有的键:
memcdump --servers=localhost
要导出所有的值:
memccat --servers=localhost `memcdump --servers=localhost`
当然,你还需要把键和值对应起来。我建议先把键导出到一个文件中,然后用这个文件作为memcat
的输入(这样可以确保数据的一致性)。接着,你需要把值分开——我记得是用句号来分隔——然后按顺序把键和值配对起来。可能网上有现成的脚本可以用...
27
这段话的意思是,你可以通过这个方法获取到一个memcached服务器上的所有键。然后,你可以使用任何memcached的客户端库来获取每个键对应的值。
import telnetlib
def get_all_memcached_keys(host='127.0.0.1', port=11211):
t = telnetlib.Telnet(host, port)
t.write('stats items STAT items:0:number 0 END\n')
items = t.read_until('END').split('\r\n')
keys = set()
for item in items:
parts = item.split(':')
if not len(parts) >= 3:
continue
slab = parts[1]
t.write('stats cachedump {} 200000 ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s] END\n'.format(slab))
cachelines = t.read_until('END').split('\r\n')
for line in cachelines:
parts = line.split(' ')
if not len(parts) >= 3:
continue
keys.add(parts[1])
t.close()
return keys