上一片讲到Memcached在Windows上的安装,和用Telnet工具进行命令操作,在稍微了解了原理之后,我也就开始尝试着用程序来对Memcached进行操作。这一篇分为两个部分,第一部分是用.net程序对Memcached进行操作,第二部分是结合mvc实现一个分布式的缓存系统。

一、.net程序对Memcached进行操作

  想要用.net操作Memcached,首先我们的去下载.NET客户端类库:https://sourceforge.net/projects/memcacheddotnet,下载完成之后,会发现里面有一些Demo,而需要引用的程序集就只有ICSharpCode.SharpZipLib.dll,Memcached.ClientLibrary.dll,log4net.dll(可有可无)。

  

  

  上图就是创建了一个控制台应用程序,将这三个程序集引入项目。之后,将Memcached服务打开。再之后,就是代码。  

  

  1. string[] serverlist = { "127.0.0.1:11211" };
  2. SockIOPool sock = SockIOPool.GetInstance();   
  3. sock.SetServers(serverlist);//添加服务器列表 
  4. sock.InitConnections = ;//设置连接池初始数目
  5. sock.MinConnections = ;//设置最小连接数目
  6. sock.MaxConnections = ;//设置最大连接数目
  7. sock.SocketTimeout = ;//设置套接字超时读取      
  8. sock.MaintenanceSleep = ; //设置维护线程运行的睡眠时间。如果设置为0,那么维护线程将不会启动;
  9. sock.Failover = true; //获取或设置池的故障标志。          
  10. sock.MaxBusy = * ; //socket单次任务的最大时间(单位ms),超过这个时间socket会被强行中断,当前任务失败
  11. sock.Initialize();
  12.  
  13. MemcachedClient mc = new MemcachedClient();
  14. //清除所有的缓存数据
  15. mc.FlushAll();
  16.  
  17. //增加
  18. mc.Add("k","hello");
  19. //增加一个键k1,值是hello1,有效时间是30s
  20. mc.Add("k1", "hello1", DateTime.Now.AddSeconds());
  21.  
  22. // 将k的值重新设置为123 ,用set时,假如键存在,就直接修改,键不存在,就直接创建,再赋值
  23. mc.Set("k","");
  24. //将k的值重置为456 , 用Replace时,假如键存在,就直接修改,键不存在,报错
  25. mc.Replace("k", "");
  26.  
  27. //删除
  28. mc.Delete("k");

  到这里,我们用程序操作Memcached已经成功,我们程序运行完成之后,可以用telnet链接,看看数据是否加载进去了。这个比较简单,下面看个复杂点的。

