memcache的优点:
1.解决了高并发访问数据库造成的死锁
2.实现了多客户端的共享缓存
3.读写性快,1s:读取可以1w次,写:10w
4.超简单集群搭建Cluster
5.开源代码
6.学习成本低、入门容易、丰富的成功案例
缺点:
没有提供主从复制功能,也没有提供容灾等功能,数据存在缓存中(例如服务器重启就会丢失数据),所有的代码基本只是考虑性能最佳。
Memcache 基础原理
底层通讯:Socket
数据:键值对存储,key最大255个字符,item最大1MB,当然key/item最好都别太大,最长过期时间是30天
内存处理的算法:
本质就是一个大的哈希表。key最大长度是255个字符。
内存模型:Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk)大小1MB,但同一个分区里:块的长度(bytes)是固定的。
插入数据:查找适合自己长度的块,然后插入,会有内存浪费。
LRU,闲置>过期 >最少访问
惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃。
集群搭建原理:
Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程序实现了集群配置。 客户端实现集群的原理:首先客户端配置多台集群机器的ip和端口的列表。然后客户端驱动程序在写入之前,首先对key做哈希处理得到哈希值后对总的机器的个数进行取余然后就选择余数对应的机器。
Windows下使用Memcache
下载Memcache
安装服务:以管理员的身份打开cmd进入memcache所在文件夹,输入安装命令:Memcached.exe -d install
打开服务会看到memcached已安装
打开服务监控窗口可以查看服务是否启动。 启动服务:cmd→Memcached.exe -d start(restart重启,stop关闭服务)
检查服务是否启动:
1.开启telnet
2.在控制台输入命令:telnet 192.168.1.22 11211(ip地址 端口号:默认为11211)
通过 memcached.exe -h 可以查看其帮助
3.在控制台输入命令检查当前服务状态:stats
卸载服务:Memcached.exe -d uninstall(先关闭服务)
遇到问题:win8下安装服务。无法启动此程序,因为计算机中丢失 MSVCR71.dll。尝试重新安装该程序以解决此问题。下载dll地址:http://www.dll-files.com/dllindex/dll-files.shtml?msvcr71
二 .NET memcached client library
下载文件:https://sourceforge.net/projects/memcacheddotnet/
里面有.net1.1 和 .net2.0的两种版本 还有一个不错的例子。
三 应用
1 将Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll,Memcached.ClientLibrary.dll 放到lib目录,如果项目中已存在log4net.dll则不需要再引用
2 项目右击添加引用
3 代码
using Memcached.ClientLibrary; using System; namespace CZBK.ItcastOA.MemcaheDemo { class Program { static void Main(string[] args) { //ip地址:端口号 string[] serverlist = { "192.168.1.95: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(); // 获得客户端实例 MemcachedClient mc = new MemcachedClient(); mc.EnableCompression = false; Console.WriteLine("------------测 试-----------"); mc.Set("test", "my value"); //存储数据到缓存服务器,这里将字符串"my value"缓存,key 是"test" if (mc.KeyExists("test")) //测试缓存存在key为test的项目 { Console.WriteLine("test is Exists"); Console.WriteLine(mc.Get("test").ToString()); //在缓存中获取key为test的项目 } else { Console.WriteLine("test not Exists"); } Console.ReadLine(); mc.Delete("test"); //回车移除缓存中key为test的项目 if (mc.KeyExists("test")) { Console.WriteLine("test is Exists"); Console.WriteLine(mc.Get("test").ToString()); } else { Console.WriteLine("test not Exists"); } Console.ReadLine(); SockIOPool.GetInstance().Shutdown(); //关闭池, 关闭sockets } } }
参考链接:http://www.cnblogs.com/zjneter/archive/2007/07/19/822780.html