一、安装Memcached
Memcached1.2.6
http://files.cnblogs.com/files/jasonduan/11465401756756.zip
Memcached.ClientLibrary
http://files.cnblogs.com/files/jasonduan/10524626586159.zip
网上好多文章
http://jingyan.baidu.com/article/335530da5f765019cb41c3ec.html
http://jingyan.baidu.com/album/c85b7a640fbfd5003bac9500.html
memcached.exe -d install
memcached.exe -d start
Memcached还有其他的一些常用的命令如下:
-p 监听的端口 --默认端口11211
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB
-M 内存耗尽时返回错误,而不是删除项 默认64
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
在运行下输入“regedit”打开注册表, 找到路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached,下面找 到一个ImagePath 的字符串项,正好是服务的执行路径的字符串,
双击该串,在后面追加入“-m 1024 -c 2048 -p 11200” 重启服务即可
查看缓存区块,分析结果可调配-f参数
telnet 127.0.0.1 11200
查看缓存的各种状态
stats
二、定义MemCachedHelper
<add key="memcachedServer" value="127.0.0.1:11200" />
using System.Linq; using System.Web; using System.Configuration; using Memcached.ClientLibrary; using System; using System.Collections; namespace API.Common { public static class MemCachedHelper { private static readonly MemcachedClient memcachedClient; static MemCachedHelper() { //读取web.config中的memcached服务器配置信息 if (string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["memcachedServer"])) { throw new Exception("请在web.config的appsetting中配置memcached服务器信息!"); } string[] servers = ConfigurationManager.AppSettings["memcachedServer"].Split(new char[‘,‘], StringSplitOptions.RemoveEmptyEntries); //初始化池 SockIOPool pool = SockIOPool.GetInstance(); pool.SetServers(servers); pool.InitConnections = 3; pool.MinConnections = 3; pool.MaxConnections = 1000; pool.SocketConnectTimeout = 1000; pool.SocketTimeout = 3000; pool.MaintenanceSleep = 30; pool.Failover = true; pool.Nagle = false; pool.Initialize(); memcachedClient = new MemcachedClient(); memcachedClient.EnableCompression = false; } /// <summary> /// 根据key获取value /// </summary> /// <param name="key"></param> /// <returns></returns> public static object Get(string key) { return memcachedClient.Get(key); } public static T Get<T>(string key) { return (T)memcachedClient.Get(key); } public static Hashtable Get(string[] key) { return memcachedClient.GetMultiple(key); } public static bool Set(string key, object objObject, DateTime exp) { return memcachedClient.Set(key, objObject, exp); } public static bool Set(string key, object value) { return memcachedClient.Set(key, value); } public static bool Set(string key, object value, int minute) { return memcachedClient.Set(key, value, DateTime.Now.AddMinutes(minute)); } public static void Set<T>(string key, T values) { memcachedClient.EnableCompression = false; memcachedClient.Set(key, values); } public static void Set<T>(string key, T values, DateTime expiry) { try { memcachedClient.EnableCompression = false; memcachedClient.Set(key, values, expiry); } catch { } } public static Hashtable Stats() { return memcachedClient.Stats(); } public static void Remove(string key) { memcachedClient.Delete(key); } public static void RemoveAllCache() { memcachedClient.FlushAll(); } public static bool ContainsKey(string key) { return memcachedClient.KeyExists(key); } public static bool IsKeyExists(string key) { try { return memcachedClient.KeyExists(key); } catch { return false; } } public static bool Replace<T>(string key, T values, DateTime expiry) { return memcachedClient.Replace(key, values, expiry); } public static bool Replace<T>(string key, T values) { return memcachedClient.Replace(key, values); } } }
三使用
using API.Model; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using C = API.Common; using B = API.BLL; using M = API.Model; namespace API.BPJ.Controllers.Product { /// <summary> /// 商品控制器 /// </summary> public class ProductController : ApiController { /// <summary> /// 根据经销商编号得到分类列表 /// </summary> /// <param name="UserId"></param> /// <param name="ZY"></param> /// <param name="Sign"></param> /// <param name="Ts"></param> /// <returns></returns> [HttpGet] public CommonResult GetProductCategoryList(string UserId, string ZY, string Sign, string Ts) { CommonResult apiResult = new CommonResult(); //检查请求 签名和时间戳不符合即返回 if (!C.ComHelper.CheckRequest(Sign, Ts, out apiResult.Result, out apiResult.Message)) { return apiResult; } string cachekey = "CategoryList" + UserId + ZY; if (!C.MemCachedHelper.IsKeyExists(cachekey)) { //如果没有缓存从数据库读取 默认设置缓存为1天时间 List<M.ProductCategory> list = new B.Product().GetProductCategoryList(UserId, ZY); C.MemCachedHelper.Set<List<M.ProductCategory>>(cachekey, list, DateTime.Now.AddDays(1)); apiResult.Data = list; } else { apiResult.Data = C.MemCachedHelper.Get<List<M.ProductCategory>>(cachekey); } if (apiResult.Data != null) { apiResult.Result = "1"; apiResult.Message = "加载成功!"; } else { apiResult.Result = "2"; apiResult.Message = "加载失败!"; } return apiResult; } } }
四注意问题
1、model需要Serializable 否则不能set
2、序列化后的json对象,每个属性都带有k__BackingField后缀,加入[DataContract] [DataMember]就就可以了
namespace API.Model { [Serializable] [DataContract] public class ProductCategory { [DataMember] public int CId { get; set; } [DataMember] public string CName { get; set; } [DataMember] public string CCode { get; set; } [DataMember] public string PCode { get; set; } [DataMember] public string Thumbnail { get; set; } [DataMember] public string Picture { get; set; } } }
localhost:6103/api/Product/GetProductCategoryList?UserId=1&ZY=1&Sign=&Ts=
{ "Result": "1", "Message": "加载成功!", "Data": [ { "CId": 268, "CName": "个护化妆", "CCode": "003", "PCode": "0", "Thumbnail": "http://images.bpj.com/ProductCategory/201603/gehuhuazhang.jpg", "Picture": "http://images.bpj.com/ProductCategory/201603/gehuhuazhang.jpg" }, { "CId": 269, "CName": "个护健康", "CCode": "004", "PCode": "0", "Thumbnail": "http://images.bpj.com/ProductCategory/201603/gehujiankang.jpg", "Picture": "http://images.bpj.com/ProductCategory/201603/gehujiankang.jpg" }, { "CId": 338, "CName": "家居用品", "CCode": "005", "PCode": "0", "Thumbnail": "http://images.bpj.com/ProductCategory/201603/jiajuyongpin.jpg", "Picture": "http://images.bpj.com/ProductCategory/201603/jiajuyongpin.jpg" }, { "CId": 499, "CName": "母婴玩具", "CCode": "007", "PCode": "0", "Thumbnail": "http://images.bpj.com/ProductCategory/201603/muyingwanju.jpg", "Picture": "http://images.bpj.com/ProductCategory/201603/muyingwanju.jpg" } ] }