| 維度 | Whalin (memcached-client) | SpyMemcached |
|---|---|---|
| 項目地址 | https://github.com/gwhalin/memcached-client | https://github.com/couchbase/spymemcached |
| 成熟度 | 早期發布,應用極廣,穩定性驗證充分 | 後起之秀,Couchbase 維護,活躍度高 |
| 架構模型 | 同步阻塞,連接池 SockIOPool | 異步非阻塞,單線程 NIO,Future 模式 |
| 依賴 | 無額外依賴 | 依賴 netty (舊版) / 自帶 NIO |
| Java 版本 | 1.4+ | 1.5+ (利用 java.util.concurrent) |
| 典型用例 | 傳統同步業務、穩定性優先 | 高併發、異步流水線、需吞吐優先 |
// 1. 初始化連接池(單例)
String[] servers = {"192.168.1.20:11211"};
SockIOPool pool = SockIOPool.getInstance();
pool.setServers(servers);
pool.setFailover(true);
pool.setInitConn(10);
pool.setMinConn(5);
pool.setMaxConn(250);
pool.setMaintSleep(30);
pool.setNagle(false);
pool.setSocketTO(3000);
pool.setAliveCheck(true);
pool.initialize();
// 2. 客戶端操作
MemCachedClient client = new MemCachedClient();
// 存取示例
boolean ok = client.set("key", "value", new Date(3600_000)); // 1h 過期
Object val = client.get("key");
client.delete("key");
client.flushAll();
setFailover(true):節點失效自動切換setNagle(false):關閉 Nagle 算法,降低小包延遲setAliveCheck(true):定期檢測節點存活// 1. 創建客戶端(自動連接)
MemcachedClient client = new MemcachedClient(
new InetSocketAddress("192.168.1.20", 11211)
);
// 2. 異步操作返回 Future
Future<Boolean> setFuture = client.set("key", 3600, "value"); // 過期秒數
// 可立即繼續其他邏輯...
if (setFuture.get()) { // 阻塞等待結果
System.out.println("Set success");
}
// 3. 同步獲取(內部仍是異步)
Object val = client.get("key");
// 4. 關閉
client.shutdown();
// 管道化批量寫入:發起所有請求,最後統一等待
List<Future<Boolean>> futures = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
futures.add(client.set("k" + i, 3600, "v" + i));
}
// 此處可做其他事
for (Future<Boolean> f : futures) {
f.get(); // 統一收割結果
}
biz:module:idsetPrimitiveAsString(true) 或自定義 TranscodermaxConn ≈ (CPU 核心數 × 2) + 磁盤數,或壓測得出pool.getBusyThreads() / pool.getIdleThreads()socketTO(建議 3-5s),防止慢查詢佔用連接兩客戶端均內建 Ketama 一致性哈希算法,**只需在配置中列出所有節點**,客戶端自動分片、故障轉移。無需客戶端手動路由。
Whalin 是「穩重的老將」,SpyMemcached 是「銳氣的新貴」。**穩定性優先選 Whalin,極致吞吐選 SpyMemcached**。無論選哪個,序列化策略、鍵設計、連接池調優、監控告警才是決定成敗的關鍵。