二、Memcache+cookie实现模拟session

  1.session的使用原理

  以前在开发系统中,像用户这些基本信息,是直接保存在session中的,原理就是如下图所示,用户第一次访问时,服务器创建session,并把sessionid写回浏览器的cookie中,之后,浏览器每次访问服务器时,就把这个sessionid一同和其他数据发送到服务器端,这样就解决了Http协议是无状态链接这个问题了。简单原理就是这样,更加详细的session介绍详见http://www.cnblogs.com/lyzg/p/6067766.html(图也是人家的*-*)。

  

  2.Memcache+cookie代替session

  总的来说,session也不是完美的,会有易丢失,耗资源,单台服务器时还好,一遇到集群,就有点尴尬了,所以现在就模拟一下这个情况。这个例子的整体结构是这样子,搭建两个web服务器,同样也搭建两个Memcached服务器,好吧,双集群。

  1-6这个过程是,当用户从web1站点登陆,先去查询Memcached集群里是否有用户信息,这个肯定没有,之后就去数据库查,查到之后,就把用户的信息给存到Memcached中,具体存到哪个,这个先不做谈论。

  7-10过程,用户通过web2站点 访问数据,先去Memcached集群里查是否有信息(这个如何查的也先不做谈论),查到后,就直接把信息返回。

  接下来,我们就新建项目,添加引用,项目的结构如图所示,一个mvc4的框架,数据库链接用的是dapper。项目用了过滤器,写在BaseController里面,并且在Global.asax文件里要进行注册,其中UserLoginController没有继承BaseController,HomeController继承了BaseController。

  

  重要的代码有两段,一段就是登陆时候成功后,用guid生成随机数,将这个随机数作为seeionid写到浏览器的cookie中,同时把该用户的信息,sessionid这些信息存到Memcached中。

  1. string sql = "select * from UserInfo where UName=@UName and UPwd=@UPwd";
  2. using (var conn = SqlHelper.Connection)
  3. {
  4. var loginUser1 = conn.QueryFirstOrDefault<UserInfo>(sql, new { UName = user.UName, UPwd = user.UPwd });
  5. var loginUser = SqlMapper.QueryFirstOrDefault<UserInfo>(conn,sql, new { UName = user.UName, UPwd = user.UPwd });
  6. if (loginUser == null)
  7. {
  8. return Content("用户名密码错误!");
  9. }
  10. else
  11. {
  12. Guid sessionId = Guid.NewGuid();//申请了一个模拟的GUID:SessionId
  13.  
  14. //把sessionid写到客户端浏览器里面去了(一定要把sessionid写到客户端,这样用户在访问其他web资源的时候,
    // 就会把cookie中的信息传给服务器,然后通过sessionid的key到Memcached中去取对应的值)
  15. Response.Cookies["sessionId"].Value = sessionId.ToString();
  16.  
  17. //再把用户的信息插入到Memcached中
  18. MemcacheHelper.Set(sessionId.ToString(), loginUser, DateTime.Now.AddMinutes());
  19. return Content("ok");
  20. }
  21. }

  而另一段比较重要的代码就写在过滤器里,根据浏览器发过来的sessionid来去memcache中查询数据,查到的话,表示校验成功,否则跳转回登陆界面。

  1. protected override void OnActionExecuting(ActionExecutingContext filterContext)
  2. {
  3. base.OnActionExecuting(filterContext);
  4.  
  5. //从cookie中获取咱们的 登录的sessionId
  6. string sessionId = Request["sessionId"];
  7. //如果sessionid为空值,则跳转到登录页面
  8. if (string.IsNullOrEmpty(sessionId))
  9. {
  10. //return RedirectToAction("Login", "Logon");
  11. Response.Redirect("/UserLogin/Index");
  12. return;
  13. }
  14.  
  15. object obj = MemcacheHelper.Get(sessionId);
  16. UserInfo user = obj as UserInfo;
  17. if (user == null)
  18. {
  19. //用户长时间不操作,。超时。
  20. Response.Redirect("/UserLogin/Index");
  21. }
  22.  
  23. LoginUser = user;
  24. //实现session的滑动机制
  25. MemcacheHelper.Set(sessionId, user, DateTime.Now.AddMinutes());
  26. }

关于memcached集群的配置很简单,写在MemcacheHelper中,只需要将Memcache的服务地址写进去就行,以逗号分开,之后再设置一下权重就好了。

  1. //通过客户端来进行memcached的集群配置,在插入数据的时候,使用一致性哈希算法,将对应的value值存入Memcached
  2. String[] serverlist = { "127.0.0.1:11211" , "127.0.0.1:11212" };
  3.  
  4. // 初始化Memcached的服务池
  5. SockIOPool pool = SockIOPool.GetInstance("test");
  6. //设置服务器列表
  7. pool.SetServers(serverlist);
  8. //各服务器之间负载均衡的设置比例
  9. pool.SetWeights(new int[] { });
  10. pool.Initialize();
  11. //创建一个Memcached的客户端对象
  12. mc = new MemcachedClient();
  13. mc.PoolName = "test";
  14. //是否启用压缩数据:如果启用了压缩,数据压缩长于门槛的数据将被储存在压缩的形式
  15. mc.EnableCompression = false;

  之后,将网站发布到iis上的不同的端口号上就行了。要是想有调试效果, 直接将项目复制两份,其中一个端口号改下,启动就好了。

最后发现,当登陆一个网站成功后,我们再去访问另一个网站(不要换浏览器,cookie),发现也能直接访问了。

  这样一个关于memcached的分布式缓存系统就完成了,再写的过程,又是知识加深的过程,书常读常新,加油

