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

标签 memcached

这仅来自一个具有大约 20M key (无到期)和大约 2G 数据的 memcached 服务器。

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

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

编辑:这是我在我的机器上的玩具 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) ,即使将限制参数设置为 100M,它也只返回 50k 多一点,但是执行 stats items从 telnet 显示超过 500 万个条目。有谁知道为什么会这样?

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

最佳答案

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

你看到这篇文章了吗? "How to Dump Keys from Memcache"作者:拉斯·温道夫

从文章:

Memcache itself provide the means to peak into the data. The protocol provides commands to peak into the data that is organized by slabs (categories of data of a given size range. There are some significant limitations though:

  • You can only dump keys per slab class (keys with roughly the same content size)
  • You can only dump one page per slab class (1MB of data)
  • This is an unofficial feature that might be removed anytime.


实际上,它需要了解 memcache 如何在内存中存储数据(我不需要)。您需要找到每个“slab”,然后您可以转储该slab 的键,最后是这些键的值。

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

关于memcached - 将所有 memcached key 转储到文件中的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13940404/

相关文章:

memcached - 为什么是内存缓存?

c - 每个 udp 数据包有多个或单个请求?

symfony - 如何缓存复杂的计算临时数据

python - memcached 中对象的最佳序列化方法是什么?

python - memcache GAE 中的静态首页

memcached - memcached 服务器重新启动后出现意外行为。如何配置/纠正它?

ruby - 处理 Dalli::RingError - Sinatra 中没有可用的服务器

python - 如果我想在内存缓存中存储一​​个 None 值怎么办?

javascript - 如何在 node.js 中获取所有 memcached 数据?

mysql - 使用Mysql和Windows将常见查询存储在磁盘上