一、Memcached 核心命令速查
1. 狀態檢查
stats # 服務整體運行狀態
stats items # items 統計
stats slabs # slabs 內存分配狀態(關注性能指標)
stats sizes # 所有 item 大小分佈
2. 存儲操作
set key flags exptime bytes\r\nvalue\r\n # 存值,存在則覆蓋
add key flags exptime bytes\r\nvalue\r\n # 存值,存在則失敗
replace key flags exptime bytes\r\nvalue\r\n # 替換,不存在則失敗
append key flags exptime bytes\r\nvalue\r\n # 尾部追加
prepend key flags exptime bytes\r\nvalue\r\n # 頭部追加
cas key flags exptime bytes casunique\r\nvalue\r\n # 檢查並設置(樂觀鎖)
incr key value # 自增
decr key value # 自減
3. 讀取操作
get key # 獲取單個值
gets key1 key2 # 獲取多個值(返回 cas token)
4. 刪除/清理
delete key # 刪除指定 key
flush_all # 清空所有數據(不釋放內存)
二、三大 Java 客戶端實現對比
| 客戶端 | 特點 | 依賴 | 適用場景 |
| Danga (Memcached-Java-Client) | 最早、最廣泛、運行穩定;基於 Socket 連接池 | commons-pool、slf4j | 傳統項目、穩定性優先 |
| Spymemcached | 異步非阻塞、功能豐富;但單節點故障時數據不會自動重分佈,需修改源碼修復 | spymemcached-2.10.2.jar | 高併發異步場景(需注意故障轉移缺陷) |
| XMemcached | 基於 NIO、性能最優、資源消耗少;原淘寶團隊維護,現託管 GitHub | xmemcached-version.jar | 高性能、大規模生產環境首選 |
三、代碼示例:三客戶端統一 CRUD 操作
1. Danga 客戶端
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(new String[]{"10.90.11.142:11211"});
pool.setInitConn(10); pool.setMinConn(5); pool.setMaxConn(250);
pool.setMaxIdle(1000*60*60*3); pool.setNagle(false);
pool.initialize();
MemCachedClient client = new MemCachedClient();
client.add("aa", "11"); client.set("aa", "22");
System.out.println(client.get("aa")); // 22
client.delete("aa");
2. Spymemcached
MemcachedClient client = new MemcachedClient(new InetSocketAddress("10.90.11.142", 11211));
OperationFuture<Boolean> f = client.add("spy", 0, "spy1");
System.out.println(f.getStatus() + " " + client.get("spy"));
client.set("spy", 0, "spy2");
client.delete("spy");
3. XMemcached
MemcachedClient client = new XMemcachedClient("10.90.11.142", 11211);
client.add("xmemcached", 0, "x1");
client.set("xmemcached", 0, "x2");
client.delete("xmemcached");
四、選型建議
- 新項目/高性能要求 → XMemcached(NIO、線程池隔離、故障自動轉移完善)。
- 維護舊系統、追求穩定兼容 → Danga。
- 需要異步 Future API、且能接受單點故障風險或願意二次開發 → Spymemcached。
五、生產環境優化提示
- 合理設置連接池大小(init/min/max),避免連接洩漏或耗盡。
- 啟用
setAliveCheck(true) 定期探活,剔除失效連接。
- 關鍵業務使用
CAS 實現樂觀鎖,防止併發覆蓋。
- 監控
stats slabs 關注內存碎片率,必要時調整 slab chunk size。