将所有memcached密钥转储到文件中的最简单方法是什么?

时间:2012-12-18 19:49:22

标签: memcached

这只来自一个拥有大约20M密钥(没有过期)和大约2G数据的memcached服务器。

将所有键/值对转储到平面文件中的最简单方法是什么?我首先查看了java net.spy.memcached.MemcachedClient,但是这个客户端不支持获取所有密钥(我认为)。如果我有一个所有键的列表(我没有),我可以轻松地使用此客户端获取所有值。

我知道我可以使用一些telnet命令获取所有密钥(例如,telnet localhost 11211; stats items; stats cachedump),但我不清楚如何自动执行此操作。

编辑:这是我在机器上的玩具memcached服务器上做的工作。它似乎工作,但我只在memcached中放了两个键,所以希望这个方法可以扩展好:

shell命令:

sudo yum install memcached
sudo /etc/init.d/memcached restart # maybe unnecessary
sudo yum install php
sudo yum install php-pecl-memcache
sudo service httpd reload

php脚本,基于this

<?php
$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211) or die ("Could not connect");
$list = array();
$allSlabs = $memcache->getExtendedStats('slabs');
$items = $memcache->getExtendedStats('items');
foreach($allSlabs as $server => $slabs) {
    foreach($slabs AS $slabId => $slabMeta) {
        if (!is_int($slabId)) {
            continue;
        }
        $cdump = $memcache->getExtendedStats('cachedump', (int) $slabId, 100000000);
        foreach($cdump AS $server => $entries) {
            if ($entries) {
                foreach($entries AS $eName => $eData) {
                    print_r($eName);
                    print_r(":");
                    $val = $memcache->get($eName);
                    print_r($val);
                    print_r("\n");
                }
            }
        }
    }
}
?>

EDIT2:上面的脚本似乎没有返回所有映射。如果我插入行count($entries),它只返回略高于50k,即使limit参数设置为100M,但从telnet执行stats items显示超过500万条目。有谁知道为什么会这样?

EDIT3:这个link表明cachedump没有从memcached获取所有密钥。我已经达到了大约50k键的限制,这些键由cachedump,这个PHP脚本或类似于Zach Bonham提供的链接中的perl脚本返回。有没有办法解决这个问题?

5 个答案:

答案 0 :(得分:13)

免责声明:我不知道我在做什么,听起来像是一个有趣的问题。

你看到这篇文章了吗? Lars Windolf "How to Dump Keys from Memcache"

来自文章:

  

Memcache本身提供了进入数据峰值的方法。协议   提供命令以达到由slabs组织的数据的峰值   (给定大小范围的数据类别。有一些重要的   但是有限制:

     
      
  • 每个slab类只能转储键(内容大小大致相同的键)
  •   
  • 每个slab类只能转储一页(1MB数据)
  •   
  • 这是一个非官方的功能,可能会随时删除。
  •   

实际上,它需要一些关于memcache如何将数据存储在内存中的知识(我不知道)。你需要找到每个'slab',然后你可以转储该slab的键,最后是这些键的值。

本文中有一个工具部分,它使用各种语言至少转储密钥,但只有perl脚本转储密钥和值。

答案 1 :(得分:4)

memccat

以下是我用来将所有对象转储到相应文件中的脚本:

while read -r key; do
    [ -f "$key" ] || echo "get $key" | nc localhost 11211 > "$key.dump";
done < <(memcdump --server localhost)

它使用memcdump命令,该命令应该是memcached utils的一部分。

对于压缩对象,请参阅:How to dump a compressed object for given key from Memcache?

memcdump

要从服务器转储密钥列表,请使用memcdump / memdump工具,例如

memcdump --servers=localhost | tee my_keys.lst

要打印一个项目的值,请使用netcat

echo "get 13456_-cache-some_object" | nc localhost 11211

通过memcdump / memdumpnetcat将所有对象转储到屏幕中:

memcdump --servers=localhost | xargs -L1 -I% sh -c 'echo "get %" | nc localhost 11211'

分布式缓存的工具

memcached的最新版本中,还有 memcached-tool 命令,例如。

memcached-tool localhost:11211 dump | less # dumps keys and values

答案 2 :(得分:3)

对于平板的转储,存在2MB的硬编码限制。除非你重写do_item_cachedump,否则你将无法获得所有密钥。

答案 3 :(得分:2)

我使用了这个bash脚本

#!/bin/sh
MESSAGE=`memdump --servers="127.0.0.1"`
while read -r line; do
    echo $line
    VALUE=`echo "get $line" | nc 127.0.0.1 11211`
    echo $VALUE
done <<< "$MESSAGE"

如有必要,只需更换IP /端口

答案 4 :(得分:0)

重击

使用Bash并保存到文件中

exec {memcache}<>/dev/tcp/localhost/11211
printf "stats items\nquit\n" >&${memcache}
cat <&${memcache} > myfile.txt

相关:Writing a Redis client in pure bash(这是Redis,但非常相似)