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;
}
到这里,基本运用就完成了。