如何用python-memcache导出memcached中的所有键值?

14 投票
7 回答
27542 浏览
提问于 2025-04-16 16:06

我想用python-memcache从memcached服务器导出所有的键和值。可是这个模块里没有这样的功能,那我该怎么做呢?

也许需要用到更复杂的东西,比如“socket”模块。

7 个回答

7

这件事是做不到的。Memcache协议并没有规定任何可以用来遍历键的命令。你必须知道具体的键才能获取到对应的值。

15

使用来自libmemcached工具包中的memdumpmemcat工具。虽然它们不能保证你能获取到所有的数据,但使用起来非常简单。

注意:在ubuntu或debian系统上,你可以通过安装libmemcached-tools这个软件包来获取它们,安装后它们的名字会变成memcdumpmemccat

要导出所有的键:

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

撰写回答