Memcached 不支援 FLUSHDB 單資料庫清空,flush_all 會標記**所有** Slab 中的 Item 為過期,立即生效,但記憶體不會立即釋放(需等待 LRU 淘汰或重啟)。
# 預設 11211 埠 echo "flush_all" | nc localhost 11211 # 輸出: OK
$ telnet 127.0.0.1 11211 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. flush_all OK # 確認統計 stats STAT curr_items 0 STAT bytes 0 ... quit Connection closed by foreign host.
flush_all 僅更新全域時間戳,實際記憶體回收發生在後續 get/set 操作中flush_all 10 可延遲 10 秒執行(緩衝突發流量)pssh 或 Ansible 並行清空叢集所有節點| 需求 | 方案 | 優點 | 缺點 |
|---|---|---|---|
| 清空特定前綴 | SCAN + DELETE 腳本 | 精確控制 | 需遍歷 Key,耗時 |
| 完全釋放記憶體 | 重啟 memcached 服務 | 乾淨徹底 | 服務中斷、冷啟動慢 |
| 熱資料保留 | 改用 Redis + FLUSHDB | 支援多 DB 隔離 | 架構變更成本高 |
<?php
function memcachedFlushAll(string $host = '127.0.0.1', int $port = 11211): bool
{
$fp = @fsockopen($host, $port, $errno, $errstr, 2);
if (!$fp) return false;
fwrite($fp, "flush_all\r\n");
$resp = fgets($fp, 128);
fclose($fp);
return trim($resp) === 'OK';
}
// 批次清空多台
$servers = ['10.0.1.1', '10.0.1.2', '10.0.1.3'];
foreach ($servers as $srv) {
echo "{$srv}: " . (memcachedFlushAll($srv) ? 'OK' : 'FAIL') . "\n";
}