首页 存档 技术 查看内容

Session分布式共享 = Session Redis Nginx

2018-3-30 13:00 |来自: 互联网 344 0

摘要: 来自:傲翼飞寒 - 博客园 链接:http://www.cnblogs.com/newP/p/6518918.html(点击尾部阅读原文前往) 一、Session 1、Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。 ...

来自:傲翼飞寒 - 博客园

链接:http://www.cnblogs.com/newP/p/6518918.html(点击尾部阅读原文前往)


一、Session


1、Session 介绍


我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。


Session:在计算机中,尤其是在网络应用中,称为“会话控制”。 每个用户(浏览器)首次与web服务器建立连接时,就会产生一个Session,同时服务器会分配一个SessionId给用户的浏览器。我们可以用Fiddler查看cookies中,会看到有一个ASP.Net_SessionId的cookie。大家都知道Http是无状态请求,但是ASP.Net中的Session仿佛又让Http请求变得有状态,其核心就在于这个叫ASP.Net_SessionId的cookie。大家可以想象一下,这个相当于数据库的Key,服务器那边再有个Session内容缓存表,是不是Session的内容就很容易得到了?当然Session不是那么简单,但Session原理不是本文介绍重点,所以请大家自行度娘。



2、又爱又恨的Session


刚接触程序开发的人一定爱死Session了,因为Session让Http从无状态变成有状态了,页面之间传值、用户相关信息、一些不变的数据、甚至于查出来的DataTable也可以放进去,取值的时候只需要Session[Key]即可,真是方便极了。Session真是个利器,人挡杀人佛挡杀佛,但任何事物被封为利器基本也是双刃剑,Session的许多问题我们不得不去面对。


【常见问题请见下图】


我相信一见到这个问题,老程序员都会心里一哆嗦,Session是导致这个原因之一,大家也会想到这个情景,“我去,是不是Session又丢了,让用户重新登录”,事故报告中会填写:.NET规定,用户登陆后长时间没操作导致的。解决方案为:把Session时间调到9999。


结果该发生的还是继续发生着,Session照样丢失。


【常见Session丢失原因】

1、Session超时,用户打开页面,页面长时间不操作会导致此原因

2、IIS应用程序池回收,或者重启

3、Web.Config修改,即IIS应用程序池重启

4、dll被替换或者动态页面修改,即IIS应用程序池重启

5、杀毒软件对.config文件进行扫描,可能会导致IIS应用程序池回收

6、用户浏览器禁用cookie

7、其他原因


其他原因有点不负责,但是好多程序员无法查明是什么原因导致Session丢失,但Session丢失我归结为两大类,一个是数据的Key丢了,一个是Session内容数据库的丢了,大家这样就好理解了,用户浏览器禁用cookie一定是Key没了。IIS应用程序池回收必定会导致Session的内容缓存表丢失,当然还有一些其他原因。


3、解决Session丢失的漫长路


解决过Session丢失的都会用到这几种方法


1、InProc:将Session存到进程内。

2、StateServer:将Session存到独立的状态服务中(Asp.Net State Service)。

3、SqlServer:将Session存到SqlServer中。

4、Cookieless:设置客户端Session存储的方式。


用了这些方法之后,有的是该丢还丢,有的是稳定了速度却慢了。


大家也注意到了,还有个这个Custom自定义模式,有人会说:“除了大牛,有几个敢写的啊,写出来有问题怎么办,算了算了。”等等,大家不要还停留在非开源模式下解决问题的思想,找找开源项目,一定能找到的,有人说ASP.NET上哪里找开源啊,非常简单NuGet,如果想了解开源,一定要学会使用NuGet。


二、Redis


1、前言


上文说了那么多,有人一定会说我是来解决Session丢失的,上哪里来的Session分布式共享,标题党,我还是继续用我的cookie吧。


我要说的是,几年前,在Stack Overflow上找到了这个方法解决了丢失问题,之后,发现这种方法还可以实现Session分布式共享。那就是运用Custom自定义模式,将Session持久化到Memcache和Redis中。Session丢失、以及持久化到SqlServer数据的性能问题也随之解决。


此种方法很适合老项目中大量应用Session而导致法搞成分布式而苦恼的.NET开发人员使用。因为很有可能老项目维护过程中,身边的JAVA团队、PHP团队,正在重构你的项目。


2、RedisSessionProvider


正文开始,首先,沿着我们的思路Session持久化到Memcache或者Redis中,通过nuget下载 RedisSessionProvider(别问我怎么找到的,因为我英文过了四级,我会使用度娘,嘿嘿)



【web.config配置如下】

声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系 [邮箱地址] 删除

路过

雷人

握手

鲜花

鸡蛋

相关分类

返回顶部