2015-06-18 42 views
0

随着下面ASP.NET中的参照会话模块的结构:分布式会话实现细节

enter image description here

据我所知,当应用程序使用分布式会议提供者(在天青.eg Redis的), SessionStateModule将在请求开始时将用户的会话数据反序列化为Session字典。

我想知道的是模块是否会反序列化用户会话中的所有内容,或者只是在请求期间访问的会话条目?假设用户会话有3个条目A,B,C,并且只有条目B在当前请求中被读取,模块是否会从分布式会话中检索所有3个条目,将它们反序列化为会话字典?

如果它反序列化所有内容,用户会话中的数据越多,每个请求会变得越慢?因为需要检索/反序列化的数据越多

+1

是开始被发现,这就是为什么当我们移动存储我们在Redis的会议上,我们开始从会话移动的大项目,只是Redis的客户端缓存它们在Redis的直接和添加到期。另外请注意,如果您的会话中有非常大的项目,它也可以在保存时超时。 –

+0

@LiviuCostea感谢您的提示,这是有道理的 –

回答

1

是的,会话状态假定提供者反序列化/序列化整个状态,因此更多的数据存储更多的时间来开始/结束请求。

作为一个选项,如果您需要存储大量数据 - 在会话状态之外存储不常需要的部分,并在会话状态保存数据位置信息。请注意,您需要确定这种拆分状态存储的安全性和到期影响。

或者,如果您正在实施自己的提供商,则可以使用Item实现您自己的SessionStateStoreData class方法,该方法将根据需要动态查询项目。不幸的是,该类没有async版本,因此远程调用获取数据将导致请求处理代码中的意外延迟,并阻止来自处理请求的线程。

更多的细节可以从Implementing a Session-State Store Provider