前言
Memcached 是高效能分散式記憶體快取系統。本文涵蓋 .NET 客戶端整合、連接池配置、基本操作封裝、三大容錯策略比較,以及備援叢集架構設計。
基本用法封裝
public User GetUser(int userId)
{
UserInfo user = cacheService.Get("UserInfo:" + userId) as UserInfo;
if (user == null)
{
user = dao.GetUser(userId);
cacheService.Set("UserInfo:" + userId, user);
}
return user;
}
連接池初始化配置
string[] serverlist = { "192.168.1.11:11211", "192.168.1.12:11211", "192.168.1.13:11211" };
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(serverlist);
pool.InitConnections = 3;
pool.MinConnections = 3;
pool.MaxConnections = 5;
pool.SocketConnectTimeout = 1000;
pool.SocketTimeout = 3000;
pool.MaintenanceSleep = 30; // 秒
pool.Failover = true; // 容錯切換
pool.Nagle = false; // 關閉 Nagle 演算法
pool.Initialize();
MemcachedProvider 介面實作
public class MemcachedProvider : ICache
{
private MemcachedClient mc = new MemcachedClient();
public void Set(string key, object o) { mc.Set(key, o); }
public object Get(string key) { return mc.Get(key); }
}
Memcached 關鍵限制
| 限制項目 | 數值 | 應對策略 |
| Key 最大長度 | 250 字元 | Key 設計規範、雜湊縮短 |
| Value 最大大小 | 1 MB | 客戶端分塊、壓縮、外部儲存 |
| 冗餘機制 | 無內建 | 應用層實作備援 (見下文) |
資料分散機制
- Client 端一致性雜湊演算法決定 Key 所屬節點
- 3 台 4GB 節點 ≈ 12GB 可用快取 (視分散均勻度而定)
- 演算法品質直接影響記憶體利用率與熱點分佈

三大節點失效容錯策略
策略一:熱備節點 (Hot Standby)
- 應用程式零修改
- 失效節點 IP 遷移至新啟動的備援節點
- 缺點:切換期間快取不可用、拋出例外、資料庫壓力暴增
策略二:動態移除組態節點
- 修改組態檔移除失效 IP,應用程式重啟生效
- 缺點:需 Application Reset、運維複雜、不適合高可用需求
策略三:專用備援叢集 (推薦)

架構設計
- 主叢集:3 台標準節點,負責正常讀寫
- 備援叢集:1 台高規格節點 (更多記憶體、更強網路),完整鏡像所有快取資料
- 寫入雙寫:同步寫入主叢集 + 非同步寫入備援叢集
- 讀取優先主叢集,失敗回退備援叢集
雙連接池初始化
// 主叢集
SockIOPool pool = SockIOPool.GetInstance("NormalServers");
pool.SetServers(new[] { "192.168.1.11:11211", "192.168.1.12:11211", "192.168.1.13:11211" });
/* 相同配置 */ pool.Initialize();
// 備援叢集
SockIOPool backupPool = SockIOPool.GetInstance("BackupServers");
backupPool.SetServers(new[] { "192.168.1.14:11211" });
/* 相同配置 */ backupPool.Initialize();
雙寫/回退讀取實作
public class MemcachedProvider : ICache
{
private static MemcachedClient GetNormalClient()
{ var mc = new MemcachedClient(); mc.PoolName = "NormalServers"; return mc; }
private static MemcachedClient GetBackupClient()
{ var mc = new MemcachedClient(); mc.PoolName = "BackupServers"; return mc; }
public void Set(string key, object o)
{
try { GetNormalClient().Set(key, o); }
catch { /* 記錄/通知 */ }
try { GetBackupClient().Set(key, o); } // 可改為非同步
catch { /* 記錄/通知 */ }
}
public object Get(string key)
{
object o = null;
try { o = GetNormalClient().Get(key); }
catch { /* 記錄/通知 */ }
if (o != null) return o;
try { o = GetBackupClient().Get(key); }
catch { /* 記錄/通知 */ }
return o;
}
}
策略比較總結
| 策略 | 實作複雜度 | 停機時間 | 資料一致性 | 資源成本 | 推薦場景 |
| 熱備節點 | 低 | 中 (IP 遷移) | 切換期間遺失 | 低 | 非關鍵快取、可容忍短暫失效 |
| 組態移除 | 低 | 長 (需重啟) | 完整 | 低 | 維護窗口充足、非 7x24 |
| 備援叢集 | 中 | 近零 | 強一致 (雙寫) | 高 (額外節點) | 核心業務、高可用、金融/電商 |
作者:cnblogs Aaron
- 上一篇文章: .NET 進階技巧:型別安全的 EventHandlerList 泛型實作
- 下一篇文章: .NET WCF 簡化之道:內部通訊服務工廠 (ICSFactory) 統一服務位置透明化
Copyright ©
程式碼之家 All Rights Reserved