ASP.NET性能优化之分布式Session
如果我们正在使用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相关推荐
- 进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式
进阶Java架构师必看书:大型架构+框架+性能优化+中间件+分布式 优知学院 2018-09-05 07:21:00 1.大型网站技术架构:核心原理与案例分析 本书通过梳理大型网站技术发展历程,剖析大 ...
- ASP.NET Core中间件实现分布式 Session(转载)
ASP.NET Core中间件实现分布式 Session 1. ASP.NET Core中间件详解 1.1. 中间件原理 1.1.1. 什么是中间件 1.1.2. 中间件执行过程 1.1.3. 中间件 ...
- ASP.NET性能优化小结(ASP.NETC#)(转)
原文转自:http://www.jb51.net/article/25937.htm 一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够 ...
- asp.net 性能优化细节
asp.net程序性能优化的七个方面 (转) 2007-12-27 04:57 一.数据库操作 转自: http://www.itimes.com.cn/blog/205/look.aspx 1.用完 ...
- Asp.net性能优化-提高ASP.Net应用程序性能的十大方法
一.返回多个数据集 检查你的访问数据库的代码,看是否存在着要返回多次的请求.每次往返降低了你的应用程序的每秒能够响应请求的次数.通过在单个数据库请求中返回多个结果集,可以减少与数据库通信的时间,使你的 ...
- asp.net性能优化
转载自:http://www.chinaz.com/Program/.NET/103142JH008.html 一.SqlDataRead和Dataset的选择 Sqldataread优点:读取数据非 ...
- asp.net oracle优化,[转]ASP.NET性能优化
显示即可. 如果用了服务端控件,将: runat="server"去掉,也会提高效率. 2.禁用服务端控件的状态视图,有些控件不需要维护其状态,可以设置其属性: EnableVie ...
- Asp.Net性能优化.
(一).选择会话状态存储方式 在Webconfig文件配置: <sessionState mode="???" stateConnectionString=& ...
- ASP.NET性能优化之构建自定义文件缓存
ASP.NET的输出缓存(即静态HTML)在.NET4.0前一直是基于内存的.这意味着如果我们的站点含有大量的缓存,则很容易消耗掉本机内存.现在,借助于.NET4.0中的OutputCacheProv ...
最新文章
- 链表基本功能:初始化、增、删、查、改
- Raspbian安装Opencv3
- 【NOI 2018】归程(Kruskal重构树)
- 玩转POI、EasyExcel报表导入导出!
- 由相机的自身参数求解内参矩阵
- android 快速启动服务,Android应用快速启动设计
- MySQL数据库基本操作语法
- 2021年广东新高考学业水平考试成绩查询,2021年1月广东高中学业水平考试成绩查询时间及入口...
- IP通信基础 3.21
- dll注入之SetWindowsHookEx 键盘消息钩子
- uva 10066 The Twin Towers (最长公共子序列)
- JS正则表达式匹配域名
- Android wifi 信号强度单位 dbm
- Spark总结之RDD(四)
- 为Exynos4412移植U-Boot-2017.11的步骤(一)——让U-Boot跑起来
- 数字格式化、大数据BigDecimal、随机数生成方法random()
- MySQL主从同步设置
- Blender新手入门练习 宝剑
- 逐梦的人啊,愿你我在未来都可以舒适的生活,加油~
- IEEE 2022年网络、计算机和通信国际学术研讨会(ISNCC2022)
热门文章
- 信用指數旁的星星表示什麼?
- 动机的寓言:孩子为谁在玩
- 使用asp.net mvc开发应用程序,页面中的page.IsPostback还有用处吗?
- 软考信息系统项目管理师_信息系统项目管理基础---软考高级之信息系统项目管理师009
- Netty工作笔记0034---Netty架构设计--线程模型
- ARCGIS地理信息系统学习笔记001--认识ARCGIS
- EJB3.0框架实例----区分有状态bean和无状态bean
- opencv不能读取MP4格式文件
- 1003 C语言输入以某个特殊输入为结束标志
- 初学angularJS 个人总结 错误排除