xmemcached 是一款基於 Java NIO 非阻塞 I/O 實現的高效能 Memcached 客戶端,底層依託自研網路框架 yanf4j,核心代碼不足 1000 行,採用阻塞式 API 設計,兼顧效能與易用性。本文介紹其架構特點、核心協議支援、使用範例與演進規劃。
| 項目 | 說明 |
|---|---|
| 核心架構 | Java NIO + yanf4j 0.52 事件驅動框架 |
| 序列化 | 移植 spymemcached Transcoder 機制 |
| API 模型 | 同步阻塞(非異步 Future 模式) |
| 協議支援 | get/set/add/replace/delete/incr/decr/version |
| 叢集支援 | 0.50-beta 僅單節點,規劃中 |
| 效能特徵 | 簡單類型略遜 spymemcached;大物件(集合)有優勢 |
「xmemcached」中的 x 取自廈門(XM)拼音首字母,作者在此開發維護。
<dependency>
<groupId>net.rubyeye</groupId>
<artifactId>xmemcached</artifactId>
<version>0.5.0</version> <!-- 最新版本請查 Maven Central -->
</dependency>
或下載壓縮包將 xmemcached.jar 及依賴放入 WEB-INF/lib。
package net.rubyeye.xmemcached.test;
import net.rubyeye.xmemcached.XMemcachedClient;
import java.util.*;
public class Example {
public static void main(String[] args) {
try {
String ip = "192.168.222.100";
int port = 11211;
XMemcachedClient client = new XMemcachedClient(ip, port);
// 基本 CRUD
client.set("hello", 0, "dennis"); // 0 = 永不過期
client.add("hello", 0, "dennis"); // 僅不存在時設定
client.replace("hello", 0, "dennis"); // 僅存在時替換
String name = (String) client.get("hello");
System.out.println("get: " + name);
// 批量獲取
List keys = Arrays.asList("hello", "test");
Map map = client.get(keys);
System.out.println("batch size: " + map.size());
// 刪除
client.delete("hello");
// 計數器原子操作
client.incr("counter", 4);
client.decr("counter", 4);
// 版本檢查
System.out.println("server version: " + client.version());
// 自訂物件序列化(需實作 Serializable)
class Name implements Serializable {
String firstName, lastName; int age, money;
public Name(String f, String l, int a, int m) {
firstName=f; lastName=l; age=a; money=m;
}
@Override public String toString() {
return "[" + firstName + " " + lastName + ",age=" + age + ",money=" + money + "]";
}
}
Name dennis = new Name("dennis", "zhuang", 26, -1);
client.set("dennis", 0, dennis);
Name cached = (Name) client.get("dennis");
System.out.println("cached: " + cached);
cached.money = -10000;
client.replace("dennis", 0, cached);
System.out.println("updated: " + client.get("dennis"));
client.delete("dennis");
System.out.println("after delete: " + client.get("dennis"));
client.shutdown(); // 關閉連線池
} catch (Exception e) {
e.printStackTrace();
}
}
}
get()、set() 同步呼叫,內部以 CountDownLatch 或類似機制等待回應,極大降低使用者非同步程式複雜度。shutdown() 優雅釋放資源。gets/cas 協議,實現樂觀鎖與分散式鎖。append/prepend、touch、stats 等管理指令。xmemcached 以精簡代碼實現生產級 Memcached 客戶端,是學習 NIO 網路程式、協議解析與客戶端庫設計的優秀案例,亦適合中小型專案直接採用。