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

基於 Java NIO 的 Memcached 客戶端:xmemcached 詳解

     編輯:Java 相關知識

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)拼音首字母,作者在此開發維護。

三、快速開始

Maven 依賴

<dependency>
    <groupId>net.rubyeye</groupId>
    <artifactId>xmemcached</artifactId>
    <version>0.5.0</version> <!-- 最新版本請查 Maven Central -->
</dependency>

或下載壓縮包將 xmemcached.jar 及依賴放入 WEB-INF/lib。

核心 API 範例

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();
        }
    }
}

四、架構亮點分析

  • NIO 事件迴圈:單執行緒 Reactor 模式處理所有連線,避免傳統 BIO 每連線一執行緒的擴展性瓶頸。
  • 阻塞式 API 封裝:底層非阻塞,上層提供 get()、set() 同步呼叫,內部以 CountDownLatch 或類似機制等待回應,極大降低使用者非同步程式複雜度。
  • 連線池管理:內建連線復用與心跳保活,shutdown() 優雅釋放資源。
  • 擴展性預留:協議編解碼、序列化、節點選擇策略均介面化,便於後續叢集支援擴展。

五、演進路線圖

  1. 多節點/叢集支援:一致性哈希分佈、故障轉移、動態節點發現。
  2. 效能優化與重構:零拷貝緩衝區、管線化批次指令、壓縮傳輸選項。
  3. CAS 原子操作:支援 gets/cas 協議,實現樂觀鎖與分散式鎖。
  4. 更多協議:append/prepend、touch、stats 等管理指令。

六、專案資源

xmemcached 以精簡代碼實現生產級 Memcached 客戶端,是學習 NIO 網路程式、協議解析與客戶端庫設計的優秀案例,亦適合中小型專案直接採用。

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