Memcached 是高效能分散式記憶體快取系統,廣泛用於緩解資料庫壓力。本文以 Ubuntu 為例,涵蓋安裝、啟動、Java 客戶端基本操作與監控。
# 安裝
sudo apt-get update && sudo apt-get install memcached
# 啟動參數說明
# -p 端口 (預設 11211)
# -m 記憶體上限 (MB)
# -d 背景守護進程
# -vv 詳細日誌(除錯用)
memcached -p 11211 -m 512 -d
# 測試連線
telnet localhost 11211
# 輸入 stats 查看統計
# 輸入 quit 退出
<dependency>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
<version>2.12.3</version>
</dependency>
import net.spy.memcached.*;
import java.util.concurrent.*;
public class MemcachedClientUtil {
private static final MemcachedClient client;
static {
try {
// 多節點支援
client = new MemcachedClient(
new ConnectionFactoryBuilder()
.setProtocol(ConnectionFactoryBuilder.Protocol.BINARY)
.build(),
AddrUtil.getAddresses("127.0.0.1:11211 192.168.1.10:11211")
);
} catch (IOException e) {
throw new ExceptionInInitializerError("Memcached 初始化失敗: " + e.getMessage());
}
}
public static void set(String key, String value, int expSeconds) {
try {
client.set(key, expSeconds, value).get(2, TimeUnit.SECONDS);
} catch (Exception e) {
throw new RuntimeException("Set 失敗", e);
}
}
public static String get(String key) {
try {
Object val = client.get(key);
return val != null ? val.toString() : null;
} catch (Exception e) {
throw new RuntimeException("Get 失敗", e);
}
}
public static void delete(String key) {
try { client.delete(key).get(); } catch (Exception e) { throw new RuntimeException(e); }
}
public static void shutdown() {
client.shutdown(5, TimeUnit.SECONDS);
}
}
// 寫入,過期 1 小時
MemcachedClientUtil.set("user:1001", "{\"name\":\"Tom\",\"age\":28}", 3600);
// 讀取
String json = MemcachedClientUtil.get("user:1001");
System.out.println(json);
// 刪除
MemcachedClientUtil.delete("user:1001");
# 即時監控 stats
watch "echo stats | nc 127.0.0.1 11211"
# 關鍵指標
# curr_items: 當前項目數
# bytes: 佔用記憶體
# get_hits / get_misses: 命中/未命中
# evictions: 驅逐數(記憶體不足時)
# limit_maxbytes: 最大記憶體限制
setOpTimeout、getOpTimeout,或增加節點分散壓力。user:、order:),設定合理 TTL 避免永久佔用。<bean id="memcachedClient" class="net.spy.memcached.MemcachedClient" destroy-method="shutdown">
<constructor-arg>
<bean class="net.spy.memcached.AddrUtil" factory-method="getAddresses">
<constructor-arg value="${memcached.servers}" />
</bean>
</constructor-arg>
</bean>