1、从单机到分布式php
2、为何要使用Memcached?html
key最大255个字符,item内存块最大1MB,固然key/item最好都别太大,最长过时时间是30天 Memcache预先将可支配的内存空间进行分区(Slab),每一个分区里再分红多个块(Chunk),但同一个分区里:块的长度(bytes)是固定的。 将记录从Memcache删除后,已经分配的内存(即Chunk),也不会被释放,而是会重复利用,这样就完全解决了内存碎片的问题 Memcache采用“惰性”方式来应对记录的超期问题 一致性哈希处理: http://www.cnblogs.com/lanceyan/archive/2013/05/13/3075044.html 解决多线程问题: 3. CAS的基本原理 Memcached于1.2.4版本新增CAS协议,类同于Java并发包中CAS(Compare and Set)原子操做,用来处理同一item被多个线程更改过程的并发问题. 基本原理很是简单,简而言之就是”版本号”.每一个存储的数据对象都有一个版本号.在Memcached中,每一个key关联有一个64bit长度的long型惟一数值,表示该key对应value的版本号. 这个数值由Memcached产生,从1开始,且同一Memcached不会重复,在两种状况下这个版本数值会加,即新增与更新,而删除item版本值不会减少. 咱们能够从下面的例子来理解: 若是不采用CAS,则有以下的情景: 第一步,A取出数据对象X; 第二步,B取出数据对象X; 第三步,B修改数据对象X,并将其放入缓存; 第四步,A修改数据对象X,并将其放入缓存。 咱们能够发现,第四步中会产生数据写入冲突。 若是采用CAS协议,则是以下的情景。 第一步,A取出数据对象X,并获取到CAS-ID1; 第二步,B取出数据对象X,并获取到CAS-ID2; 第三步,B修改数据对象X,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“一致”,就将修改后的带有CAS-ID2的X写入到缓存。 第四步,A修改数据对象Y,在写入缓存前,检查CAS-ID与缓存空间中该数据的CAS-ID是否一致。结果是“不一致”,则拒绝写入,返回存储失败。
使用场景:算法
缓存放频繁访问但不多变化的内容:
如:类别、禁用词(用正则匹配)、数据库
string str = string.Join(list.ToArray()); //aa|bb|cc Regex.IsMatch(msg,str);
4、Windows下使用Memcachewindows
其余说明:缓存
将Memcache.exe安装为Windows服务:Memcache.exe -d install 启动Memcache服务:Memcache.exe -d start 启动Memcache服务(windows命令):net start "Memcache Server" 中止Memcache服务(windows命令):net stop "Memcache Server" 链接到Memcache控制台:telnet ServerIP 11211 打印当前Memcache服务器状态:stats 打印当前Memcache服务器Items(记录)的统计信息:stats items 打印当前Memcache服务器Slab(分区)及Chunk(块)的统计信息:stats slabs 打印指定Slab中的KEY列表(可用于遍历items,但效率较低,慎用!):stats cachedump SlabId Limit_num。显示结果:ITEM KeyName [ValueByteLength b; LastAccessTime s]。值得注意的是,通过测试确认:那个LastAccessTime并非记录到期时间,而是最后一次的get时间,而且get以后,也不会自动延长expiry(到期时间)。 添加新记录:add KeyName 0 0 ValueByteLength [回车] ValueContent 删除记录 : delete KeyName 添加或更新记录 : set KeyName 0 0 ValueByteLength [回车] ValueContent 更新记录 : replace KeyName 0 0 ValueByteLength [回车] ValueContent 取值:get key 参考:http://www.cnblogs.com/lost-1987/articles/3069460.html http://wenku.baidu.com/view/e30db586ec3a87c24028c401.html 也能够图形化监控 Memcached 的运行状态 http://livebookmark.net/journal/2008/05/21/memcachephp-stats-like-apcphp/ 在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server 下面找到一个 ImagePath 的字符串项,正好是服务的执行路径的字符串,双击该串,在后面加入 -l 192.168.1.135 -m 45 -p 12345 (访问ip为:192.168.1.135 使用45M内存,12345为端口),再启动服务。
5、应用服务器
1.下载.NET版memcached客户端API组件 放到自建的Lib文件夹session
2.添加这些dll引用(Commons.dll,ICSharpCode.SharpZipLib.dll,log4net.dll)多线程
3.封装MemcacheHelper代码以下:并发
public class MemcacheHelper { private static readonly MemcachedClient mc = new MemcachedClient();
static MemcacheHelper() //静态构造函数只会执行一次 { string[] serverlist = { "127.0.0.1:11211","10.0.0.132:11211" };//Memcache服务器IP地址和端口号,这里用本地机子进行测试。(可存放多个服务器信息,无效的服务器会自动被忽略。具体往哪台服务器存,会根据内部哈希算法自动去选择,不用咱们去考虑。) //初始化池 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(); //得到客户端实例(能够认为是telnet或socket客户端) MemcachedClient mc = new MemcachedClient(); mc.EnableCompression = false; } /// <summary> /// 向Memcache存储数据 /// </summary> /// <param name="key"></param> /// <param name="value"></param> public static void Set(string key, object value) { mc.Set(key, value); } public static void Set(string key, object value, DateTime time) { mc.Set(key, value, time);//绝对过时时间 } /// <summary> /// 获取Memcache中的数据 /// </summary> /// <param name="key"></param> /// <returns></returns> public static object Get(string key) { return mc.Get(key); } /// <summary> /// 删除 /// </summary> /// <param name="key"></param> /// <returns></returns> public static bool Delete(string key) { if (mc.KeyExists(key)) { return mc.Delete(key); } return false; } }
调用:
MemcacheHelper.Set("test","myValue");
若是存储复杂类型数据则须要进行序列号处理:
MemcacheHelper.Set(sessionId,SerializerHelper.SerializerToString(userInfo));
序列化处理:(添加dll引用:Newtonsoft.Json) 点击下载FrameWork4.5版本>>
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CZBK.HeiMaOA.Common { public class SerializerHelper { public static string SerializerToString(object obj) { return JsonConvert.SerializeObject(obj); } } }
6、源码下载:
测试: