吹吹牛逼先,借我你的20分鐘,保證你在.net中使用memcached緩存數據,暢通無阻,提高數據讀取效率,分擔數據庫壓力,便不在話下。算法
本篇主要說下:memcached分佈式緩存的負載均衡配置比例,數據壓縮,socket的詳細配置等,以及在.net中的經常使用方法。數據庫
memcached是什麼,作什麼的,爲何要使用它,本篇不作介紹,建議百度百科,我看拉下,那裏比我還能吹牛逼,哈哈,上料。c#
下載地址:http://pan.baidu.com/s/1yVILw 提取密碼:5gx9windows
官方網站:http://memcached.org/緩存
下載完成後服務器
一、打開SetupFile安裝文件夾。負載均衡
二、打開cmd命令界面。 不要忘啦去windows服務中把服務啓動了。socket
三、 以上的安裝和啓動都是在默認環境下進行的,在安裝時可設置以下參數: 分佈式
-p 監聽的端口
-l 鏈接的IP地址, 默認是本機
-d start 啓動memcached服務
-d restart 重起memcached服務
-d stop|shutdown 關閉正在運行的memcached服務
-d install 安裝memcached服務
-d uninstall 卸載memcached服務
-u 以的身份運行 (僅在以root運行的時候有效)
-m 最大內存使用,單位MB。默認64MB
-M 內存耗盡時返回錯誤,而不是刪除項
-c 最大同時鏈接數,默認是1024
-f 塊大小增加因子,默認是1.25
-n 最小分配空間,key+value+flags默認是48
-h 顯示幫助ide
四、對這樣你就安裝好啦。下面看咱們怎麼用c#語言操做memcached啦。
五、telnet add 0 1 zlh 0:時間(秒,0表明永遠),1:字節數 ,zlh:value ,flush_all 清空全部數據。
一、下載客戶端的3個dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll
二、跟着我新建一個簡單控制檯應用程序
class AMemcached { public static MemcachedClient cache; static AMemcached() { string[] servers = { "172.18.5.66:11211" }; //初始化池 SockIOPool pool = SockIOPool.GetInstance(); //設置服務器列表 pool.SetServers(servers); //各服務器之間負載均衡的設置比例 pool.SetWeights(new int[] { 1 }); //初始化時建立鏈接數 pool.InitConnections = 3; //最小鏈接數 pool.MinConnections = 3; //最大鏈接數 pool.MaxConnections = 5; //鏈接的最大空閒時間,下面設置爲6個小時(單位ms),超過這個設置時間,鏈接會被釋放掉 pool.MaxIdle = 1000 * 60 * 60 * 6; //socket鏈接的超時時間,下面設置表示不超時(單位ms),即一直保持連接狀態 pool.SocketConnectTimeout = 0; //通信的超市時間,下面設置爲3秒(單位ms),.Net版本沒有實現 pool.SocketTimeout = 1000 * 3; //維護線程的間隔激活時間,下面設置爲30秒(單位s),設置爲0時表示不啓用維護線程 pool.MaintenanceSleep = 30; //設置SocktIO池的故障標誌 pool.Failover = true; //是否對TCP/IP通信使用nalgle算法,.net版本沒有實現 pool.Nagle = false; //socket單次任務的最大時間(單位ms),超過這個時間socket會被強行中端掉,當前任務失敗。 pool.MaxBusy = 1000 * 10; pool.Initialize(); cache = new MemcachedClient(); //是否啓用壓縮數據:若是啓用了壓縮,數據壓縮長於門檻的數據將被儲存在壓縮的形式 cache.EnableCompression = false; //壓縮設置,超過指定大小的都壓縮 //cache.CompressionThreshold = 1024 * 1024; } } class Program { static void Main(string[] args) { //存入key爲a,value爲123的一個緩存 AMemcached.cache.Add("a", "123"); //讀出key爲a的緩存值 var s = AMemcached.cache.Get("a"); //輸出 Console.WriteLine(s); Console.ReadKey(); } }
Note:首先告訴你一個好的消息,memcached就這麼簡單,你已經可以使用啦,若是感興趣,那麼在AMemcached.cache的後面加點,看看這個類庫裏面還有那些關於增刪改查重載的好方法。若是你還想再進一步瞭解,那麼繼續往下看。
一、說說memcached分佈式緩存的設置與應用
string[] servers = { "172.18.5.66:11211", "192.168.10.121:11211" }; //初始化池 SockIOPool pool = SockIOPool.GetInstance(); //設置服務器列表 pool.SetServers(servers); //各服務器之間負載均衡的設置比例 pool.SetWeights(new int[] { 1, 10 });
Note:
一、在172.18.5.66,與192.168.10.121兩臺機器上裝memcached服務端。
二、 pool.SetWeights這裏的1跟10意思是,負載均衡比例,假如11000條數據,大體數據分佈爲:172.18.5.66分佈1000條數據左右。另一臺爲10000條左右。
三、memcached服務端並不具有負載均衡的能力,而是memcachedClient實現的,具體存取數據實現的核心是採用一致性Hash算法,把key-value分佈到某一臺服務器中裏邊。
二、說說memcached的數據壓縮機制
//是否啓用壓縮數據:若是啓用了壓縮,數據壓縮長於門檻的數據將被儲存在壓縮的形式 cache.EnableCompression = false; //壓縮設置,超過指定大小的都壓縮 //cache.CompressionThreshold = 1024 * 1024;
Note:
一、這個處理是在MemcachedClient對象中,設置這個EnableCompression屬性,是否使用壓縮的意思,若是啓用啦壓縮功能 ,則ICSharpCode.SharpZipLib類庫會在數據超過預設大小時,進行數據壓縮處理。
二、CompressionThreshold這個屬性是壓縮的閥值,默認是15K,若是超過設定的閥值則使用memcached的通信協議,存數據時給每一個數據項分配一個16爲的flag表示,用做記錄是否有壓縮,若是有壓縮則提取數據是進行解壓。若是沒有超過閥值則不壓縮,直接存儲。
三、說說怎麼使用客戶端多個SocketIO池
class AMemcached { public MemcachedClient cache; public AMemcached(string poolName) { string[] servers = { "172.18.5.66:11211", "192.168.10.121:11211" }; //初始化池 SockIOPool pool = SockIOPool.GetInstance(poolName); //設置服務器列表 pool.SetServers(servers); //各服務器之間負載均衡的設置比例 pool.SetWeights(new int[] { 1, 10 }); //初始化時建立鏈接數 pool.InitConnections = 3; //最小鏈接數 pool.MinConnections = 3; //最大鏈接數 pool.MaxConnections = 5; //鏈接的最大空閒時間,下面設置爲6個小時(單位ms),超過這個設置時間,鏈接會被釋放掉 pool.MaxIdle = 1000 * 60 * 60 * 6; //socket鏈接的超時時間,下面設置表示不超時(單位ms),即一直保持連接狀態 pool.SocketConnectTimeout = 0; //通信的超時時間,下面設置爲3秒(單位ms),.Net版本沒有實現 pool.SocketTimeout = 1000 * 3; //維護線程的間隔激活時間,下面設置爲30秒(單位s),設置爲0時表示不啓用維護線程 pool.MaintenanceSleep = 30; //設置SocktIO池的故障標誌 pool.Failover = true; //是否對TCP/IP通信使用nalgle算法,.net版本沒有實現 pool.Nagle = false; //socket單次任務的最大時間(單位ms),超過這個時間socket會被強行中端掉,當前任務失敗。 pool.MaxBusy = 1000 * 10; // 初始化一些值並與MemcachedServer段創建鏈接 pool.Initialize(); cache = new MemcachedClient(); //是否啓用壓縮數據:若是啓用了壓縮,數據壓縮長於門檻的數據將被儲存在壓縮的形式 cache.EnableCompression = false; //壓縮設置,超過指定大小的都壓縮 //cache.CompressionThreshold = 1024 * 1024; //指定客戶端訪問的SockIO池 cache.PoolName = poolName; } } class Program { static void Main(string[] args) { //存入key爲a,value爲123的一個緩存 new AMemcached("me").cache.Add("b", 123); //讀出key爲a的緩存值 var s = new AMemcached("me").cache.Get("b"); //輸出 Console.WriteLine(s); Console.ReadKey(); } }
Note:使用SocketIoPool的場景,假如你的系統中用到A,B兩臺機器memcached的緩存數據,而A,B是不相關的,沒有數據互通共享,那麼這個時候你就能夠根據設置poolName來處理讀寫那臺機器。而不用多處,重複配置客戶端的各類參數。
四、說說memcached的故障轉移處理
//設置SocktIO池的故障標誌 pool.Failover = true;
Note:memcached的鼓掌轉移是一套正常節點發生故障變爲死節點時的處理機制。
一、開啓故障轉移:若是發生socket異常,則該節點被添加到存放死節點屬性的_hostDead中,新請求被映射到dead server,檢測嘗試鏈接死節點的時間間隔屬性_hostDeadDuration(默認設置爲100ms),若是沒有達到設定的間隔時間則key會被映射到可用的server處理,若是達到了時間間隔,則嘗試從新連接,鏈接成功將此節點從_hostDead中去除,鏈接失敗則間隔時間翻倍存放,下次從新鏈接時間會被拉長。
二、不開啓故障轉移:新的請求都會被映射到dead server上,嘗試從新創建socket連接,若是鏈接失敗,返回null或者操做失敗。
五、說說key-value中的key與value
一、key在服務端的長度限制爲250個字符,建議使用較短的key但不要重複。
二、value的大小限制爲1mb,若是大拉,可使用壓縮,若是還大,那可能拆分到多個key中。