Memcache+cookie实现模拟session的更多相关文章

  1. Cookie &amp;&amp; Session &amp;&amp; Token

    Cookies Cookie的由来: HTTP 本身是一个无状态的 request/response 协议. server接收一个来自client的request, 处理完以后返回一个response ...

  2. cookie编码乱码问题与cookie禁用后session操作

    Cookie传输的值只能是ASCII码,该编码表相对老旧不含有很多符号与文字 特别是中文,所以在cookie传值过程中需要先转成相应的ASCII编码再解析 如下 URLEncoder.encode(& ...

  3. cookie窃取和session劫持

    Updates 2014-08-17 感谢@搞前端的crosser的提醒,加入了HTTP Response Splitting的内容. 此篇文章的Presentation戳这里. 一.cookie的基 ...

  4. cookie机制和session机制的原理和区别[转]

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于在服务器端保持状态的 ...

  5. cookie机制和session机制的区别(面试题)

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...

  6. PHP cookie禁用时session 方案

    在PHP中使用过SESSION的朋友可能会碰到这么一个问题,SESSION变量不能跨页传递.这令我苦恼了好些日子,最终通过查资料思考并解决了这个问题.我认为,出现这个问题的原因有以下几点: 1.客户端 ...

  7. session和cookie介绍以及session简单应用

    介绍http协议与TCP协议:        http协议:是短连接,关闭浏览器的时候断开与服务器的连接         TCP协议:是长连接,连接一直存在         http协议是在TCP协议 ...

  8. Cookie禁用 获取session

    转自:http://blog.csdn.net/u010433704/article/details/40950599 Cookie与 Session,一般认为是两个独立的东西,Session采用的是 ...

  9. 关于PHP中浏览器禁止Cookie后,Session能使用吗?

    sessionid是存储在cookie中的,解决方案如下: Session URL重写,保证在客户端禁用或不支持COOKIE时,仍然可以使用Session session机制.session机制是一种 ...

随机推荐

  1. webApi签名验证

    还是一如既往先上结构图如下: 上一讲说明了redis,也谢谢心态的建议.这里经过改进后的redis的地址 当然这里是加密了的,具体实现如下图: 这里提供的解密. 先把加密解密的帮助类放上来. usin ...

  2. 基于Python + requests 的web接口自动化测试框架

    之前采用JMeter进行接口测试,每次给带新人进行培训比较麻烦,干脆用python实现,将代码和用例分离,易于维护. 项目背景 公司的软件采用B/S架构,进行数据存储.分析.管理 工具选择 pytho ...

  3. 免费在线生成彩色带logo的个性二维码

          码工具网站提供免费的在线二维码生成服务,可以把网址.文本.电子邮件.短信.电话号码.电子名片.wifi网络等信息生成对应的二维码图片.你可以设置二维码图片的格式(png,jpg,gif). ...

  4. cpp(第十一章)

    1. std::istream & operator>>(std::istream &is,complex_c &t) { std::cout<<&qu ...

  5. maven无法加载本地jar包以及maven项目打包后本地jar包没有打进项目的问题解决办法

    1.首先设置依赖项,这样maven就会把该路径下的jar包导入项目引用 <dependency> <groupId>DPSDK-Manager</groupId> ...

  6. 测序分析软件-trimmomatic的记录

    1.下载相关软件,网址:http://www.usadellab.org/cms/index.php?page=trimmomatic,它有源代码和二进制两种文件(建议都下载,然后合并成一个文件,因为 ...

  7. canvas水波纹效果

    先看效果 演示效果 自然界中水波纹效果十分麻烦,我这里只是根据水波纹的几个特性,在理想环境下模拟水波纹的扩散效果. 这里应用到的属性有:扩散.波动.折射. 扩散:很好理解,水波纹会从触发原点开始向周围 ...

  8. php实现获取汉字的首字母

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...

  9. PHP+MySql实现后台数据的读取

      我们使用的是PHP 的php_mysqli扩展   首先了解一些基础的用法  1.连接数据库使用 mysqli_connect()  参数:①主机地址 ②MYSQL用户名 ③MYSQL密码 ④选择 ...

  10. java 生产者 与 消费者的案例

    主要理解了两个问题 1.线程数据同步的问题 2.线程交替运行的方式 package ThreadDemo; /** * 生产者与消费者的案例(一,同步的问题,值的问题 二,交替执行的问题) * @au ...