154

如何获取我的 memcached 实例中设置的所有键?

PHP我尝试了谷歌搜索,但除了支持getAllKeys方法之外没有找到太多,这意味着实际上可以以某种方式做到这一点。如何在 telnet 会话中获得相同的结果?

我已经尝试了memcached 备忘单Memcached telnet 命令摘要中提到的所有与检索相关的选项,但它们都不起作用,我不知道找到正确的方法来做到这一点。

注意:我目前正在开发中这样做,因此可以假设不会由于设置新密钥或发生其他此类竞争条件而出现问题,并且密钥的数量也将受到限制。

4

7 回答 7

206

找到了一种方法,感谢这里的链接(这里有原始的谷歌小组讨论

首先,Telnet到您的服务器:

telnet 127.0.0.1 11211

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

统计项目
统计项目:3:数字 1
统计项目:3:年龄 498
统计项目:22:数字 1
统计项目:22:年龄 498
结尾

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

统计缓存转储 3 100
项目views.decorators.cache.cache_header..cc7d9 [6 b; 1256056128 秒]
结尾

统计缓存转储 22 100
项目views.decorators.cache.cache_page..8427e [7736 b; 1256056128 秒]
结尾

于 2013-10-24T09:34:12.647 回答
77

memdump

有一个memcdump(有时memdump)命令(的一部分libmemcached-tools),例如:

memcdump --servers=localhost

这将返回所有键。


memcached-tool

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

memcached-tool localhost:11211 dump | less

它转储所有键和值。

也可以看看:

于 2016-03-09T13:26:52.580 回答
21
于 2016-08-10T17:48:43.047 回答
17

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

$ php -r '$c = new Memcached(); $c->addServer("localhost", 11211); var_dump( $c->getAllKeys() );'
于 2017-09-11T13:10:26.260 回答
14

重击

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

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

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
...

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

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

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(or lru_crawler metadump all) 是新的大多数官方支持的方法,它将异步转储任意数量的键。你会让它们乱序,但它会影响所有 LRU,除非你删除/替换项目,否则多次运行应该会产生相同的结果。

来源:GH-405


有关的:

于 2018-08-06T13:34:13.623 回答
5

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

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

例子 -

from memcached_stats import MemcachedStats
mem = MemcachedStats()

mem.keys()
['key-1',
 'key-2',
 'key-3',
 ... ]
于 2017-02-07T07:16:51.150 回答
0

我使用的是 Java 的 spyMemcached,并使用了这段代码。它基于Anshul Goyal 的回答

@Autowired
@Qualifier("initMemcachedClient")
private MemcachedClient memcachedClient;

public List<String> getCachedKeys(){
    Set<Integer> slabIds = new HashSet<>();
    Map<SocketAddress, Map<String, String>> stats;
    List<String> keyNames = new ArrayList<>();

    // Gets all the slab IDs
    stats = memcachedClient.getStats("items");
    stats.forEach((socketAddress, value) -> {
        System.out.println("Socket address: "+socketAddress.toString());
        value.forEach((propertyName, propertyValue) -> {
            slabIds.add(Integer.parseInt(propertyName.split(":")[1]));
        });
    });

    // Gets all keys in each slab ID and adds in List keyNames
    slabIds.forEach(slabId -> {
        Map<SocketAddress, Map<String, String>> keyStats = memcachedClient.getStats("cachedump "+slabId+" 0");
        keyStats.forEach((socketAddress, value) -> {
            value.forEach((propertyName, propertyValue) -> {
                keyNames.add(propertyName);
            });
        });
    });

    System.out.println("number of keys: "+keyNames.size());
    return keyNames;
}
于 2021-08-08T06:24:07.467 回答