• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >ASP.NET > ASP.NET通过分布式Session提升性能

ASP.NET通过分布式Session提升性能

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了session asp.net,asp.net,asp net培训,asp和asp.net的区别,零基础学asp.net等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

如果我们正在使用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头给客户端:

image

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

image

浏览器和服务器间就是通过这样一种机制来确保用户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。:

image

使用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,及若干存储过程:

image

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

image

 

四:Memcached Providers的一个BUG

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

image

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

 

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

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

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Asp.net中安全退出时清空Session或Cookie的实例代码
  • 详解ASP.NET中Session的用法
  • ASP.NET在底层类库中获取Session C#类中获取Session 原创
  • asp.net基于session实现购物车的方法
  • ASP.NET中Session和Cache的区别总结
  • asp.net网站防恶意刷新的Cookies与Session解决方法
  • 实现Asp与Asp.Net共享Session的方法
  • ASP.NET 使用application与session对象写的简单聊天室程序
  • ASP.NET ASHX中获得Session的方法
  • ASP.NET中在一般处理程序中使用session的简单介绍

相关文章

  • 2017-05-11在vs2008中使用AJAX开发.net 2.0下的Web程序的方法
  • 2017-05-11.NET中用ICSharpCode.TextEditor自定义代码折叠与高亮
  • 2017-05-11ASP.NET简化编辑界面解决思路及实现代码
  • 2017-05-11ASP.NET调用javascript脚本的常见方法小结
  • 2017-05-11三步将Asp.Net页面输出到EXCEL里
  • 2017-05-11asp.net文件上传解决方案(图片上传、单文件上传、多文件上传、检查文件类型)
  • 2017-05-11详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
  • 2017-05-11jsp和asp.net共享session值示例代码
  • 2017-05-11.NET c# 单体模式(Singleton)
  • 2018-08-20WPF实现左右移动(晃动)动画效果

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • ASP.NET文本框密码赋默认值的方法
    • Asp.net自定义控件之单选、多选控件
    • asp.net导出excel的简单方法实例
    • 如何给ASP.NET Core Web发布包做减法详解
    • ASP.NET中Session和Cache的区别总结
    • 在ASP.NET 2.0中操作数据之四十六:使用SqlDataSource控件检索数据
    • asp.net显示自己的网页图标的几种方式
    • ASP.NET站点导航应用详解
    • Request.RawUrl 属性的应用收
    • Linq to XML 用一句话读出RSS文章列表代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有