memcached安裝及.NET中的Memcached.ClientLibrary使用詳解


序言

吹吹牛逼先,借我你的20分鍾,保證你在.net中使用memcached緩存數據,暢通無阻,提升數據讀取效率,分擔數據庫壓力,便不在話下。

本篇主要說下:memcached分布式緩存的負載均衡配置比例,數據壓縮,socket的詳細配置等,以及在.net中的常用方法。

memcached是什么,做什么的,為什么要使用它,本篇不做介紹,建議百度百科,我看拉下,那里比我還能吹牛逼,哈哈,上料。

memcached在windows下的下載與安裝

下載地址:http://pan.baidu.com/s/1yVILw       提取密碼:5gx9

官方網站:http://memcached.org/

下載完成后

1、打開SetupFile安裝文件夾。

     

2、打開cmd命令界面。           不要忘啦去windows服務中把服務啟動了。

3、 以上的安裝和啟動都是在默認環境下進行的,在安裝時可設置如下參數: 

-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 顯示幫助

4、對這樣你就安裝好啦。下面看我們怎么用c#語言操作memcached啦。

5、telnet   add 0 1 zlh  0:時間(秒,0代表永遠),1:字節數 ,zlh:value ,flush_all 清空所有數據。

先把memcached用起來

1、下載客戶端的3個dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll

2、跟着我新建一個簡單控制台應用程序

 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的后面加點,看看這個類庫里面還有那些關於增刪改查重載的好方法。如果你還想再進一步了解,那么繼續往下看。

細品 .NET Memcached.ClientLibrary 

一、說說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:

1、在172.18.5.66,與192.168.10.121兩台機器上裝memcached服務端。

2、 pool.SetWeights這里的1跟10意思是,負載均衡比例,假如11000條數據,大致數據分布為:172.18.5.66分布1000條數據左右。另外一台為10000條左右。

3、memcached服務端並不具備負載均衡的能力,而是memcachedClient實現的,具體存取數據實現的核心是采用一致性Hash算法,把key-value分布到某一台服務器中里邊。

二、說說memcached的數據壓縮機制

            //是否啟用壓縮數據:如果啟用了壓縮,數據壓縮長於門檻的數據將被儲存在壓縮的形式
            cache.EnableCompression = false;
            //壓縮設置,超過指定大小的都壓縮 
            //cache.CompressionThreshold = 1024 * 1024; 

 

Note:

1、這個處理是在MemcachedClient對象中,設置這個EnableCompression屬性,是否使用壓縮的意思,如果啟用啦壓縮功能 ,則ICSharpCode.SharpZipLib類庫會在數據超過預設大小時,進行數據壓縮處理。

2、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的故障轉移是一套正常節點發生故障變為死節點時的處理機制。

1、開啟故障轉移:如果發生socket異常,則該節點被添加到存放死節點屬性的_hostDead中,新請求被映射到dead server,檢測嘗試連接死節點的時間間隔屬性_hostDeadDuration(默認設置為100ms),如果沒有達到設定的間隔時間則key會被映射到可用的server處理,如果達到了時間間隔,則嘗試重新鏈接,連接成功將此節點從_hostDead中去除,連接失敗則間隔時間翻倍存放,下次重新連接時間會被拉長。

2、不開啟故障轉移:新的請求都會被映射到dead server上,嘗試重新建立socket鏈接,如果連接失敗,返回null或者操作失敗。

五、說說key-value中的key與value

1、key在服務端的長度限制為250個字符,建議使用較短的key但不要重復。

2、value的大小限制為1mb,如果大拉,可以使用壓縮,如果還大,那可能拆分到多個key中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM