memcached 的強大,不用說了!我這裏對它的應用也只是冰山一角。都是些基本運用.
可以先從 memcached官方 下載 。最新版本應該是1.4.15。我這裏下載的是windows穩定版 版本是1.4.14.
下載下來後.直接解壓然後將memcached裏面文件拷貝到你想創建的目錄下即可
然後dos下安裝一下就OK了!至於一些基本參數可以再dos中設置,也可以再項目中設置,比如最大連接數,最小連接數,超時時間等等.(我的虛擬機又不工作了!FK.具體參數設置就不說了!)。參數信息可以參考一下下面我在網上找的一個列表.
-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 顯示幫助
mvc3.0項目搭建好後,會自動生成Global.asax文件,項目的一個全局文件! 我們在這裏面設置memcached 的啓動參數!
public static void cachePool()
{
string poolname = "default";
String[] serverlist = { "127.0.0.1:11211" }; ->這裏如果需要部署分佈式, 繼續在後面追加ip即可!例如String[] serverlist = { "192.168.1.1:11211","192.168.1.2:11211" };
SockIOPool pool = SockIOPool.GetInstance(poolname);
pool.SetServers(serverlist); //設置服務器列表
//各服務器之間負載均衡的設置
pool.SetWeights(new int[] { 1 }); ->這裏部署分佈式的時候是個很重要的參數, 相當於設置cache 值的主次!
//socket pool設置
pool.InitConnections = 5; //初始化時創建的連接數
pool.MinConnections = 5; //最小連接數
pool.MaxConnections = 2000; //最大連接數
//連接的最大空閒時間,下面設置爲6個小時(單位ms),超過這個設置時間,連接會被釋放掉
pool.MaxIdle = 1000 * 60 * 60 * 6;
//通訊的超時時間,下面設置爲3秒(單位ms),.NET版本沒有實現
pool.SocketTimeout = 1000 * 3;
//socket連接的超時時間,下面設置表示連接不超時,即一直保持連接狀態
pool.SocketConnectTimeout = 0;
pool.Nagle = false; //是否對TCP/IP通訊使用Nalgle算法,.NET版本沒有實現
//維護線程的間隔激活時間,下面設置爲60秒(單位s),設置爲0表示不啓用維護線程
pool.MaintenanceSleep = 60;
//socket單次任務的最大時間,超過這個時間socket會被強行中斷掉(當前任務失敗)
pool.MaxBusy = 1000 * 10;
pool.Failover = true;
pool.Initialize();
}
protected void Application_Start() //這裏調用
{
cachePool();
}
OK,基本設置已經完成,下一步 我們需要下載兩個dll 。用於集成net。 一個是Memcached.ClientLibrary 還有 MemcachedProviders.然後引用一下!
接下來我們寫一個cache的操作類DataCache
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Memcached.ClientLibrary;
using System.Security.Cryptography;
namespace Common
{
/// <summary>
/// memcached 緩存操作類
/// </summary>
public class DataCache
{
public static void SetMc(object obj, string cacheName)
{
string poolname = "default";
cacheName = GetMD5(cacheName);
//客戶端實例
MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
mc.EnableCompression = true;
mc.CompressionThreshold = 10240;
if (obj != null)
mc.Set(cacheName, obj, DateTime.Now.AddHours(3));
}
public static void SetMc(object obj, string cacheName, int minutes)
{
string poolname = "default";
cacheName = GetMD5(cacheName);
//客戶端實例
MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
mc.CompressionThreshold = 10240;
if (obj != null)
mc.Set(cacheName, obj, DateTime.Now.AddMinutes(minutes));
}
public static object GetMc(string cacheName)
{
string poolname = "default";
cacheName = GetMD5(cacheName);
//客戶端實例
MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
mc.EnableCompression = true;
return (object)mc.Get(cacheName);
}
public static void UpdateMc(object obj, string cacheName)
{
string poolname = "default";
cacheName = GetMD5(cacheName);
//客戶端實例
MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
mc.Delete(cacheName);
if (obj != null)
{
mc.EnableCompression = true;
mc.Set(cacheName, obj);
}
}
public static void DelMc(string cacheName)
{
string poolname = "default";
cacheName = GetMD5(cacheName);
//客戶端實例
MemcachedClient mc = new Memcached.ClientLibrary.MemcachedClient();
mc.PoolName = poolname; //如果實例化pool時沒有poolname,該行可以不用。
mc.Delete(cacheName);
}
/// <summary>
/// Cache MD5
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static string GetMD5(string str)
{
int size = Common.PageBase.memcachedMD5Size;
if (size == 16)
{//16位
MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
str = BitConverter.ToString(md5.ComputeHash(System.Text.UTF8Encoding.Default.GetBytes(str)), 4, 8);
str = str.Replace("-", "");
}
else
{ //32位
byte[] b = System.Text.Encoding.Default.GetBytes(str);
b = new MD5CryptoServiceProvider().ComputeHash(b);
for (int i = 0; i < b.Length; i++)
{
str += b[i].ToString("x").PadLeft(2, '0');
}
}
return str;
}
}
}
OK. 可以看到這兩個參數。是設置memcached緩存的壓縮比。memcached的單個item最多存儲1m數據。
mc.EnableCompression = true;
至於cache key 用md5加密,有兩個原因,1是因爲memcached 對於key的長度也是有限制,如果超出限制長度當前這個item會一直處於失效狀態,2是因爲安全問題。
基本設置都已經完成,接下來可以使用我們的DataCache 進行數據緩存了。
/// <summary>
/// get Model by code
/// </summary>
/// <param name="OrderCode"></param>
/// <returns></returns>
public OrderInfo OrderInfoModelByOrderCode(string OrderCode)
{
string cacheKey = "OrderInfoModelByOrderCode_" + OrderCode;
object objModel = Common.DataCache.GetMc(cacheKey);
if (objModel == null)
{
try
{
OrderInfo orderModel = dal.OrderInfoModelByOrderCode(OrderCode);
objModel = orderModel;
if (objModel != null)
{
int cacheTime = Common.PageBase.memcachedTime; //memcached自動超時時間,比如設置10.當前這個cache item 就會在10分鐘後自動失效,如有新請求,則重新add
Common.DataCache.SetMc(objModel, cacheKey, cacheTime);
}
}
catch (Exception ex)
{
}
}
return (OrderInfo)objModel;
}
到這裏,基本運用就完成了。