宝哥软件园

MVC利用Memcache Cookie解决分布式系统的共享登录状态 研究说明6

编辑:宝哥软件园 来源:互联网 时间:2021-09-07

为了解决单机处理的瓶颈,增强软件的可用性,需要将软件部署在多台服务器上,使多个二级子域按照业务功能分布在独立的服务器上,或者通过负载均衡技术(如DNS轮询、Radware、F5、LVS等)让多个通道共享一组服务器。).当我们把网站程序分成多台服务器时,由于Session受实现原理的限制,不可能跨服务器同步更新Session,导致很难通过Session共享登录状态。

我们使用MemCache Cookie方案来解决分布式系统共享登录状态的问题。

Memcache服务器本身就是一个Socket服务器,它的内部数据以键值对的形式存储在服务器内存中,本质上就是一个很大的哈希表。数据删除采用延迟删除机制。虽然Memcache不提供集群功能,但是通过客户端驱动很容易实现Memcache的集群配置。

首先,简单介绍一下Memcache的用法

1.下载并安装Memcache(Windows平台)

(1)将程序解压缩到磁盘上的任何位置

(2)进入cmd窗口,运行Memcached.exe-d安装服务。安装后,打开服务窗口,查看服务是否安装成功。

(3)直接在服务管理中启动服务,或者使用cmd命令net start 'Memcache Server '

(4)使用Telnet连接到Memcache控制台,验证服务是否正常。telnet 127.0.0.1 11211

使用stats指令查看当前Memcache服务器状态

2.程序中的用法

(1)在程序中添加对Memcached.ClientLibrary.dll的引用

(2)用C #操作Memcache的代码示例

string[]server list={ ' 192 . 168 . 1 . 100:11211 ',' 192 . 168 . 1 . 101336011211 ' };//初始化memcache serversSockIOPool池=SockIOPool的池。GetInstance(' test ');游泳池。SetServers(server list);游泳池。初始化();MC=new MemcacheClient();mc。PoolName=' testmc。EnableCompression=false游泳池。关机();//关闭连接池。让我们实现下面的方案

1.首先在公共层引入Memcached.ClientLibrary.dll,封装MemcacheHelper。

使用Memcached。ClientLibrary使用系统;命名空间PMS。common { public class MemcacheHelper { private static readonly MemcachedClient Mc=null;静态MemcacheHelper() {//最好放在配置文件中。String []服务器列表={'127.0.0.1:11211 ',' 10 . 0 . 0 . 132336011211 ' };//初始化池var pool=SockIOPool。GetInstance();游泳池。SetServers(server list);游泳池。init connections=3;游泳池。minCONNECTIONS=3;游泳池。MaxConnections=5;游泳池。SocketConnectTimeout=1000游泳池。SocketTimeout=3000游泳池。维护睡眠=30;游泳池。故障转移=真;游泳池。Nagle=false游泳池。初始化();//获取客户端实例MC=new memcached客户端{启用压缩=false };}///summary////store data/////summary//param name=' key '/param///param name=' value '/param///returns/returns public static bool set(string key,object value) {return mc.set (key,value);}公共静态bool Set(字符串键、对象值、DateTime时间){ return Mc。设置(键、值、时间);}///summary////get data/////summary///param name=' key '/param////returns/returns public static object get(string key){ return MC . get(key);}///summary////delete////summary//param name=' key '/param////returns/returns public static bool delete(string key){ return MC . key exists(key)MC . delete(key);} }}2.更改UserLogin方法userlogin,在用户成功登录后生成GUID,将此GUID存储在Cookie中,并以GUID为关键字将登录用户信息序列化到Memcache服务器中。

公共操作结果用户登录(){ # region验证码校验var验证代码=Session['验证代码']!=null?会话['validateCode'].ToString() :字符串。空的;如果(字符串IsNullOrEmpty(validateCode))返回内容(' no:验证码错误!');会话[“验证代码”]=null;var txt代码=请求['验证代码'];if(!有效代码.Equals(txtCode,StringComparison .不变量CultureIgnoreCase))返回内容(' no:验证码错误!');#结束地区变量用户名=请求['用户名'];var userPwd=Request[' PassWord '];//查询用户是否存在var user=UserService .加载实体(u=u . USerNAmE==USerNAmE u . PassPort==UserPwD).first ordefault();if(用户==null)返回内容(' no:登录失败');//产生一个全局唯一标识符值作为Memache的键var sessionId=Guid .NewGuid().ToString();//将登录用户信息存储到Memcache中MemcacheHelper。Set(sessionId,SerializeHelper .序列化字符串(用户),日期时间。现在。增加分钟(20分钟);//将Memcache的键以饼干的形式返回给浏览器回应cookie[' session id '].Value=sessionId返回内容(' ok:登录成功');}3.改变登录校验控制器过滤器控制器的操作执行方法,使其校验方式改为从Memcache服务器中读取饼干中值为键的对象:

受保护的覆盖action executing(actionexecuting context筛选器上下文)上的void { base .操作执行(过滤器上下文);//if(会话['用户]==null)如果(请求Cookies['sessionId']!=null) { var sessionId=Request .cookie[' Session id '].价值;//根据该值查Memcache .var obj=MemcacheHelper .获取(会话id);if (obj==null) { filterContext .结果=重定向('/登录/索引');返回;} var user=SerializeHelper .反序列化对象用户(obj .ToString());LoginUser=用户;//模拟出滑动过期时间MemcacheHelper .Set(sessionId,obj,DateTime .现在。增加分钟(20分钟);} else filterContext .结果=重定向('/登录/索引');}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

更多资讯
游戏推荐
更多+