请教高手关于缓存用户信息后信息混乱的情况。

shengyongwang 2012-09-27 10:06:06
请教一个问题。在asp.net中我写了一个基类,在基类里面缓存了登陆人的信息,所有页面继承这个基类。结果当第一个人登陆后,第二个人登陆了就显示了第一个人的信息。请问这个怎么解决。
我基类的方法如下:

PerModel.usr_userView model = Cache["BasePage_userModel"] as PerModel.usr_userView;//从缓存中读取数据
if (model == null)
{
string[] tableName = new string[] { "Usr_User", "Per_Dictionary", "Architecture" };
AggregateCacheDependency aggregateDependency = new AggregateCacheDependency();//实例化AggregateCacheDependency,用于多个实例SqlCacheDependency的加载
model = userBll.GetUserInfo(Session["UserId"].ToString());
foreach (string table in tableName)
{
aggregateDependency.Add(new SqlCacheDependency("NewOA", table));//把依赖实例加载到数组中
}
if (model != null)
{
Cache.Insert("BasePage_userModel", model, aggregateDependency);//添加到缓存中
}
}
if (model != null)
{
UserID = model.ID;
UserLoginName = model.UserId;
UserRealName = model.UserName;
DepartmentID = model.Org;
DepartmentName = model.OrgName;

}
}
...全文
270 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
shengyongwang 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 12 楼 的回复:

引用 11 楼 的回复:
建议不要使用这样。。开销比较大,而且不能同步信息。。将UserID保存在Session中就可以了,基类实例化的时候读下数据还是稍微好点。。

谢谢,还是不用缓存了。但是我不太清楚,缓存在什么情况下使用才不会出现我这种情况。


缓存就是 大家公用的

你改了以后 其他人读到的 就是改变后的东西

如果要考虑自己单独用 要……
[/Quote]
因为我这个读取用户信息写在基类里面,所有的页面都继承了基类,这样任何一个操作比如新建,修改等都会到基类再次读取用户信息,如果用Session保存id,然后根据id查询Model,这样一个用户会查询无数遍,造成资源的浪费。
如果我用缓存,只需要第一次登陆后缓存一次,以后每次缓存都可以从缓存里面读取。并且缓存是数据库依赖的,只要数据库的信息变了,缓存会自动清空。
二当家 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]

引用 11 楼 的回复:
建议不要使用这样。。开销比较大,而且不能同步信息。。将UserID保存在Session中就可以了,基类实例化的时候读下数据还是稍微好点。。

谢谢,还是不用缓存了。但是我不太清楚,缓存在什么情况下使用才不会出现我这种情况。
[/Quote]

缓存就是 大家公用的

你改了以后 其他人读到的 就是改变后的东西

如果要考虑自己单独用 要么用session 要么每个缓存加标识 但是加了标识 还要增加额外的代码来设置和读取标识
shengyongwang 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]
建议不要使用这样。。开销比较大,而且不能同步信息。。将UserID保存在Session中就可以了,基类实例化的时候读下数据还是稍微好点。。
[/Quote]
谢谢,还是不用缓存了。但是我不太清楚,缓存在什么情况下使用才不会出现我这种情况。
qvbzyx 2012-09-27
  • 打赏
  • 举报
回复
建议不要使用这样。。开销比较大,而且不能同步信息。。将UserID保存在Session中就可以了,基类实例化的时候读下数据还是稍微好点。。
shengyongwang 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
你把用戶的信息保存在緩存的BasePage_userModel对象中,第二個用戶登录的时候会判断
if (model != null)。。这里肯定不部位NULL的,因为服务端存已经存在BasePage_userModel的缓存对象,所以读取的是第一个缓存的,除非这个时候缓存过期。。

你把BasePage_userModel改成BasePage_userModel+UserID。。加一个表示……
[/Quote]
我这样试试,应该可以。只是不知道和3楼所说的一样,为每个用户都缓存系统开销是否很大。
qvbzyx 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

引用 4 楼 的回复:

实际上catch和Session在使用的时候都是一样的。全部保存在IE浏览器的cockie中。


胡说八道
[/Quote]
根据我的了解,cache缓存在服务端内存。。主要看你怎么缓存,浏览器不会有。。Session在浏览器只是缓存一个SessionID,提交的时候只是判断这个SessionID在不在。。
二当家 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

实际上catch和Session在使用的时候都是一样的。全部保存在IE浏览器的cockie中。
[/Quote]

胡说八道
qvbzyx 2012-09-27
  • 打赏
  • 举报
回复
你把用戶的信息保存在緩存的BasePage_userModel对象中,第二個用戶登录的时候会判断
if (model != null)。。这里肯定不部位NULL的,因为服务端存已经存在BasePage_userModel的缓存对象,所以读取的是第一个缓存的,除非这个时候缓存过期。。

你把BasePage_userModel改成BasePage_userModel+UserID。。加一个表示用户的ID就可以了
二当家 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

实际上catch和Session在使用的时候都是一样的。全部保存在IE浏览器的cockie中。
[/Quote]

Cache 谁告诉你保存在cookie里的?

Session也只是把sessionid存在cookies里
二当家 2012-09-27
  • 打赏
  • 举报
回复
其实你可以把用户登录信息放在session里
一般都是这么干的
  • 打赏
  • 举报
回复
实际上catch和Session在使用的时候都是一样的。全部保存在IE浏览器的cockie中。
二当家 2012-09-27
  • 打赏
  • 举报
回复
缓存 你可以当成全局变量看

如果你为每个用户都加个缓存,系统开销上反而得不偿失
shengyongwang 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
唯一性标识
[/Quote]
是不是把缓存的名字加一个唯一性标示。
a21999 2012-09-27
  • 打赏
  • 举报
回复
唯一性标识
Im_Sorry 2012-09-27
  • 打赏
  • 举报
回复
建议把一些稍微重要的数据,加密放入COOKIE,这样会好很多! 重要数据就不要这么做了!
shengyongwang 2012-09-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
好多观点真的是错的。
[/Quote]
请问大侠,能否帮我把错误的观点指出来,我好学习学习,谢谢。
xuan.ye 2012-09-27
  • 打赏
  • 举报
回复
好多观点真的是错的。

62,204

社区成员

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

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

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

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