求教:Session 的替代方案

shllshl 2013-09-06 01:30:18
项目中部分用session来存储全局变量,但配置IIS中的session过期时间比较麻烦,需要修改很多地方,打算放弃Seesion,改用数据库的方式存储。求做过这方面的给个思路。
...全文
376 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
shllshl 2013-09-08
  • 打赏
  • 举报
回复
回复sp1234: 和您说的这种情况类似。我目前想到就是在asp.net程序中每间隔一段时间更新第二个参数;在页面判断时,最后访问时间是20分钟以前的记录,则认定该用户退出。
  • 打赏
  • 举报
回复
“比如每天晚上23:00清理一次最后访问时间已经是20分钟以前的记录” 20分钟有点短了,改成2天吧。数据库中可以有很多冗余的记录是没有什么关系的,只要对SessionID进行索引。
  • 打赏
  • 举报
回复
引用 30 楼 shllshl 的回复:
回复sp1234: 请教:session不稳定,经常性几分钟就取不到值,怎么办呢?
如果纠结于Session集合,那么你就难以理解你自己说的所谓“改用数据库的方式存储”的含义了。 比如说你原来以为需要用Session保存用户的购物车(假设会话结束则丢弃购物车,而不需要永久保存),那么不使用Session,就意味着你可以在你的数据库表中创建一个叫做“购物车”的数据库表,只不过多出两个字段“SessionID,最后访问时间”。其中第一个字段,那么就是在你的asp.net程序中可以随时使用一条sql语句查询出购物车内容,跟原来的Session集合中的购物车是同一个意思。而第二个参数,是让你可以在将来可以清理用不着的记录(比如每天晚上23:00清理一次最后访问时间已经是20分钟以前的记录)。
shllshl 2013-09-08
  • 打赏
  • 举报
回复
回复sp1234: 很是感谢,查询很多资料未果,谢谢您不吝赐教。
  • 打赏
  • 举报
回复
关于多次重复查询的数据应该使用Cache来加速(通常平均可以让你的程序查询数据库部分快几十倍以上)的问题,可能对于你是个比较高级的问题,在刚开始学习编写asp.net程序时可以不考虑。 仅仅是知道如何在你的数据库中相应的数据表分别增加一个SessionID字段就够了!
shllshl 2013-09-08
  • 打赏
  • 举报
回复
回复sp1234: 请教:session不稳定,经常性几分钟就取不到值,怎么办呢?
  • 打赏
  • 举报
回复
引用 25 楼 shllshl 的回复:
回复18楼: 您的方式还是用到了session。我想做到的就是完全不用session。
实际上#18楼说的是Cache,只是搞不清楚session集合跟cache区别而已。 Session.SessionID属性是不会随着Session集合数据的丢失而丢失的,并且每一次创建的值都不相同,因此你可以使用在你的数据库表设计中。例如你可以为用户User记录中增加一个“sessionId nvarchar(40)”字段,那么用户登录时就可以把这个sessionId记录到用户资料的属性中。假设允许同一用户在多处登录,那么则可能是设计一个“Passport”数据库表,其中有一个字段“UserId"作为外键引用User记录,再有一个字段”sessionId”来记录会话编号。 在你的页面中,例如 Page_Load 事件处理中,你可以获取
var sessionId = this.Page.Session.SessionID;
然后查询数据库中去查一下此ID值是否存在,如果存在(已经登录)取出来相应的记录。 可见在数据库表中插入一个SessionID字段是很容易的,用不着做太多的什么设计。
  • 打赏
  • 举报
回复
Cache存在于进程中,进程重启了自然Cache就初始化了。但是不能因此就把什么都说成是Cache。 使用Cache,关键是懂得使用CacheDependency,也就是(例如)当数据库中与某个Cache单元数据有关的记录(或者数据库表)改变了,那么Cache单元数据就应该自动清空,而不能是脏数据。 同时Cache也可以自动、智能地平衡服务器内存,当内存占用涨到很大时,Cache自动会遗忘一些数据。 并且Cache也根本不是用来保存什么基础数据表的,而是用来缓存用户查询结果的,例如以一个sql语句(或者其md5)为key来保存这个sql查询的结果,这才是Cache。 跟Session完全无关。
  • 打赏
  • 举报
回复
引用 17 楼 ltcszk 的回复:
[quote=引用 1 楼 guwei4037 的回复:] 从数据库中读取数据,放到Cache中。Session确实有很多问题。
Session不就是基于Cache的吗? iis回收Cache也会丢失,有什么区别?[/quote] 跟Cache半点关系都没有。 Session集合(以及大堆东西,例如所有static变量)会丢失,是因为asp.net程序重启了。跟Cache没有关系。
shllshl 2013-09-08
  • 打赏
  • 举报
回复
回复BurnyMurphy: 您的方式好像也用到了session。
shllshl 2013-09-08
  • 打赏
  • 举报
回复
回复18楼: 您的方式还是用到了session。我想做到的就是完全不用session。
LcGyAn 2013-09-07
  • 打赏
  • 举报
回复
mencache
tcmakebest 2013-09-07
  • 打赏
  • 举报
回复
自己搞一套肯定没有系统自带的好,不知道有哪里是麻烦的啊。
燃烧土豆 2013-09-07
  • 打赏
  • 举报
回复
对不起更正下!session 本身亦是缓存。上面所指的是二级缓存SessionFactory,可以跨越Session存在,可以被多个Session所共享,不过得用NHibernate
燃烧土豆 2013-09-07
  • 打赏
  • 举报
回复
session cookie 都非稳定安全的方法,首先缓存,介于iis缓存不够,可以架设缓存服务器,还可以将菜单、权限都存于缓存
ltcszk 2013-09-06
  • 打赏
  • 举报
回复
引用 7 楼 shllshl 的回复:
[quote=引用 4 楼 ch_weni 的回复:] 全局变量??是每客户端吗SESSION
是的。比如用户ID、用户IP、用户登录状态等.[/quote] session说白了是种缓存,你不能把他当数据库来用 身份认证,你可以生成票据保存在cookie,票据里可以存用户id,用户名之类的数据 然后服务器端先找session里有没有东西,没有就用票据里的id,从数据库里取出需要的数据,缓存到session里。 用户ip根本不需要存,每个request都会带上ip的
ltcszk 2013-09-06
  • 打赏
  • 举报
回复
引用 1 楼 guwei4037 的回复:
从数据库中读取数据,放到Cache中。Session确实有很多问题。
Session不就是基于Cache的吗? iis回收Cache也会丢失,有什么区别?
终點-起點 2013-09-06
  • 打赏
  • 举报
回复
全局变量可以考虑用web.config、xml或数据库配置
shllshl 2013-09-06
  • 打赏
  • 举报
回复
引用 14 楼 ch_weni 的回复:
你为此站点单独配置IIS应用地址池也会好一些
Sorry 按错键了。恩 确实是,这边也是这么做的,但问题仍然存在。
凤凰涅檠 2013-09-06
  • 打赏
  • 举报
回复
你为此站点单独配置IIS应用地址池也会好一些
加载更多回复(13)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