【发布时间】:2011-08-09 11:20:15
【问题描述】:
我想使用 python-memcache 从 memcached 服务器导出所有键和值。 该模块中没有这样的功能。那怎么办呢?
也许需要一些涉及“socket”模块的更复杂的东西。
【问题讨论】:
我想使用 python-memcache 从 memcached 服务器导出所有键和值。 该模块中没有这样的功能。那怎么办呢?
也许需要一些涉及“socket”模块的更复杂的东西。
【问题讨论】:
这将为您获取 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
【讨论】:
使用libmemcached 套件中的memdump 和memcat 实用程序。他们不能保证你会得到所有的数据,但它们很容易使用。
注意:在 ubuntu/debian 上,您可以通过安装 libmemcached-tools 包来获得它们,它们被称为 memcdump 和 memccat。
转储所有密钥:
memcdump --servers=localhost
转储所有值:
memccat --servers=localhost `memcdump --servers=localhost`
当然,您仍然必须匹配键和值 - 我建议将键转储到文件中,然后将其用作memcat 的输入(这样可以确保一致性)。然后当然你需要拆分值 - 我相信一个句号是分隔符 - 然后按顺序配对键和值。那里可能有一个脚本......
【讨论】:
没有办法做到这一点。 Memcache protocol 没有定义任何命令来迭代键。您必须知道检索值的键。
【讨论】:
正如其他人在许多地方提到的,在一般情况下,没有办法列出存储在 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
【讨论】:
最简单的方法是使用 python-memcached-stats 包,https://github.com/abstatic/python-memcached-stats
keys() 方法应该可以帮助您。
【讨论】:
from memcached_stats import MemcachedStats 出现错误。很遗憾,因为我想要一种 Pythonic 的方式来做到这一点。
在 Bash 中,此脚本可能会有所帮助:
while read -r key; do
memccat --servers=localhost $key > "$key.dump";
done < <(memcdump --server localhost)
除了memccat,您还可以直接连接到端口并发送get SOME-KEY 命令(使用Netcat 的示例:echo "get $key" | nc localhost 11211)。
相关:
【讨论】:
您正在寻找“flush_all”内存缓存命令: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()
【讨论】: