XSession 是一个解决现有老项目中Session性能问题的类库。
- 一个用户的多个并发请求,在服务端以串行的方式执行,出现Session阻塞。
- Session数据的加载耗时:请求外部进程 -> 读取Session数据 -> TCP传输 -> 反序列化
- Session数据的保存耗时:Session结构序列化 -> TCP传输 -> 外部存储进程 -> 持久化
Session对性能有较大影响的就是前二类场景。
此外,一个用户的Session数据视为一个整体做存储和加载,即使请求中只使用一个key/value,也会导致全部加载,更新时亦然。当Session数据中存放“大对象”时将会影响性能。
- Session阻塞请求:自行实现【无锁的】SessionStateStoreProvider,根本消除阻塞问题。
- Session加载耗时:采用内存优先的读取方式,加载耗时几乎为零。
- Session保存耗时:采用本地文件存储,避免远程调用和网络传输,并保证稳定可靠。
如果没有特殊的原因,建议不要使用 Session !
// 例如:
var xx = httpContext.Session["someKey"];
// 等同于:
string key = GetCookie("userId") + "someKey";
var xx = SomeCache.Get(key);
说明:这里的Cache是指一些外部的缓存组件,诸如 Memcache, Redis 之类。
XSession提供了二个 “Session存储” 的实现类:
- FileSessionStateStore: 采用文件存储Session数据
- FastSessionStateStore: 采用文件和Cache存储Session数据
FileSessionStateStore特点:
- 参考PHP之类的做法,将Session数据保存在文件中,避免程序重启导致Session数据丢失
- 使用文件存储可以减少网络调用开销,提升性能。
- 注意事项:需要在负载均衡上设置【用户会话关联】
FastSessionStateStore主要优化点在于:
- 内部包含FileSessionStateStore的所有功能,用文件做Session数据的持久化
- 进一步提升Sessio加载性能:Session数据写入文件时,同时存放一份在内存中,加载时优先从内存中获取
- 避免32位内存不够用时导致OOM,“内存优先”功能仅在64位运行时时有效
在 web.config 中配置 customProvider
<system.web>
<sessionState mode="Custom" customProvider="FastSessionStateStore" cookieless="false" timeout="30" >
<providers>
<add name="FastSessionStateStore" type="XSession.Modules.FastSessionStateStore, XSession.Modules"/>
</providers>
</sessionState>
</system.web>
<system.webServer>
<modules>
<add name="SessionMonitorModule" type="XSession.Modules.Debug.SessionMonitorModule, XSession.Modules" preCondition="integratedMode"/>
</modules>
</system.webServer>
使用建议:
- 可直接使用 FastSessionStateStore
- 如果内存不够大,可使用 FileSessionStateStore
- SessionDetectionModule 用于提供一些诊断信息,可自行决定要不要使用。
- 最近300个请求的Session数据项明细
- Session数据文件列表
- 查看Session数据文件内容
- ASP.NET Cache 列表
- Session 数据类型清单
- 运行环境参数
- SessionCodeAnalysis:代码分析工具,扫描Session的使用方法
- WebApplication1:测试站点
- XSession.Modules:解决Session性能问题的工具类库项目