全面解析windows下Memcache技术应用
一、Memcache介绍
Memcache 是 danga.com 的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络 IO 。由于它的工作机制是在内存中开辟一块空间,然后建立一个 HashTable , Memcached 自管理这些 HashTable 。Memcache是高性能的分布式内存缓存服务器。一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高 可扩展性。Memcache 官方网站: http://www.danga.com/memcached。
二、Memcache安装
安装包里面会有x64和x86两个文件夹,根据操作系统选择一个打开会找到memcached.exe。这个文件不能直接双击运行安装,需要通过cmd进行安装。
cmd命令:Memcache –d start|stop|shutdown|restart|uninstall|install 启动|停止|关闭|重启|卸载|安装。
安装步骤:1.找到文件memcache.exe路径;
2.memcache –d install安装完毕;
3.启动服务后windows进程中可以看到memcache.exe;
4.服务器安装完成后,我们可以通过telnet到服务器测试一下(如果提示telnet命令不存在,需要去控制面板开启windows的 telnet服务功能) 例如: 10.0.27.120是安装memcache服务的ip地址,11211是默认的端口。输入stats查看参数信息。
到此memcache的安装全部完成。
三、Memcache在程序中的应用
在解决方案中新建memcache的类库,引用以下几个类 库,Commons.dll,Memcached.ClientLibrary.dll,ICSharpCode.SharpZipLib.dll。新建 MemcacheHelper.cs这个memcache的使用类。准备工作做完之后开始进入memcache的使用。
1.在web.config里面配置memcache的服务器地址
<appSettings>
<!--memcache的服务器配置,IP地址后期再改,端口号固定为11211--><add key="Memcached.ServerList" value="10.3.2.24:11211"/>
<appSettings>
2.在MemcacheHelper.cs类里面编写实现代码
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Memcached.ClientLibrary; using System.Data; using System.Configuration; using NLP.Common; namespace NLP.Memcache { public class MemcacheHelper { #region 全局静态对象 // 全局Socket连接池对象 private static SockIOPool sockIOPool; public static SockIOPool CurrentPool { get { return sockIOPool; } } // 全局Memcached客户端对象 private static MemcachedClient mc; #endregion public static bool MemcacheHelperInit() { try { // 初始化Memcached服务器列表 string[] serverList = ConfigurationManager.AppSettings["Memcached.ServerList"].Split(','); // 初始化Socket连接池 sockIOPool = SockIOPool.GetInstance("MemPool"); sockIOPool.SetServers(serverList); sockIOPool.Initialize(); // 初始化Memcached客户端 mc = new MemcachedClient(); mc.PoolName = "MemPool"; mc.EnableCompression = false; return true; } catch (Exception ex) { return false; } } /// <summary> /// 判断pkey关键字是否在Pmc中 /// </summary> /// <param name="pMC"></param> /// <param name="pKey"></param> /// <returns></returns> public static bool IsCache(string pKey) { if (MemcacheHelperInit()) { if (mc.KeyExists(pKey)) { return true; } else { return false; } } else { return false; } } /// <summary> /// 删掉Memcache 数据 /// </summary> /// <param name="key"> </param> /// <returns></returns> public static bool RemoveCache(string pKey) { if (MemcacheHelperInit()) { if (!mc.KeyExists(pKey)) { return false; } else { return mc.Delete(pKey); } } else { return false; } } /// <summary> /// Set-新增或修改 /// </summary> /// <param name="key">键</param> /// <param name="value">值</param> /// <returns>是否成功</returns> public static bool AddCache(string key, object value) { if (MemcacheHelperInit()) { if (!mc.KeyExists(key)) { return mc.Add(key, value); } else { return mc.Set(key, value); } } else { return false; } } /// <summary> /// Set-新增或修改 /// </summary> /// <param name="key">键</param> /// <param name="value">值</param> /// <param name="expiry">过期时间</param> /// <returns>是否成功</returns> public static bool AddCache(string key, object value, DateTime expiry) { if (MemcacheHelperInit()) { if (!mc.KeyExists(key)) { return mc.Add(key, value, expiry); } else { return mc.Set(key, value, expiry); } } else { return false; } } /// <summary> /// 根据单个key值获取Memcache 数据 /// </summary> /// <param name="key"></param> /// <returns></returns> public static object GetCache(string key) { if (MemcacheHelperInit()) { if (!mc.KeyExists(key)) { return null; } else { return mc.Get(key); } } else { return false; } } /// <summary> /// 根据多个key值获取Memcache 数据 /// </summary> /// <param name="key"> </param> /// <returns></returns> public static Dictionary<string, object> GetCache(string[] keys) { Dictionary<string, object> dic = new Dictionary<string, object>(); if (MemcacheHelperInit()) { foreach (string key in keys) { object obj = mc.Get(key); if (!dic.ContainsKey(key) && obj != null) dic.Add(key, obj); } return dic; } else { return null; } } } }
3.在调用代码里面调用 MemcacheHelper.cs的memcache方法
如bool result= MemcacheHelper.AddCache("User","123456");//实现新增key位User,value值为123456的memcache
//获取memcache中value值,为json格式string ob_json = MemcacheHelper.GetCache("User").ToString();
这样就实现了memcache的新增、查询的完整应用。