【问题标题】:How to export all keys and values from memcached with python-memcache?如何使用 python-memcache 从 memcached 中导出所有键和值?
【发布时间】:2011-08-09 11:20:15
【问题描述】:

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

也许需要一些涉及“socket”模块的更复杂的东西。

【问题讨论】:

    标签: python memcached


    【解决方案1】:

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

    【讨论】:

    • 一位同事在“t.write('stats cachedump...”行获得“格式中的零长度字段名称”。可能对于早期版本的 Python,您需要“stats cachedump {0} 200000"。
    • 它适用于本地服务器在生产环境中它不可用,因为它变得太慢(你可以等待很多分钟)
    【解决方案2】:

    使用libmemcached 套件中的memdumpmemcat 实用程序。他们不能保证你会得到所有的数据,但它们很容易使用。

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

    转储所有密钥:

    memcdump --servers=localhost
    

    转储所有值:

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

    当然,您仍然必须匹配键和值 - 我建议将键转储到文件中,然后将其用作memcat 的输入(这样可以确保一致性)。然后当然你需要拆分值 - 我相信一个句号是分隔符 - 然后按顺序配对键和值。那里可能有一个脚本......

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 不过,通过 telnet,您可以运行“stat items”,然后运行“stats cachedump” 太糟糕了,python-memcache 中不存在这些函数
    • @Falken:是的,但这并没有为您提供有关单个项目的信息,只是汇总的统计信息。
    • @Falken: 至于“cachedump”,它不保证能正常工作,它只用于调试,返回限制为1MB
    【解决方案4】:

    正如其他人在许多地方提到的,在一般情况下,没有办法列出存储在 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

    【讨论】:

      【解决方案5】:

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

      keys() 方法应该可以帮助您。

      【讨论】:

      • 使用 Python3.8 失败并在 from memcached_stats import MemcachedStats 出现错误。很遗憾,因为我想要一种 Pythonic 的方式来做到这一点。
      • 以上不支持python3+,欢迎fork更新或提PR!
      • 好的,当我完成将你的代码移植到 Python3 后,我会回到这里并对此进行投票:)。
      【解决方案6】:

      在 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)。

      相关:

      【讨论】:

        【解决方案7】:

        您正在寻找“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()
        

        【讨论】:

        • 我认为他的意思是“导出列表”中的“转储”而不是“摆脱”中的“转储”。
        • 当然,我的英语可能有点差,我的意思是“导出列表”:D
        • 这不应该被否决 - 这是对问题的回答
        • 问题已得到纠正,所以说“我想导出所有键和值”;这最终成为当前形式的误导性答案
        猜你喜欢
        • 2012-06-25
        • 2010-12-09
        • 2020-05-08
        • 1970-01-01
        • 1970-01-01
        • 2021-01-21
        • 2013-01-10
        • 2011-08-09
        • 2015-04-09
        相关资源
        最近更新 更多