首頁  >  文章  >  後端開發  >  高效能快取系統(Memcached)的實例介紹

高效能快取系統(Memcached)的實例介紹

零下一度
零下一度原創
2017-06-23 15:05:222067瀏覽

在Memcached中實體類型未經序列化不能在Memcached中緩存,因此需要對實體類別進行處理,才能緩存下來.

Memcached是一個高效能的分散式記憶體物件快取系統,用於動態Web應用以減輕資料庫負載。它透過在記憶體中快取資料和物件來減少讀取資料庫的次數,從而提高動態、資料庫驅動網站的速度。 Memcached基於一個儲存鍵/值對的hashmap。其守護程式(daemon )是用C寫的,但是客戶端可以用任何語言來編寫,並透過memcached協定與守護程式通訊。

我們可以使用Memcached快取string類型等已經內部實作了序列化的類型,但是對於我們自訂的類型,我們並不能在Memcached中快取下來,因為Memcached只能快取序列化之後的數據,因此,在這裡我們將自訂的實體類型序列化一下就可以在Memcached中儲存了。

先下載windows平台下的memcached,然後安裝。安裝完之後就是啟動memcached服務了,你可以在cmd下用dos指令輸入,也可以在電腦管理->服務->memcached->啟動.來開啟服務.

#然後就是在專案中引入相關dll:
Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll
在專案的引用中引入Memcached.ClientLibrary.dll

##接著是編寫程式了,在這裡建立一個MVC程式:

在Models資料夾中建立一個類別:

[Serializable]
public class VIP
{
public string UserName { get; set; }

public int? Vip { get; set; }

public DateTime? VipEndDate { get; set; }

public string Mail { get; set; }

public string QQ { get; set; }
}
#若沒有標註為可序列化,則後續執行程式將會報錯誤。

接著建立一個MemcachedHelper類別來輔助程式設計.

public class MemcachedHelper
{
public static MemcachedClient mclient;

static MemcachedHelper()
{
string[] serverlist = new string[] { "127.0.0.1:11211" };

SockIOPool pool = SockIOPool.GetInstance("First");
pool.SetServers(serverlist);
pool.Initialize();
mclient = new MemcachedClient();
mclient.PoolName = "First";
mclient.EnableCompression = false;
}

public static bool set(string key, object value, DateTime expiry)
{
return mclient.Set(key, value, expiry);
}

public static object Get(string key)
{
return mclient.Get(key);
}

}
最後就是Controller裡面的具體實作:

public class EntityMemcachedController : Controller
    {
        //
        // GET: /EntityMemcached/
        /// <summary>
        /// 序列化实体类为字节数组,将其存储到Memcached中,以缓存数据,从而减轻访问压力....
        /// </summary>
        /// <returns></returns>
        public ActionResult Index()
        {
            var vipInfo = new List<VIP>{
                new VIP{ UserName="张三", Vip=1, QQ="3123456", Mail="3123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(1) },
                new VIP{ UserName="李四", Vip=1, QQ="4123456", Mail="4123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(2) },
                new VIP{ UserName="王五", Vip=1, QQ="5123456", Mail="5123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(3) },
                new VIP{ UserName="赵六", Vip=1, QQ="6123456", Mail="6123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(4) },
                new VIP{ UserName="刘七", Vip=1, QQ="7123456", Mail="7123456", VipEndDate=(DateTime?)DateTime.Now.AddDays(5) }
            };

            
            if (Request.Cookies["_EntityMemcached"] == null)
            {
                string sessionId = Guid.NewGuid().ToString();
                Response.Cookies["_EntityMemcached"].Value = sessionId;
                Response.Cookies["_EntityMemcached"].Expires = DateTime.Now.AddMinutes(1);//设置cookie过期时间

                MemcachedHelper.set(sessionId, vipInfo, DateTime.Now.AddMinutes(1));//设置缓存过期时间

                return Content("Memcached分布式缓存设置成功!!!");
            }
            else
            {
                string key = Request.Cookies["_EntityMemcached"].Value.ToString();

                object obj = MemcachedHelper.Get(key);
                List<VIP> info = obj as List<VIP>;

                if (info != null)
                {
                    return View(info);
                }

            }

            return Content("若显示则有&#39;bug&#39;");
        }
#看看實現:

然後退出來,重新點擊」實作memcached快取」

 我設定了一分鐘內的緩存,因此在這一分鐘內將一直是這個介面,不得不說memcached還是不錯!後續接著研究OutputCached + Monogodb的快取策略

以上是高效能快取系統(Memcached)的實例介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn