上一片講到Memcached在Windows上的安裝,和用Telnet工具進(jìn)行命令操作,在稍微了解了原理之后,我也就開始嘗試著用程序來對(duì)Memcached進(jìn)行操作。這一篇分為兩個(gè)部分,第一部分是用.net程序?qū)emcached進(jìn)行操作,第二部分是結(jié)合mvc實(shí)現(xiàn)一個(gè)分布式的緩存系統(tǒng)。

一、.net程序?qū)emcached進(jìn)行操作

  想要用.net操作Memcached,首先我們的去下載.NET客戶端類庫:https://sourceforge.net/projects/memcacheddotnet,下載完成之后,會(huì)發(fā)現(xiàn)里面有一些Demo,而需要引用的程序集就只有ICSharpCode.SharpZipLib.dll,Memcached.ClientLibrary.dll,log4net.dll(可有可無)。

  seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

   seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

   上圖就是創(chuàng)建了一個(gè)控制臺(tái)應(yīng)用程序,將這三個(gè)程序集引入項(xiàng)目。之后,將Memcached服務(wù)打開。再之后,就是代碼?! ?/span>

  

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

            string[] serverlist = { "127.0.0.1:11211" };
            SockIOPool sock = SockIOPool.GetInstance();   
            sock.SetServers(serverlist);//添加服務(wù)器列表 
            sock.InitConnections = 5;//設(shè)置連接池初始數(shù)目
            sock.MinConnections = 3;//設(shè)置最小連接數(shù)目
            sock.MaxConnections = 6;//設(shè)置最大連接數(shù)目
            sock.SocketTimeout = 3000;//設(shè)置套接字超時(shí)讀取      
            sock.MaintenanceSleep = 30; //設(shè)置維護(hù)線程運(yùn)行的睡眠時(shí)間。如果設(shè)置為0,那么維護(hù)線程將不會(huì)啟動(dòng);
            sock.Failover = true;      //獲取或設(shè)置池的故障標(biāo)志。           
            sock.MaxBusy = 1000 * 10;  //socket單次任務(wù)的最大時(shí)間(單位ms),超過這個(gè)時(shí)間socket會(huì)被強(qiáng)行中斷,當(dāng)前任務(wù)失敗            sock.Initialize();

            MemcachedClient mc = new MemcachedClient();            //清除所有的緩存數(shù)據(jù)            mc.FlushAll();           
            //增加
            mc.Add("k","hello");            //增加一個(gè)鍵k1,值是hello1,有效時(shí)間是30s
            mc.Add("k1", "hello1", DateTime.Now.AddSeconds(30));            // 將k的值重新設(shè)置為123  ,用set時(shí),假如鍵存在,就直接修改,鍵不存在,就直接創(chuàng)建,再賦值
            mc.Set("k","123");            //將k的值重置為456 , 用Replace時(shí),假如鍵存在,就直接修改,鍵不存在,報(bào)錯(cuò)
            mc.Replace("k", "456");            //刪除
            mc.Delete("k");

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

 

  到這里,我們用程序操作Memcached已經(jīng)成功,我們程序運(yùn)行完成之后,可以用telnet鏈接,看看數(shù)據(jù)是否加載進(jìn)去了。這個(gè)比較簡單,下面看個(gè)復(fù)雜點(diǎn)的。

