如何使用python-memcache从memcached导出所有键和值?

时间:2011-04-20 12:28:34

标签: python memcached

我想使用python-memcache从memcached服务器导出所有键和值。 该模块中没有这样的功能。怎么办呢?

可能需要涉及“套接字”模块的更复杂的事情。

7 个答案:

答案 0 :(得分:22)

这将获取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

答案 1 :(得分:13)

使用memdump套件中的memcatlibmemcached实用程序。他们无法保证您能获得所有数据,但它们很容易使用。

注意:在ubuntu / debian上,您可以通过安装libmemcached-tools包来获取这些内容,并将其称为memcdumpmemccat

转储所有密钥:

memcdump --servers=localhost

转储所有值:

memccat --servers=localhost `memcdump --servers=localhost`

当然你还需要匹配键和值 - 我建议将密钥转储到文件中,然后使用它作为memcat的输入(这可以确保一致性)。然后当然你需要拆分值 - 一个句号是我认为的分隔符 - 然后顺序配对键和值。那里可能有一个脚本......

答案 2 :(得分:6)

没有办法做到这一点。 Memcache protocol没有定义迭代键的任何命令。您必须知道检索值的关键。

答案 3 :(得分:0)

正如许多地方的其他人所提到的,在一般情况下,无法列出存储在memcached实例中的所有密钥。例如,Memcached: List all keysCouldn't retrieve all the memcache keys via telnet client

但是,您可以列出类似于第一个1Meg键的内容,这通常足以了解开发期间存储在memcache服务器中的内容。基本上,您可以有两个选项从memcache服务器中提取项目:

(1)要检索键和值的子集,可以使用上面介绍的方法使用@lrd

然而,当数据非常大(例如,数百万条记录)时,该方法可能非常耗时。更重要的是,这种方法只能检索密钥的一个子集&值。

(2)如果您想迭代memcached服务器的所有项目,在向memcache服务器添加/设置/ cas项目时记录密钥是一种更便宜的解决方案。然后,您可以通读日志文件以获取所有密钥并从memcache服务器获取值。正如此邮件列表中所述:List all objects in memcached

答案 4 :(得分:0)

最简单的方法是使用python-memcached-stats包,https://github.com/abstatic/python-memcached-stats

keys()方法应该让你前进。

答案 5 :(得分:0)

在Bash中,这个脚本可能有所帮助:

while read -r key; do
    memccat --servers=localhost $key > "$key.dump";
done < <(memcdump --server localhost)

您也可以直接连接到端口并发送memccat命令(例如使用Netcat:get SOME-KEY)而不是echo "get $key" | nc localhost 11211

相关:

答案 6 :(得分:-4)

您正在寻找'flush_all'memcache命令:http://code.google.com/p/memcached/wiki/NewCommands#flush_all

使用python-memcached,它看起来像这样:

>>> import memcache
>>> c = memcache.Client(('127.0.0.1:11211',))
>>> c.flush_all()