memcached 的 cachedump 是否期望是一致的?

Is memcached’s cachedump expected to be consistent?

我在 Stack Overflow 和其他地方读过很多次 stats cachedump 不受支持,即将被删除,仅限于转储 1MB 等。但是,因为我才刚刚开始玩使用 memcached,我发现列出我在开发中设置的所有(很少)键非常方便。

但是,我目前得到的结果非常不一致,几乎没有用。请参阅此示例会话,其中我清除所有内容然后设置三个非常小的项目(为清楚起见添加了空行):

flush_all

set key1 0 0 3
aaa
STORED

set key2 0 0 3
bbb
STORED

set key3 0 0 3
ccc
STORED

然后 stats items 表示 slab 1 中有 3 个项目,正如预期的那样:

stats items
STAT items:1:number 3
STAT items:1:number_hot 0
STAT items:1:number_warm 0
STAT items:1:number_cold 3
STAT items:1:age_hot 0
STAT items:1:age_warm 0
STAT items:1:age 3
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:evicted_time 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
STAT items:1:reclaimed 0
STAT items:1:expired_unfetched 0
STAT items:1:evicted_unfetched 0
STAT items:1:evicted_active 0
STAT items:1:crawler_reclaimed 0
STAT items:1:crawler_items_checked 0
STAT items:1:lrutail_reflocked 57
STAT items:1:moves_to_cold 23
STAT items:1:moves_to_warm 20
STAT items:1:moves_within_lru 0
STAT items:1:direct_reclaims 0
STAT items:1:hits_to_hot 0
STAT items:1:hits_to_warm 0
STAT items:1:hits_to_cold 23
STAT items:1:hits_to_temp 0
END

但是当我尝试列出 slab 1 中的所有项目时,结果完全不一致。通常列出 3 个中的 2 个任意键,但有时会列出所有 3 个(这证明数据都在那里并且没有被驱逐):

stats cachedump 1 0
ITEM key1 [3 b; 0 s]
ITEM key2 [3 b; 0 s]
END

stats cachedump 1 0
ITEM key3 [3 b; 0 s]
ITEM key2 [3 b; 0 s]
END

stats cachedump 1 0
ITEM key2 [3 b; 0 s]
ITEM key1 [3 b; 0 s]
END

stats cachedump 1 0
ITEM key2 [3 b; 0 s]
ITEM key1 [3 b; 0 s]
ITEM key3 [3 b; 0 s]
END

stats cachedump 1 0
ITEM key2 [3 b; 0 s]
ITEM key1 [3 b; 0 s]
ITEM key3 [3 b; 0 s]
END

stats cachedump 1 0
ITEM key2 [3 b; 0 s]
ITEM key3 [3 b; 0 s]
END

这是怎么回事?这是预期的行为吗?

我在 macOS 上使用最新的 memcached 版本 1.5.8。

this GitHub issue 中的回答,在最新版本的 memcached 中转储所有键的正确方法是使用 lru_crawler metadump 1(或 lru_crawler metadump all)。