高效能、分散式、記憶體型 Key-Value 快取系統。特點:簡單協定、多執行緒、LRU 淘汰、無單點故障(客戶端一致性雜湊)。廣泛用於 Wikipedia、YouTube、WordPress 等大型網站。
memcached-1.2.6-win32-bin.zip 解壓memcached.exe -d installmemcached.exe -d start 或服務管理器啟動telnet 127.0.0.1 11211 連線成功顯示版本資訊| 指令 | 格式 | 說明 |
|---|---|---|
| set | set key flags exptime bytes\r\nvalue\r\n | 儲存資料 |
| get | get key\r\n | 讀取資料 |
| add | 同 set | 鍵不存在才儲存 |
| replace | 同 set | 鍵存在才更新 |
| delete | delete key\r\n | 刪除鍵 |
| stats | stats\r\n | 查看統計資訊 |
參數說明:flags 客戶端自定義標記、exptime 過期秒數(0=永久)、bytes 值長度。
原文使用的 com.danga.MemCached 已停止維護。現代專案建議:
<dependency>
<groupId>net.spy</groupId>
<artifactId>spymemcached</artifactId>
<version>2.12.3</version>
</dependency>
// 1. 建立客戶端(單例)
MemcachedClient client = new MemcachedClient(
new BinaryConnectionFactory(),
AddrUtil.getAddresses("localhost:11211")
);
// 2. 設定資料(非同步回傳 Future)
Future<Boolean> setFuture = client.set("user:1001", 3600, new User(1001, "Alice"));
setFuture.get(); // 同步等待結果
// 3. 取得資料
User user = client.get("user:1001");
// 4. 刪除
client.delete("user:1001");
// 5. 關閉(應用關閉時)
client.shutdown();
@Configuration
public class MemcachedConfig {
@Value("${memcached.servers}")
private String servers;
@Bean
public MemcachedClient memcachedClient() throws IOException {
return new MemcachedClient(
new BinaryConnectionFactory(),
AddrUtil.getAddresses(servers)
);
}
}
@Service
@RequiredArgsConstructor
public class CacheService {
private final MemcachedClient client;
public void set(String key, int exp, Object value) {
client.set(key, exp, value);
}
public <T> T get(String key, Class<T> clazz) {
return client.get(key);
}
}
| 主題 | 重點 |
|---|---|
| 一致性雜湊 | 客戶端演算法決定 Key 分佈,伺服器增減只影響少量 Key 遷移 |
| 序列化 | 預設 Java 序列化,建議改用 Kryo/Protobuf/JSON 提升效能與跨語言相容 |
| 壓縮 | 大於閾值(如 1KB)自動 GZIP 壓縮 |
| 故障轉移 | 伺服器失效時自動重新雜湊,配合 failover 設定 |
| 監控指標 | hit rate、evictions、curr_items、bytes、cmd_get/set |
shutdown()Memcached 以極致簡單換取極致效能,是分散式快取的經典選擇。Java 生態中請棄用舊版 danga 客戶端,改用 SpyMemcached 或 XMemcached,並配合 Spring Boot 整合、序列化優化、監控告警,構建生產級快取層。