sdchy 发表于 2015-8-31 08:02:52

分布式缓存 memcache学习

  1.使用分布式缓存是为了解决多台机器共享信息的问题,通过访问一个ip和端口来可以访问不同的IIS服务器
  2.memcache基础原理
  在Socket服务器端存储数据是以键值对的形式存储
  内存处理的算法: 本质就是一个大的哈希表。
  key最大长度是255个字符,value最大为1MB 内存模型:Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk)最大1MB,但同一个分区里:块的长度(bytes)是固定的。
  插入数据:查找适合自己长度的块,然后插入,会有内存浪费。 LRU,闲置>过期>最少访问   
  惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃。
  集群搭建原理: Memcache服务器端并没有提供集群功能,但是通过客户端的驱动程序实现了集群配置。
  客户端实现集群的原理:首先客户端配置多台集群机器的ip和端口的列表。然后客户端驱动程序在写入之前,首先对key做哈希处理得到哈希值后对总的机器的个数进行取余然后就选择余数对应的机器。 Memcache预先将可支配的内存空间进行分区(Slab),每个分区里再分成多个块(Chunk),但同一个分区里:块的长度(bytes)是固定的。 将记录从Memcache删除后,已经分配的内存(即Chunk),也不会被释放,而是会重复利用,这样就彻底解决了内存碎片的问题 Memcache采用“惰性”方式来应对记录的超期问题
  3.Windows下使用Memcache
  下载Memcache Service: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


  将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 。值得注意的是,经过测试确认:那个LastAccessTime并不是记录到期时间,而是最后一次的get时间,并且get之后,也不会自动延长expiry(到期时间)。
  添加新记录:add KeyName 0 0 ValueByteLength [回车] ValueContent
  删除记录 : delete KeyName
  添加或更新记录 : set KeyName 0 0 ValueByteLength [回车] ValueContent
  更新记录 : replace KeyName 0 0 ValueByteLength [回车] ValueContent

  参考:http://www.cnblogs.com/lost-1987/articles/3069460.html
  http://wenku.baidu.com/view/e30db586ec3a87c24028c401.html
  也可以使用http://yunpan.cn/Q7G8VzTRa69MJ (提取码:8c12),将服务直接安装到电脑上,
  1) 解压到d:\memcached。
  2) 在命令行状态下输入: d:\memcached\memcached.exe -d install 。至此memcached已经安装成windows服务
  3) 在命令行下输入: d:\memcached\memcached.exe -d start 以启动memcached服务。当然也可以选择在windows服务中启动。
  
  4.C#操作Memcache 引用类库文件
  使用NuGet包下载Memcached Client
  封装MemcachedHelper类
  public static class MemcacheHelper
  {
  private static MemcachedClient mc;
  static MemcacheHelper()
  {
  String[] serverlist = { "127.0.0.1:11211" };
  // initialize the pool for memcache servers
  SockIOPool pool = SockIOPool.GetInstance("test");
  pool.SetServers(serverlist);
  pool.Initialize();
  mc = new MemcachedClient();
  mc.PoolName = "test";
  mc.EnableCompression = false;
  }
  public static bool Set(string key, object value,DateTime expiry)
  {
  return mc.Set(key, value, expiry);
  }
  public static object Get(string key)
  {
  return mc.Get(key);
  }
  }
  使用方法
  MemcacheHelper.Set("key", "value", DateTime.Now.AddMinutes(20));
  MemcacheHelper.Get("key");
  5.Cookie+Memcache模拟Session保持登录状态
  Guid sessionId = Guid.NewGuid();//申请了一个模拟的GUID:SessionId
  //把sessionid写到客户端浏览器里面去
  Response.Cookies["sessionId"].Value = sessionId.ToString();
  MemcacheHelper.Set(sessionId.ToString(), loginUser, DateTime.Now.AddMinutes(20));
  
  //从cookie中获取咱们的 登录的sessionId
  string sessionId = Request["sessionId"];
  if (!string.IsNullOrEmpty(sessionId))
  {   
  object obj = MemcacheHelper.Get(sessionId);
  UserInfo user = obj as UserInfo;
  }
  
  Memcached资料:http://yunpan.cn/Q7Gts4LLGvnz2 (提取码:6d84)
页: [1]
查看完整版本: 分布式缓存 memcache学习