HTML5技术

Session分布式共享 = Session + Redis + Nginx - 傲翼飞寒

字号+ 作者:H5之家 来源:H5之家 2017-03-10 16:00 我要评论( )

一、 Session 1、Session 介绍 我相信,搞Web开发的对Session一定再熟悉不过了,所以我就简单的介绍一下。 Session:在计算机中,尤其是在网络应用中,称为“会话控制”。 每个用户(浏览器)首次与web服务器建立连接时,就会产生一个Session,同时服务器会分

一、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原理不是本文介绍重点,所以请大家自行度娘。

image

 

2、又爱又恨的Session

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

【常见问题请见下图】

     

image

      我相信一见到这个问题,老程序员都会心里一哆嗦,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(别问我怎么找到的,因为我英文过了四级,我会使用度娘,嘿嘿)

image

 

【web.config配置如下】

【Global.asax】

void Application_Start(object sender, EventArgs e) { StackExchange.Redis.ConfigurationOptions redisConfigOpts = StackExchange.Redis.ConfigurationOptions.Parse(); RedisSessionProvider.Config.RedisConnectionConfig.GetSERedisServerConfig = (HttpContextBase context) => { return new KeyValuePair<string, StackExchange.Redis.ConfigurationOptions>( , redisConfigOpts); }; }

存储方法】

Session[] = "aa";

调用方法】

].ToString()

 !前方坑,请注意!

    如果你配置好Redis,并且做好上面这些配置,运行会出现以下问题,请更新RedisSessionProvider的依赖包StackExchange.Redis到最新。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 【G】开源的分布式部署解决方案(一) - 开篇 - 寻找和谐

    【G】开源的分布式部署解决方案(一) - 开篇 - 寻找和谐

    2017-01-24 14:01

  • ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 - 奔跑吧!小郭

    ASP.Net MVC4+Memcached+CodeFirst实现分布式缓存 - 奔跑吧!小郭

    2017-01-01 13:00

  • sessionStorage 和 localStorage 、cookie - goumingming

    sessionStorage 和 localStorage 、cookie - goumingming

    2016-12-29 12:01

  • WEB前端工程师(实践)制作天气预报难度:简单 - SessionOne

    WEB前端工程师(实践)制作天气预报难度:简单 - SessionOne

    2016-10-16 14:00

网友点评