在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
在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("若显示则有'bug'"); }#看看實現: 然後退出來,重新點擊」實作memcached快取」
我設定了一分鐘內的緩存,因此在這一分鐘內將一直是這個介面,不得不說memcached還是不錯!後續接著研究OutputCached + Monogodb的快取策略
以上是高效能快取系統(Memcached)的實例介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!