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

问题描述 投票:11回答:7

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

也许需要涉及“套接字”模块的更复杂的东西。

python memcached
7个回答
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

13
投票

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

注意:在ubuntu / debian上你可以通过安装libmemcached-tools包来获得它们,它们被称为memcdumpmemccat

转储所有密钥:

memcdump --servers=localhost

转储所有值:

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

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


6
投票

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


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


0
投票

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

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


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

有关:


-4
投票

你正在寻找'flush_all'memcached命令:qazxsw poi

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

http://code.google.com/p/memcached/wiki/NewCommands#flush_all
© www.soinside.com 2019 - 2024. All rights reserved.