二、Memcache+cookie實(shí)現(xiàn)模擬session

  1.session的使用原理

  以前在開發(fā)系統(tǒng)中,像用戶這些基本信息,是直接保存在session中的,原理就是如下圖所示,用戶第一次訪問時(shí),服務(wù)器創(chuàng)建session,并把sessionid寫回瀏覽器的cookie中,之后,瀏覽器每次訪問服務(wù)器時(shí),就把這個(gè)sessionid一同和其他數(shù)據(jù)發(fā)送到服務(wù)器端,這樣就解決了Http協(xié)議是無狀態(tài)鏈接這個(gè)問題了。簡單原理就是這樣,更加詳細(xì)的session介紹詳見http://www.cnblogs.com/lyzg/p/6067766.html(圖也是人家的*-*)。

  seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

  2.Memcache+cookie代替session

  總的來說,session也不是完美的,會(huì)有易丟失,耗資源,單臺(tái)服務(wù)器時(shí)還好,一遇到集群,就有點(diǎn)尷尬了,所以現(xiàn)在就模擬一下這個(gè)情況。這個(gè)例子的整體結(jié)構(gòu)是這樣子,搭建兩個(gè)web服務(wù)器,同樣也搭建兩個(gè)Memcached服務(wù)器,好吧,雙集群。

  1-6這個(gè)過程是,當(dāng)用戶從web1站點(diǎn)登陸,先去查詢Memcached集群里是否有用戶信息,這個(gè)肯定沒有,之后就去數(shù)據(jù)庫查,查到之后,就把用戶的信息給存到Memcached中,具體存到哪個(gè),這個(gè)先不做談?wù)摗?/span>

  7-10過程,用戶通過web2站點(diǎn) 訪問數(shù)據(jù),先去Memcached集群里查是否有信息(這個(gè)如何查的也先不做談?wù)摚?,查到后,就直接把信息返回?/span>

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

  接下來,我們就新建項(xiàng)目,添加引用,項(xiàng)目的結(jié)構(gòu)如圖所示,一個(gè)mvc4的框架,數(shù)據(jù)庫鏈接用的是dapper。項(xiàng)目用了過濾器,寫在BaseController里面,并且在Global.asax文件里要進(jìn)行注冊(cè),其中UserLoginController沒有繼承BaseController,HomeController繼承了BaseController。

  seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

 

  重要的代碼有兩段,一段就是登陸時(shí)候成功后,用guid生成隨機(jī)數(shù),將這個(gè)隨機(jī)數(shù)作為seeionid寫到瀏覽器的cookie中,同時(shí)把該用戶的信息,sessionid這些信息存到Memcached中。

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

    sql =  ( conn =  loginUser1 = conn.QueryFirstOrDefault<UserInfo>(sql,   { UName = user.UName, UPwd = loginUser = SqlMapper.QueryFirstOrDefault<UserInfo>(conn,sql,   { UName = user.UName, UPwd = (loginUser ==  Content(= Guid.NewGuid();
                    Response.Cookies[].Value =
                    MemcacheHelper.Set(sessionId.ToString(), loginUser, DateTime.Now.AddMinutes( Content(

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

   而另一段比較重要的代碼就寫在過濾器里,根據(jù)瀏覽器發(fā)過來的sessionid來去memcache中查詢數(shù)據(jù),查到的話,表示校驗(yàn)成功,否則跳轉(zhuǎn)回登陸界面。

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

 
 protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {            base.OnActionExecuting(filterContext);            //從cookie中獲取咱們的 登錄的sessionId
            string sessionId = Request["sessionId"];            //如果sessionid為空值,則跳轉(zhuǎn)到登錄頁面
            if (string.IsNullOrEmpty(sessionId))
            {                //return RedirectToAction("Login", "Logon");
                Response.Redirect("/UserLogin/Index");                return;
            }            object obj = MemcacheHelper.Get(sessionId);
            UserInfo user = obj as UserInfo;            if (user == null)
            {                 //用戶長時(shí)間不操作,。超時(shí)。
                Response.Redirect("/UserLogin/Index");
            }

            LoginUser = user;            //實(shí)現(xiàn)session的滑動(dòng)機(jī)制
            MemcacheHelper.Set(sessionId, user, DateTime.Now.AddMinutes(20));
}

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

 關(guān)于memcached集群的配置很簡單,寫在MemcacheHelper中,只需要將Memcache的服務(wù)地址寫進(jìn)去就行,以逗號(hào)分開,之后再設(shè)置一下權(quán)重就好了。

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

   //通過客戶端來進(jìn)行memcached的集群配置,在插入數(shù)據(jù)的時(shí)候,使用一致性哈希算法,將對(duì)應(yīng)的value值存入Memcached
            String[] serverlist = { "127.0.0.1:11211" , "127.0.0.1:11212" };            // 初始化Memcached的服務(wù)池
            SockIOPool pool = SockIOPool.GetInstance("test");            //設(shè)置服務(wù)器列表            pool.SetServers(serverlist);            //各服務(wù)器之間負(fù)載均衡的設(shè)置比例
            pool.SetWeights(new int[] { 1 });
            pool.Initialize();            //創(chuàng)建一個(gè)Memcached的客戶端對(duì)象
            mc = new MemcachedClient();
            mc.PoolName = "test";            //是否啟用壓縮數(shù)據(jù):如果啟用了壓縮,數(shù)據(jù)壓縮長于門檻的數(shù)據(jù)將被儲(chǔ)存在壓縮的形式
            mc.EnableCompression = false;

seo優(yōu)化培訓(xùn),網(wǎng)絡(luò)推廣培訓(xùn),網(wǎng)絡(luò)營銷培訓(xùn),SEM培訓(xùn),網(wǎng)絡(luò)優(yōu)化,在線營銷培訓(xùn)

  之后,將網(wǎng)站發(fā)布到iis上的不同的端口號(hào)上就行了。要是想有調(diào)試效果, 直接將項(xiàng)目復(fù)制兩份,其中一個(gè)端口號(hào)改下,啟動(dòng)就好了。

最后發(fā)現(xiàn),當(dāng)?shù)顷懸粋€(gè)網(wǎng)站成功后,我們?cè)偃ピL問另一個(gè)網(wǎng)站(不要換瀏覽器,cookie),發(fā)現(xiàn)也能直接訪問了。

  這樣一個(gè)關(guān)于memcached的分布式緩存系統(tǒng)就完成了,再寫的過程,又是知識(shí)加深的過程,書常讀常新,加油??。

代碼地址

碼云:http://git.oschina.net/sdadx/leiku/tree/master/WebMemcache

 

 

參考:1.memcached安裝及.NET中的Memcached.ClientLibrary使用詳解 

   2.使用緩存的9大誤區(qū)(上)

     3.3種web會(huì)話管理的方式

          4.memcached全面剖析–4. memcached的分布式算法

          5.ASP.Net MVC4+Memcached+CodeFirst實(shí)現(xiàn)分布式緩存

http://www.cnblogs.com/sdadx/p/7217350.html