1. 程式人生 > 實用技巧 >分散式快取Memcached

分散式快取Memcached

1.Memcached簡介

Memcached是一個開源、高效能,將資料分佈於記憶體中並使用key-value儲存結構的快取系統。它通過在記憶體中快取資料來減少向資料庫的頻繁訪問連線的次數,可以提高動態、資料庫驅動之類網站的執行速度。

Memcached在使用是比較簡單的,在操作上基本就類似於操作字典結構的物件一樣。分散式快取Memcached的分散式怎麼理解?簡單來說就是Memcached通過建立一個系統服務和應用系統完全獨立開,兩則不是相同的程序。


2.為什麼需要用到Memcached?

  在搭建伺服器架構時如果使用到了叢集,那麼代理伺服器會根據叢集中伺服器負載均衡分發到一個負載較小的伺服器處理請求。就拿“登入”場景來說,第一次使用者進行登入成功後在A伺服器上將使用者資訊儲存到Session,當用戶第二次請求去載入某個頁面時,由於負載均衡的排程將請求交給了另一臺伺服器C來處理,此時的C伺服器是並不能訪問到A伺服器的Session,那麼一般的程式邏輯會再一次讓你返回登入頁面重新進行登入(引發的問題

對應上述文字描述的參考圖:

  根據上述引發的問題,實際上我們需要達到一個效果是:將我們登入儲存的使用者資訊放置到一個共享區域,也就是叢集中的每個伺服器都能訪問的區域,對於建立這個共享區域,其實就可以通過使用分散式快取Memcached來解決。當然還包括另外一個原因,如果統一將資訊放到Session儲存,對於單機架構的模式的伺服器是很消耗記憶體的。當然也有特殊的手段實現跨伺服器的Seesion訪問,但是也會造成很大的效能損耗,是並不推崇的,所以會通過分散式快取Memcached將應用和快取隔離開作為單獨的服務程序。

  通過使用分散式快取Memcached會將叢集中伺服器的記憶體統一使用起來形成一個獨立的資料共享區域,加入Memcached後架構參考圖如下:

  分散式快取Memcached需要結合伺服器架構的實際情況來使用,如果業務量沒有很大並且本身設計的是單機伺服器架構,那麼其實沒有並要使用分散式快取Memcached,使用Session或者ASP.NET類庫中的Cache來快取資料亦可。

  分散式快取還有一種應用場景:例如像CSDN這樣的大型站點,其中包含下載、論壇、資訊各類子站,這個時候只要在某個子站登入成功,在訪問旗下其他的子站時因為運用了分散式快取技術後,子站之間可以共享使用者資訊則無需再近進行登入。


3.Memcached流程原理簡介


4.Memcached的優勢和不足

優勢:

資料在處理上速度快,操作簡單,開源易擴充套件。

不足:

1.由於資料是儲存在記憶體中,並且具有臨時性不能持久化儲存。如果伺服器宕機或者發生重啟等情況,就會發生資料丟失。同類型的資料庫Redis可以彌補這種現象。

2.在獲取資料上只能侷限於通過鍵讀獲取資料,不支援多元化的查詢方式。


5.Memcached使用說明

5.1.Windows中安裝和配置

1.將memcached安裝目錄解壓到指定目錄(不能包含在中文名稱目錄下),memcached目錄中的檔案結構參考如下:

2.以管理員身份開啟CMD命令列視窗在開啟memcached安裝目錄,輸入:memcached.exe -d install(安裝服務),然後在輸入memcached.exe -d start(啟動服務)。

參考圖:

3.安裝啟動後可以在系統中檢視到對應的服務狀態:

5.2.版本及配置資訊

可以通過在telnet命令列中輸入“stats”檢視memcached版本及配置資訊:

5.3.記憶體分配

Memcached預設記憶體儲存資料的最大容量是64mb,如需修改則在命令列中輸入:

memcached.exe -m 512 -d start

  

5.4.埠配置

Memcached預設的埠是11211,如需修改則在命令列中輸入:

memcached.exe -p 10001 -d start

  

5.5.CMD中操作資料的命令格式

如果需要在CMD中對memcached進行資料的操作則需要遵守下面的命令格式:

command  <key>  <flags>  <expiration time>  <bytes>
<value>

以上格式含義解釋:

Command:具體操作的命令,其中包括:set、add、replace、get、delete;

Key:自定義的查詢標識;

Flags:除了儲存鍵值資料,此處用於儲存額外的資料;

expiration time:資料的有效時間(以秒為單位),0表示永遠;

Bytes:表示儲存的value佔用的位元組數;

Value:儲存的值(在輸入命令格式中必須單獨位於第二行);

5.6.操作例項Set(新增或修改)方法:

1.以管理員身份開啟CMD命令列,並開啟memcached的安裝檔案目錄。然後在命令列輸入:telnet IP 埠號:

進行回車後彈出黑屏視窗說明連線成功:

2.寫入鍵值資料

在空白處進行回車換行輸入操作命令:

set name 0 120 5
Tom

輸入完成後敲擊回車提交,成功後如下:

3.以鍵取值


6.Memcached管理工具TreeNMS

  TreeNMS是由treesoft開發的資料視覺化客戶端工具,可以通過介面方式對memcached資料庫進行管理、維護。該工具不光適用於Memcached還包括其他的NoSql型資料庫如Redis。

  下載地址:http://www.treesoft.cn/dms.html#exam

  在這裡就不提供詳細的說明了,通過下載後文件夾中有一份部署說明,根據裡面的步驟操作即可,系統參考圖:

PS:當通過工具查閱資料的時候可能會看到亂碼,實際上糟程式讀取值的時候不會存在亂碼,請忽略此情況。


7..Net中使用Memcached

  在.Net中使用Memcached進行開發主要依靠的是第三方提供的SDK,使用時將SDK整合到專案中完成一些列的編碼操作。常見SDK有:Enyim.Caching、MemcachedClientLibrary、ServiceStack。下面主要針對最常用的MemcachedClientLibrary來講解程式碼的使用。

使用前必須引用的程式集:

連結:https://pan.baidu.com/s/1Rbe3QhuCefRtg12WZ9GcMw
提取碼:dx6y

DEMO程式碼如下:

 1  class Program
 2     {
 3 
 4 
 5 
 6         static void Main(string[] args)
 7         {
 8  
 9  
10             #region 初始化配置
11             /*
12              *Memcached.ClientLibrary使用初始化,這裡只介紹關鍵的程式碼步驟
13              * 如要自定義配置則自行查閱相關文件進行擴充套件
14              */
15 
16 
17             /*Step1
18              *獲取叢集中所有伺服器IP,Memcached儲存資料時會根據演算法在叢集中選擇一臺進行儲存操作,
19              *叢集中的伺服器部署了Memcached服務,則叢集中多臺伺服器都會各自提供記憶體使用,
20              *從而達到跨伺服器訪問記憶體資料能力
21            */
22             string[] ips = new string[] {  
23                  "192.168.31.12:11211",
24                 "192.168.31.151:11211"           
25             };
26 
27             /*Step2
28              *建立並初始化通訊池,Memcached是基於Socket進行通訊的
29              */
30             string sockIOPoolName = "firstPool";
31             SockIOPool pool = SockIOPool.GetInstance(sockIOPoolName);
32             pool.SetServers(ips);
33             pool.Initialize();
34              
35 
36             /*Step3
37              *建立並初始化客戶端操作物件
38              */
39             MemcachedClient MClient = new MemcachedClient();
40             MClient.PoolName = sockIOPoolName;
41         
42             #endregion
43 
44 
45             #region 資料操作
46             //資料操作
47 
48             /*
49              *新增或修改使用Set方法,因為方法邏輯是:不存在則插入,存在覆蓋更新
50              * 傳參:1:key、2:value、3:到期時間
51              */
52 
53             //儲存單值
54             MClient.Set("name", "Jay", DateTime.Now.AddDays(1));
55 
56             //儲存物件
57             MClient.Set("Car", new Car { ID = 1, Name = "RX8" }, DateTime.Now.AddDays(1));
58 
59             //讀取
60             var uidData = MClient.Get("Car");
61 
62             if (false)
63             {
64                 //刪除資料
65                 MClient.Delete("name");
66                 //清空資料庫
67                 MClient.FlushAll();
68             } 
69             #endregion
70 
71             //基本的操作介紹完畢
72             Console.WriteLine("ok");
73  
74         }  // END Main()
75 
76          
77 
78 
79     }