首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Memcached 學習實戰(二):常用命令速查 + 三大 Java 客戶端(Danga/Spy/XMemcached)深度對比

     編輯:Java 綜合教學

Memcached 學習實戰(二):常用命令速查 + 三大 Java 客戶端深度對比

Memcached 以簡單、高性能、純內存著稱,协议极简。本文整理生產常用命令,並深度對比三大主流 Java 客戶端:Danga (最早/最廣)、SpyMemcached (異步/未來)、XMemcached (NIO/高性能),給出選型建議。

一、Memcached 核心命令速查(Telnet 直連測試)

# 連接
telnet 127.0.0.1 11211

# 1. 狀態監控
stats                 # 總體統計(命中率、連接數、內存用量)
stats items           # 每個 slab 的 item 統計
stats slabs           # slab 內存分配詳情(關注 chunk 大小、利用率)
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 cas_unique\r\nvalue\r\n # 檢查並設置(樂觀鎖)
incr key value      # 數值自增
decr key value      # 數值自減

# 3. 獲取命令
get key             # 獲取單個
gets key1 key2      # 獲取多個(返回 CAS token)

# 4. 刪除/清理
delete key          # 刪除單個
flush_all           # 清空所有數據(不釋放內存,僅標記過期)

關鍵參數: flags 用戶自定義標識(如標記壓縮/序列化方式),exptime 過期時間(Unix 時間戳或相對秒數,0=永不過期),bytes 值長度。

二、三大 Java 客戶端深度對比

1. Danga (memcached-client for Java) —— 經典穩健派

  • 地位:最早、應用最廣、運行最穩定
  • 依賴:commons-pool、slf4j
  • 特點:同步阻塞 IO,連接池管理完善(SockIOPool),支持一致性哈希、故障轉移、權重分配
  • 代碼風格:傳統同步 API,client.set/get/add/delete
  • 適用:傳統同步業務、追求極致穩定、團隊熟悉舊代碼庫
// 核心配置
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(new String[]{"10.90.11.142:11211", "10.90.11.142:11212"});
pool.setFailover(true); pool.setInitConn(10); pool.setMinConn(5); pool.setMaxConn(250);
pool.setMaxIdle(1000*60*60*3); pool.setNagle(false); pool.setSocketTO(3000);
pool.setAliveCheck(true); pool.initialize();

MemCachedClient client = new MemCachedClient();
client.add("key", "value"); // 同步阻塞

2. SpyMemcached —— 異步未來派(但有坑)

  • 特點:基於 NIO 異步操作,API 返回 OperationFuture,支持 get() 同步阻塞或異步回調
  • 致命缺陷:節點故障時數據不會自動重新哈希到新節點,直接失敗(需修改源碼修復,見參考鏈接),生產環境極不推薦
  • 依賴:spymemcached-2.10.2.jar
MemcachedClient client = new MemcachedClient(new InetSocketAddress("10.90.11.142", 11211));
OperationFuture future = client.add("spy", 0, "value");
future.get(); // 同步等待結果
// 異步回調風格
future = client.set("spy", 0, "newVal");

3. XMemcached —— NIO 高性能正統派(推薦新項目)

  • 血統:原淘寶大神開發,託管 GitHub,基於 NIO 實現,性能好、效率高、資源耗費少
  • API:同步阻塞風格(內部異步),MemcachedClient 接口,XMemcachedClient 實現
  • 特性:完善的故障轉移、一致性哈希、心跳檢測、動態增減節點
  • 依賴:xmemcached-x.x.x.jar(無額外依賴)
MemcachedClient client = new XMemcachedClient("10.90.11.142", 11211);
client.add("key", 0, "value"); // 同步調用
client.set("key", 0, "newValue");
String val = client.get("key");
client.delete("key");

三、選型建議

場景推薦客戶端理由
老項目維護、追求零風險穩定Danga經過無數生產驗證,社區成熟
新項目、高并發、追求性能與現代架構XMemcachedNIO 異步底層、同步 API、無 Spy 故障轉移 Bug、淘寶血統
需要異步非阻塞 API、Future/回調風格SpyMemcached (需修復故障轉移)真正的異步 API,但必須解決單點故障數據丟失問題

四、生產級最佳實踐

  • Key 設計:業務前綴 + 唯一標識,如 user:10001:profile,便於分類管理與過期清理
  • 序列化:對象存儲建議用 JSON (Jackson/Gson) 或 Protobuf,避免 Java 序列化跨語言/版本兼容性問題
  • 防穿透/雪崩:空值緩存(短期)、互斥鎖重建、多級緩存(本地 Caffeine + 遠程 Memcached)
  • 監控指標:命中率 (>90%)、平均延遲 (<5ms)、連接池使用率、evictions 數

總結

Memcached 协议簡單,命令記住增刪改查 + 統計即可。Java 客戶端選型:老項目用 Danga,新項目首選 XMemcached,避開 SpyMemcached 故障轉移坑。配合合理的 Key 設計、序列化、防穿透策略,發揮純內存 KV 極致性能。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved