获取memcached中设置的所有键

时间:2013-10-24 07:56:38

标签: get memcached key telnet

如何获取memcached实例中设置的所有密钥?

我尝试使用Google搜索,但除了PHP支持getAllKeys method之外没有找到太多,这意味着实际上可以以某种方式执行此操作。如何在telnet会话中获得相同的内容?

我已经尝试了memcached cheat sheetMemcached telnet command summary中提到的所有与检索相关的选项,但这些选项都不起作用,我无法找到正确的方法来执行此操作。

注意:我目前正在开发中,因此可以假设由于设置了新密钥或其他类似的竞争条件而没有问题,并且密钥的数量也将受到限制。

7 个答案:

答案 0 :(得分:153)

找到一种方法,感谢link here(原始google group discussion here

首先,Telnet到您的服务器:

telnet 127.0.0.1 11211

接下来,列出要获取slab ID的项目:

stats items
STAT items:3:number 1
STAT items:3:age 498
STAT items:22:number 1
STAT items:22:age 498
END

'items'之后的第一个数字是slab id。请求每个slab id的缓存转储,并限制要转储的最大键数:

stats cachedump 3 100
ITEM views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 s]
END

stats cachedump 22 100
ITEM views.decorators.cache.cache_page..8427e [7736 b; 1256056128 s]
END

答案 1 :(得分:52)

memdump

有一个memdump命令(Ubuntu中的memcdumplibmemcached-tools的一部分),例如:

memdump --servers=localhost

将返回所有键。

memcached-tool

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

memcached-tool localhost:11211 dump | less

转储所有键和值。

另见:

答案 2 :(得分:15)

基于此@mu 無回答。我写了一个缓存转储脚本。

该脚本转储memcached服务器的所有内容。它已经使用Ubuntu 12.04和本地主机memcached进行了测试,因此您的milage可能会有所不同。

#!/usr/bin/env bash

echo 'stats items'  \
| nc localhost 11211  \
| grep -oe ':[0-9]*:'  \
| grep -oe '[0-9]*'  \
| sort  \
| uniq  \
| xargs -L1 -I{} bash -c 'echo "stats cachedump {} 1000" | nc localhost 11211'

它做什么,它遍历所有缓存板并打印每个缓存板的1000个条目。

请注意此脚本的某些限制,例如,它可能无法扩展为5GB缓存服务器。但它对于本地计算机上的调试非常有用。

答案 3 :(得分:8)

如果你有PHP&安装了PHP-memcached,可以运行

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'

答案 4 :(得分:6)

重击

要获取Bash中的键列表,请按照以下步骤操作。

首先,定义以下包装器函数以使其易于使用(将其复制并粘贴到外壳中):

function memcmd() {
  exec {memcache}<>/dev/tcp/localhost/11211
  printf "%s\n%s\n" "$*" quit >&${memcache}
  cat <&${memcache}
}

Memcached 1.4.31及更高版本

您可以使用lru_crawler metadump all命令转储(所有)缓存中所有项目的元数据。

  

cachedump相比,它不会引起严重的性能问题,并且对可以转储的密钥数量没有限制。

使用先前定义的功能的示例命令:

memcmd lru_crawler metadump all

请参阅:ReleaseNotes1431


Memcached 1.4.30及以下版本

使用items statistics命令获取平板列表,例如:

memcmd stats items

对于每个slub类,您可以通过指定slub id以及限制编号(0-无限)来获取项目列表:

memcmd stats cachedump 1 0
memcmd stats cachedump 2 0
memcmd stats cachedump 3 0
memcmd stats cachedump 4 0
...

注意:您需要为每个内存缓存服务器执行此操作。

要列出所有存根中的所有密钥,这是一排(每台服务器):

for id in $(memcmd stats items | grep -o ":[0-9]\+:" | tr -d : | sort -nu); do
    memcmd stats cachedump $id 0
done

注意:上面的命令在访问项目时可能会导致严重的性能问题,因此建议不要实时运行。


注意:

  

stats cachedump仅转储HOT_LRU(IIRC?),它在活动发生时由后台线程进行管理。这意味着在启用2Q算法的足够新的版本下,您将仅获得其中一个LRU的快照视图。

     

如果您想查看所有内容,lru_crawler metadump 1(或lru_crawler metadump all)是新的官方支持的新方法,它将异步转储任意数量的键。您将使它们乱序,但会击中所有LRU,除非您删除/替换项目,否则多次运行将产生相同的结果。

来源:GH-405


相关:

答案 5 :(得分:5)

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

keys()方法应该让你前进。

示例 -

<script type="text/javascript">
require(
        {
            baseUrl: '@Url.Content("~/Content/js")',
            waitSeconds: 45,
            paths:
            {
               // dependencies here ex. jquery
            }
     });
</script>

答案 6 :(得分:0)

我使用的是 Java 的 spyMemcached,并使用了此代码。它基于 Anshul Goyal's answer

 if (System.IO.File.Exists(path))
        {
            try
            {
                System.GC.Collect();
                System.GC.WaitForPendingFinalizers();
                System.IO.File.Delete(path);

            }
            catch (Exception e) { }
        }