PS: 第一次用MemCache,出现了N多问题,记录下来,之所以用到MemCache,想用来解决分布式存储session校验用户登陆
什么是MemCache?
memcache是一套分布式的高速缓存系统,由LiveJournal的Brad Fitzpatrick开发,但目前被许多网站使用以提升网站的访问速度,尤其对于一些大型的、需要频繁访问数据库的网站访问速度提升效果十分显著 。这是一套开放源代码软件,以BSD license授权发布
MemCache的优点
1 解决高并发访问数据库的问题, 2 磁盘IO之痛: 多客户端共享缓存 Net + Memory >> IO 读写性能完美 1s:读取可以1w次。 写:10w 3,超简单集群搭建 Cluster 4,开源 Open Source 5,学习成本非常低,6,入门非常容易 丰富的成功的案例
Memcache 基础原理
Socket 服务器端 数据:键值对存储 内存处理的算法: 本质就是一个大的哈希表。key最大长度是255个字符。 内存模型:Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk)大小1MB,但同一个分区里:块的长度(bytes)是固定的。 插入数据:查找适合自己长度的块,然后插入,会有内存浪费。 LRU,闲置>过期 >最少访问 惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃。 集群搭建原理: Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程序实现了集群配置。 客户端实现集群的原理:首先客户端配置多台集群机器的ip和端口的列表。然后客户端驱动程序在写入之前,首先对key做哈希处理得到哈希值后对总的机器的个数进行取余然后就选择余数对应的机器。
Windows下使用Memcache
下载Memcache:http://code.jellycan.com/Memcache/ 将服务程序拷贝到一个磁盘上的目录 安装服务:cmd→Memcached.exe -d install 打开服务监控窗口可以查看服务是否启动。 启动服务:cmd→Memcached.exe -d start(restart重启,stop关闭服务) 检查服务是否启动:连接到Memcache控制台:telnet ServerIP 11211 输入命令:stats检查当前服务状态。 卸载服务:Memcached.exe -d uninstall(先关闭服务) 遇到问题:win8下安装服务。无法启动此程序,因为计算机中丢失 MSVCR71.dll。尝试重新安装该程序以解决此问题。下载dll地址:http://www.dll-files.com/dllindex/dll-files.shtml?msvcr71 默认端口号 11211
MenCache的基本使用
1.将Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll 放到Lib
2. 引用Memcached.ClientLibrary.dll.(如果引用了log4net.dll, 一定要注意 版本一定要一致 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
3 封装代码
private static readonly MemcachedClient mc = null; //构造方法 初始化池 static MemCacheHelper() { string[] serverlist = { "127.0.0.1:11211", "10.0.0.132:11211" }; //初始化池 SockIOPool pool = SockIOPool.GetInstance(); pool.SetServers(serverlist); pool.InitConnections = 3; pool.MinConnections = 3; pool.MaxConnections = 5; pool.SocketConnectTimeout = 1000; pool.SocketTimeout = 3000; pool.MaintenanceSleep = 30; pool.Failover = true; pool.Nagle = false; pool.Initialize(); // 获得客户端实例 mc = new MemcachedClient(); mc.EnableCompression = false; } //加 public static bool MemSet(string key,object value) { return mc.Set(key, value); } //加带过期时间 public static bool MemSet(string key, object value, DateTime time) { // 1、memcache::add 方法:add方法用于向memcache服务器添加一个要缓存的数据。 //注意:如果memcache服务器中已经存在要存储的key,此时add方法调用失败。 //2、memcache::set 方法:set方法用于设置一个指定key的缓存内容,set方法是add方法和replace方法的集合体。 //注意: //1)、如果要设置的key不存在时,则set方法与add方法的效果一致; //2)、如果要设置的key已经存在时,则set方法与replace方法效果一样。 //3、 mmecache::replace方法: replace方法用于替换一个指定key的缓存内容,如果key不存在则返回false return mc.Set(key, value, time); } //获取 public static object MemGet(string key) { if (mc.KeyExists(key)) { return mc.Get(key); } return false; } //删除 public static bool MemDelete(string key) { if (mc.KeyExists(key)) { return mc.Delete(key); } return false; } } }
PS
出现的错误
1. 2017-04-02 18:24:39,395 [6] ERROR errorMsg - System.TypeInitializationException: “Common.MemCacheHelper”的类型初始值设定项引发异常。 ---> System.TypeInitializationException: “Memcached.ClientLibrary.SockIOPool”的类型初始值设定项引发异常。 ---> System.IO.FileLoadException: 未能加载文件或程序集“log4net, Version=1.2.10.0, Culture=neutral, PublicKeyToken=1b44e1d426115821”或它的某一个依赖项。找到的程序集清单定义与程序集引用不匹配。 (异常来自 HRESULT:0x80131040)
解决办法 :
一旦发现 System.TypeInitializationException类型的错误 基本上就是log4net的问题 我之所以出现这个问题是因为 我在使用ErrorFilter的时候用了Log4Net去记录 我的版本是2.0.8.0,而我在Commom这个程序集中使用的版本是1.2.10.0,两个版本不一致, 一定要清除所有Lib文件Bin文件的引用外加(NugGet下载)packages.config里的dll文件或者节中的信息,然后从新引用!
引用
文章内容大多来自,传智博客教程与PPt