1.高性能文件緩存key-value存儲—Redis
2.ASP.NET HttpRuntime.Cache緩存類使用總結
備注:三篇博文結合閱讀,簡單理解並且使用,如果想深入學習,請多參考文章中給出的博文地址。
1.前言
a.Memcached是一個高性能的分布式緩存系統,用於Web應用減輕數據庫負載,它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高網站的訪問速度。
b.Memcached是一個給予存儲鍵/值對的HashMap,底層使用C語言完成,但是客戶端可以使用任何語言來編寫(Java,.NET,PHP).
c.Memcached中的數據都是存儲在memcached內置的內存存儲空間中,由於數據僅存在於內存中,因此當某個服務器停止運行或者出現問題之后,所有存放在服務器上的鍵/值對都會丟失。
d.下面這幅圖可以說明Memcached的工作過程,當首次訪問系統的時候,系統從數據庫中取得數據保存到Memcached中,在第二次訪問的時候則直接從Memcached中讀取出來需要的值信息。
e.Memcached的特征
Memcached作為高速運行的分布式緩存服務器,具有以下的特點:
e.1:協議簡單(客戶端通信並不是使用復雜的XML格式,而是使用簡單的基於文本行的協議)
e.2:基於libevent的事件處理(libevent是一個程序庫,即使服務器的連接數增加,也能發揮o(1)的性能)
e.3:內置內存存儲方式(c中已經描述)
e.4:Memcached不互相通信的分布式。
f.推薦閱讀,http://kb.cnblogs.com/page/42731/
g.Github下載地址:https://github.com/kencery/Common/blob/master/KenceryCommonMethod/%E7%BC%93%E5%AD%98
2.封裝代碼調用描述
1 // 源文件頭信息: 2 // <copyright file="MemcacheHelper.cs"> 3 // Copyright(c)2014-2034 Kencery.All rights reserved. 4 // 個人博客:http://www.cnblogs.com/hanyinglong 5 // 創建人:韓迎龍(kencery) 6 // 創建時間:2015-4-24 7 // </copyright> 8 using System; 9 using System.Configuration; 10 using Memcached.ClientLibrary; 11 12 namespace KenceryCommonMethod 13 { 14 /// <summary> 15 /// 封裝使用Memchached信息,讀取緩存存放在服務器 16 /// <auther> 17 /// <name>Kencery</name> 18 /// <date>2015-4-24</date> 19 /// </auther> 20 /// </summary> 21 public class MemcacheHelper 22 { 23 /// <summary> 24 /// 字段_instance,存放注冊的緩存信息 25 /// </summary> 26 private static MemcacheHelper _instance; 27 28 /// <summary> 29 /// 緩存客戶端 30 /// </summary> 31 private readonly MemcachedClient _client; 32 33 /// <summary> 34 /// 受保護類型的緩存對象,初始化一個新的緩存對象 35 /// </summary> 36 protected MemcacheHelper() 37 { 38 //讀取app.Config中需要緩存的服務器地址信息,可以傳遞多個地址,使用","分隔 39 string[] serverList = ConfigurationManager.AppSettings["Memcached.ServerList"].Split(','); 40 try 41 { 42 var sockIoPool = SockIOPool.GetInstance(); 43 sockIoPool.SetServers(serverList); 44 sockIoPool.InitConnections = 3; 45 sockIoPool.MinConnections = 3; 46 sockIoPool.MaxConnections = 50; 47 sockIoPool.SocketConnectTimeout = 1000; 48 sockIoPool.SocketTimeout = 3000; 49 sockIoPool.MaintenanceSleep = 30; 50 sockIoPool.Failover = true; 51 sockIoPool.Nagle = false; 52 //實例化緩存對象 53 _client = new MemcachedClient(); 54 } 55 catch (Exception ex) 56 { 57 //錯誤信息寫入事務日志 58 throw new Exception(ex.Message); 59 } 60 } 61 62 /// <summary> 63 /// 獲取緩存的實例對象,方法調用的時候使用 64 /// </summary> 65 /// <returns></returns> 66 public static MemcacheHelper GetInstance() 67 { 68 return _instance; 69 } 70 71 /// <summary> 72 /// 添加緩存信息(如果存在緩存信息則直接重寫設置,否則添加) 73 /// 使用:MemcacheHelper.GetInstance().Add(key,value) 74 /// </summary> 75 /// <param name="key">需要緩存的鍵</param> 76 /// <param name="value">需要緩存的值</param> 77 public void Add(string key, object value) 78 { 79 if (_client.KeyExists(key)) 80 { 81 _client.Set(key, value); 82 } 83 _client.Add(key, value); 84 } 85 86 /// <summary> 87 /// 添加緩存信息 88 /// 使用:MemcacheHelper.GetInstance().Add(key,value,Datetime.Now()) 89 /// </summary> 90 /// <param name="key">需要緩存的鍵</param> 91 /// <param name="value">需要緩存的值</param> 92 /// <param name="expiredDateTime">設置的緩存的過時時間</param> 93 public void Add(string key, object value, DateTime expiredDateTime) 94 { 95 _client.Add(key, value, expiredDateTime); 96 } 97 98 /// <summary> 99 /// 修改緩存的值 100 /// 使用:MemcacheHelper.GetInstance().Update(key,value) 101 /// </summary> 102 /// <param name="key">需要修改的鍵</param> 103 /// <param name="value">需要修改的值</param> 104 public void Update(string key, object value) 105 { 106 _client.Replace(key, value); 107 } 108 109 /// <summary> 110 /// 修改緩存的值 111 /// 使用:MemcacheHelper.GetInstance().Update(key,value,Datetime.Now()) 112 /// </summary> 113 /// <param name="key">需要修改的鍵</param> 114 /// <param name="value">需要修改的值</param> 115 /// <param name="expiredDateTime">設置的緩存的過時時間</param> 116 public void Update(string key, object value, DateTime expiredDateTime) 117 { 118 _client.Replace(key, value, expiredDateTime); 119 } 120 121 /// <summary> 122 /// 設置緩存 123 /// 使用:MemcacheHelper.GetInstance().Set(key,value) 124 /// </summary> 125 /// <param name="key">設置緩存的鍵</param> 126 /// <param name="value">設置緩存的值</param> 127 public void Set(string key, object value) 128 { 129 _client.Set(key, value); 130 } 131 132 /// <summary> 133 /// 設置緩存,並修改過期時間 134 /// 使用:MemcacheHelper.GetInstance().Set(key,value,Datetime.Now()) 135 /// </summary> 136 /// <param name="key">設置緩存的鍵</param> 137 /// <param name="value">設置緩存的值</param> 138 /// <param name="expiredTime">設置緩存過期的時間</param> 139 public void Set(string key, object value, DateTime expiredTime) 140 { 141 _client.Set(key, value, expiredTime); 142 } 143 144 /// <summary> 145 /// 刪除緩存 146 /// 使用:MemcacheHelper.GetInstance().Delete(key) 147 /// </summary> 148 /// <param name="key">需要刪除的緩存的鍵</param> 149 public void Delete(string key) 150 { 151 _client.Delete(key); 152 } 153 154 /// <summary> 155 /// 獲取緩存的值 156 /// 使用:MemcacheHelper.GetInstance().Get(key) 157 /// </summary> 158 /// <param name="key">傳遞緩存中的鍵</param> 159 /// <returns>返回緩存在緩存中的信息</returns> 160 public object Get(string key) 161 { 162 return _client.Get(key); 163 } 164 165 /// <summary> 166 /// 緩存是否存在 167 /// 使用:MemcacheHelper.GetInstance().KeyExists(key) 168 /// </summary> 169 /// <param name="key">傳遞緩存中的鍵</param> 170 /// <returns>如果為true,則表示存在此緩存,否則比表示不存在</returns> 171 public bool KeyExists(string key) 172 { 173 return _client.KeyExists(key); 174 } 175 176 /// <summary> 177 /// 注冊Memcache緩存(在Global.asax的Application_Start方法中注冊) 178 /// 使用:MemcacheHelper.RegisterMemcache(); 179 /// </summary> 180 public static void RegisterMemcache() 181 { 182 if (_instance == null) 183 { 184 _instance = new MemcacheHelper(); 185 } 186 } 187 } 188 }