如果我们正在使用Session,那么构建高性能可扩展的ASP.NET网站,就必须解决分布式Session的架构,因为单服务器的SESSION处理能力会很快出现性能瓶颈,这类问题也被称之为Session同步。微软有自己的分布式Session的解决方案,那就是SessionStateServer,我们可以参考:

ASP.NET Session State Partitioning  
http://blog.maartenballiauw.be/post/2008/01/23/ASPNET-Session-State-Partitioning.aspx

ASP.NET load balancing and ASP.NET state server  
http://blog.maartenballiauw.be/post/2007/11/ASPNET-load-balancing-and-ASPNET-state-server-(aspnet_state).aspx

不过本文是要换一个方案,那就是使用Memcached来到达分布式SESSION的架构。Memcached作为分布式的缓存服务器已经被广泛应用在网站建设中。

一:Session的机制

Session是针对用户的,我们也可以理解为是针对浏览器的。在浏览器首次访问ASP.NET网页的时候(网页没有关闭session功能),它会发送如下的HTTP头给客户端:

浏览器在收到上面的HTTP头后,会将这个唯一的SESSIONID保存在自己的COOKIE中(只要没有禁用COOKIE,本文不讨论禁用COOKIE的案例,可参考本博文http://www.cnblogs.com/fish-li/archive/2011/07/31/2123191.html,写的很NICE)。当浏览器再次请求服务器进行访问的时候,它会在请求HTTP头中加入如下的标识,我们可以看到,这个SESSIONID就是上面的SESSIONID:

浏览器和服务器间就是通过这样一种机制来确保用户SESSION的。

如果客户端浏览器禁用了Cookie会怎么样,我们会发现每一次刷新浏览器Set-Cookie都是不同的,而发送请求头中也永远不会出现Cookie标识。这个时候,我们会发现Session失效了(当然,微软为了防止出现这种情况,允许我们在sessionState中设置cookieless="true",用URL来传递sessionid)。

二:Memcached Providers

我使用的Memcached客户端是Memcached Providers,下载完毕后,你会发现Memcached Providers已经提供了对分布式Session的支持功能。如果你还不会使用Memcached Providers,请参考此文Memcached Tip 1:使用Memcached Providers。Memcached Providers提供的示例是直接将SESSION存储在数据库,我们可以通过配置来将SESSION支持存储在分布式SESSION的内存中,即,将下文中的dbType由SQL修改为none。:

使用Memcached Providers提供的分布式Session没有任何特别之处,因为Memcached Providers提供的SessionStateProvider类型实现的是ASP.NET中的SessionStateStoreProviderBase这个抽象类,我们可以看到配置文件中指定了Session的处理类是SessionStateProvider,所以,ASP.NET在接受到客户端的请求后,会自觉滴使用SessionStateProvider来处理所有的SESSION,也正是这个类,完成了将SESSION读取和存储在Memcached中(如果设置了SQL,则会同步存储到SQLSERVER数据库)。

SESSION的设置和读取与传统没有任何区别,读:

Session["sname2"] = "sluminjxxi";
Session.Timeout = 2;

取:

Response.Write(Session["sname2"]);

三:为什么要配置SQL

传统的SESSION的缺点,在仅使用dbType为none配置的时候都会存在。如Memcached的内存到达上限的时候会怎么办?Memcached使用LRU淘汰算法(最久未使用),在这里我们不需要去细究这个算法在Memcached内部到底是什么样一个机制,我们只需要知道,在内存紧张的时候,即使SESSION时间未到,Memcached也有可能把它干掉。所以,保险的做法是,在Memcached之下,再加上SQLSERVER的持久化保存。如果缓存命中的,直接取缓存,如果缓存没命中的,则再到数据库中确认一次。当然,这样会带来一些性能损耗,但是却是更安全的做法。

Memcached Providers提供的下载文件中,提供了初始化SESSION的一些脚本,正确执行后,它会生成如下一个表tblSessions,及若干存储过程:

tblSessions保存的是就是单独的Session,如下:

四:Memcached Providers的一个BUG

在当前的Memcached Providers(1.2版本)中关于SessionStateProvider(29520-TRUNK)是有一个BUG(我已提交到codeplex,相信他们的下一个版本应该能得到修正)的。如果我们测试SESSION失效时间,发现只要经过一次刷新后,就永远是20分钟(即默认)。这源于在ReleaseItemExclusive这个重载方法中(该方法用于释放对会话数据存储区中项的锁定),对于Session的重新存储没有加上过期时间,如下:

注释掉的是Memcached Providers提供的源码,而正确的应该是我修正过的上一条。使用修正过的DLL,一切圆满了。

五:采用数据库存储SESSION的可扩展问题

随着访问量的进一步上升(当然,到了这种程度,说明网站做的很很成功,绝大部分的网站是不需要考虑这一步的),即便我们使用了Memcached作缓存,使用单一的SQLSERVER存储SESSION仍旧带来了性能问题,在这种情况下,我们对于数据库的设计可以采用水平分区的架构,即根据某种算法(可以根据SESSIONID,或者用户名等)将SESSION存储到不同的数据库中。这个时候,如果我们仍旧使用Memcached Providers,那么必须进一步修改源码了,由原先支持单一SQLSERVER服务器,编程支持多个服务器。当然,如果不喜欢SQLSERVER,还可以修改为支持mysql、mongodb、任何自定义的KEY-VALUE框架等等,此为后话,暂且不表。

本文转自最课程陆敏技博客园博客,原文链接:http://www.cnblogs.com/luminji/archive/2011/11/03/2195704.html,如需转载请自行联系原作者

ASP.NET性能优化之分布式Session相关推荐

  1. 进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式

    进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式 优知学院 2018-09-05 07:21:00 1.大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大 ...

  2. ASP.NET Core中间件实现分布式 Session(转载)

    ASP.NET Core中间件实现分布式 Session 1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件 ...

  3. ASP.NET性能优化小结(ASP.NETC#)(转)

    原文转自:http://www.jb51.net/article/25937.htm 一.返回多个数据集  检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够 ...

  4. asp.net 性能优化细节

    asp.net程序性能优化的七个方面 (转) 2007-12-27 04:57 一.数据库操作 转自: http://www.itimes.com.cn/blog/205/look.aspx 1.用完 ...

  5. Asp.net性能优化-提高ASP.Net应用程序性能的十大方法

    一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的 ...

  6. asp.net性能优化

    转载自:http://www.chinaz.com/Program/.NET/103142JH008.html 一.SqlDataRead和Dataset的选择 Sqldataread优点:读取数据非 ...

  7. asp.net oracle优化,[转]ASP.NET性能优化

    显示即可. 如果用了服务端控件,将: runat="server"去掉,也会提高效率. 2.禁用服务端控件的状态视图,有些控件不需要维护其状态,可以设置其属性: EnableVie ...

  8. Asp.Net性能优化.

    (一).选择会话状态存储方式     在Webconfig文件配置:     <sessionState mode="???" stateConnectionString=& ...

  9. ASP.NET性能优化之构建自定义文件缓存

    ASP.NET的输出缓存(即静态HTML)在.NET4.0前一直是基于内存的.这意味着如果我们的站点含有大量的缓存,则很容易消耗掉本机内存.现在,借助于.NET4.0中的OutputCacheProv ...

最新文章

  1. 链表基本功能:初始化、增、删、查、改
  2. Raspbian安装Opencv3
  3. 【NOI 2018】归程(Kruskal重构树)
  4. 玩转POI、EasyExcel报表导入导出!
  5. 由相机的自身参数求解内参矩阵
  6. android 快速启动服务,Android应用快速启动设计
  7. MySQL数据库基本操作语法
  8. 2021年广东新高考学业水平考试成绩查询,2021年1月广东高中学业水平考试成绩查询时间及入口...
  9. IP通信基础 3.21
  10. dll注入之SetWindowsHookEx 键盘消息钩子
  11. uva 10066 The Twin Towers (最长公共子序列)
  12. JS正则表达式匹配域名
  13. Android wifi 信号强度单位 dbm
  14. Spark总结之RDD(四)
  15. 为Exynos4412移植U-Boot-2017.11的步骤(一)——让U-Boot跑起来
  16. 数字格式化、大数据BigDecimal、随机数生成方法random()
  17. MySQL主从同步设置
  18. Blender新手入门练习 宝剑
  19. 逐梦的人啊,愿你我在未来都可以舒适的生活,加油~
  20. IEEE 2022年网络、计算机和通信国际学术研讨会(ISNCC2022)

热门文章

  1. 信用指數旁的星星表示什麼?
  2. 动机的寓言:孩子为谁在玩
  3. 使用asp.net mvc开发应用程序,页面中的page.IsPostback还有用处吗?
  4. 软考信息系统项目管理师_信息系统项目管理基础---软考高级之信息系统项目管理师009
  5. Netty工作笔记0034---Netty架构设计--线程模型
  6. ARCGIS地理信息系统学习笔记001--认识ARCGIS
  7. EJB3.0框架实例----区分有状态bean和无状态bean
  8. opencv不能读取MP4格式文件
  9. 1003 C语言输入以某个特殊输入为结束标志
  10. 初学angularJS 个人总结 错误排除