我想使用python-memcache从memcached服务器导出所有键和值。 该模块中没有这样的功能。怎么办呢?
可能需要涉及“套接字”模块的更复杂的事情。
答案 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套件中的memcat和libmemcached实用程序。他们无法保证您能获得所有数据,但它们很容易使用。
注意:在ubuntu / debian上,您可以通过安装libmemcached-tools
包来获取这些内容,并将其称为memcdump
和memccat
。
转储所有密钥:
memcdump --servers=localhost
转储所有值:
memccat --servers=localhost `memcdump --servers=localhost`
当然你还需要匹配键和值 - 我建议将密钥转储到文件中,然后使用它作为memcat
的输入(这可以确保一致性)。然后当然你需要拆分值 - 一个句号是我认为的分隔符 - 然后顺序配对键和值。那里可能有一个脚本......
答案 2 :(得分:6)
没有办法做到这一点。 Memcache protocol没有定义迭代键的任何命令。您必须知道检索值的关键。
答案 3 :(得分:0)
正如许多地方的其他人所提到的,在一般情况下,无法列出存储在memcached实例中的所有密钥。例如,Memcached: List all keys,Couldn'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()