ASP.NET中缓存和静态类的使用问题

实现“缓存“功能的常见的有Session,Cache等等。而静态变量貌似也能实现“缓存”的功能,目前遇到的问题就是清除缓存的问题。需求是这样的,用户登录时(可能会有多个用户同时登录),会从数据库中读取最新的信息列表放入缓存,当他注销或者关闭页面时,就需要清除掉自己的缓存。不知道静态变量 public static Dictionary<key,value> InfoList;这个能不能满足这个要求?如果可以的话,Cache岂不是没什么作用了?如果这样不行的话,怎样的解决方案可以实现这个要求呢?还有,这些缓存都是存在服务器端的吗?。。还望各位前辈不吝赐教。谢谢!
...全文
393 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
千宫纱 2015-12-15
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
每个用户自己的信息用session就可以了,没必要static或者cache
那是因为你还没用到全局对所有登录用户信息统一管理这种功能才不需要,比如校验一个用户是否已在别处登陆,这个就挺好用的,当然,单纯声明一个public static Dictionary<key,value>是不行的,差远着呢....
tomkillua 2015-01-27
  • 打赏
  • 举报
回复
楼主你的问题没有表述明白,感觉不是一个问题。有点看不懂。
  • 打赏
  • 举报
回复
引用 13 楼 u013324517 的回复:
[quote=引用 11 楼 Z65443344 的回复:] 你这是要自己实现session的节奏吗 已经有session了为什么要自己实现
前辈,前提是,当用户注销或者关闭页面时,就需自动清除掉自己的缓存信息的。Session不能达到这个要求啊,所以我问大家,这里使用的静态变量能不能达到这种要求,就是在关闭后这些信息就没了[/quote] Session 集合保存的数据,跟“缓存”根本不是同一个概念。你那个就是想保存在人家的Session集合中。 缓存要处理的是全局的信息,比如说某个人相关信息查询结果是给整个系统使用的,跟这个人是否登录、会话Session无关!
  • 打赏
  • 举报
回复
.net的缓存依赖项(CacheDependency)具体实现机制还是比较少的,也就那么5、6种。你还可以自己继承这个类,编写你自己的缓存依赖项类型。总之要是不懂如何为每一个Cache单元设置CacheDependency,那么基本上就等于不太会用Cache。尽管你在执行 Cache.Insert(....) 语句时不去设置自己的 CacheDependency 参数,那么Cache系统也还是会经常清除缓存单元。这才是缓存的! 而你弄个 Dictonary<,> 变量,里边的数据又不会自动消失,这只会滥用内存、降低内存的性价比,没有达到缓存的作用。只能说明你的程序太小,滥用内存也崩溃不了、没有被你的老板发现问题而已。
  • 打赏
  • 举报
回复
引用 14 楼 Z65443344 的回复:
[quote=引用 12 楼 u013324517 的回复:] [quote=引用 10 楼 starfd 的回复:] session有默认超时时间的,你觉得默认的20分钟太长,设置成5分钟就可以了
页面关闭时,缓存信息自动失效。Session可以这样吗?[/quote] 用户如果关闭了页面,再次进入你的网站,会重新给他分配一个SessionID 原来的可能也还在,要等超时了才会清除,不过跟新登录的已经没有关系了[/quote] 那看来目前只能使用Session让它自动失效了。谢谢各位的回答!
  • 打赏
  • 举报
回复
引用 楼主 u013324517 的回复:
实现“缓存“功能的常见的有Session,Cache等等。而静态变量貌似也能实现“缓存”的功能,目前遇到的问题就是清除缓存的问题。需求是这样的,用户登录时(可能会有多个用户同时登录),会从数据库中读取最新的信息列表放入缓存,当他注销或者关闭页面时,就需要清除掉自己的缓存。不知道静态变量 public static Dictionary<key,value> InfoList;这个能不能满足这个要求?如果可以的话,Cache岂不是没什么作用了?如果这样不行的话,怎样的解决方案可以实现这个要求呢?还有,这些缓存都是存在服务器端的吗?。。还望各位前辈不吝赐教。谢谢!
Cache是真正的缓存。如果你把所有的内存都叫做缓存,那说明你并没有搞明白内存跟缓存的区别。这就好像没有搞明白胃跟食物的区别一样。 内存总共就有那么(允许你用某一个网站用的)几百M,而要高速缓存信息,每一天,你可能需要缓存几千M甚至突破上万M的内容!这些内容有些是缓存了10秒钟就清除了,有些是缓存了10分钟才清除,数十万的缓存单元的生存期各不相同(根据各自的缓存依赖条件而动态计算生存期)。比如说当物理内存空间较少时,有些缓存单元就自动清除了。更多的缓存单元是因为数据库内容发生了变化而被自动清除。 你把一些数据保存到内存变量,这叫什么缓存?这不过是一些人胡乱用“缓存”这个概念的表现。 缓存的关键是设置丰富“缓存项”,然后.net系统自动清理缓存。缓存的技术体现就在于能恰当地设置缓存自动丢失策略,才能让少量(几十M)的内存当极大(几千M)的内存使用,提高缓存使用率。 如果你只知道“内存无限大,可以用来当数据库使用”这叫什么缓存策略啊?直接就叫做内存数据库不就完了嘛。
於黾 2015-01-27
  • 打赏
  • 举报
回复
你要自己实现session,要考虑的问题可多了 如果用户没有正常退出 而是关页面,关IE,关机,拔网线,你咋办?
於黾 2015-01-27
  • 打赏
  • 举报
回复
引用 12 楼 u013324517 的回复:
[quote=引用 10 楼 starfd 的回复:] session有默认超时时间的,你觉得默认的20分钟太长,设置成5分钟就可以了
页面关闭时,缓存信息自动失效。Session可以这样吗?[/quote] 用户如果关闭了页面,再次进入你的网站,会重新给他分配一个SessionID 原来的可能也还在,要等超时了才会清除,不过跟新登录的已经没有关系了
  • 打赏
  • 举报
回复
引用 11 楼 Z65443344 的回复:
你这是要自己实现session的节奏吗 已经有session了为什么要自己实现
前辈,前提是,当用户注销或者关闭页面时,就需自动清除掉自己的缓存信息的。Session不能达到这个要求啊,所以我问大家,这里使用的静态变量能不能达到这种要求,就是在关闭后这些信息就没了
  • 打赏
  • 举报
回复
引用 10 楼 starfd 的回复:
session有默认超时时间的,你觉得默认的20分钟太长,设置成5分钟就可以了
页面关闭时,缓存信息自动失效。Session可以这样吗?
於黾 2015-01-27
  • 打赏
  • 举报
回复
你这是要自己实现session的节奏吗 已经有session了为什么要自己实现
  • 打赏
  • 举报
回复
session有默认超时时间的,你觉得默认的20分钟太长,设置成5分钟就可以了
  • 打赏
  • 举报
回复
引用 6 楼 starfd 的回复:
每个用户自己的信息用session就可以了,没必要static或者cache
这里主要是想实现用户关闭页面或者注销登录时他的这些信息能够被清除。Session可以在注销登录的时候清除掉,但是关闭页面时我不知道该如何做。这里尝试使用静态的变量当做缓存,但不知道在页面关闭的时候,用户的个人信息是不是消失了。这也是我问这个问题的初衷。
  • 打赏
  • 举报
回复
引用 7 楼 Z65443344 的回复:
[quote=引用 5 楼 u013324517 的回复:] [quote=引用 3 楼 Z65443344 的回复:] public static Dictionary<key,value> 你用什么作为key,用户名吗 那每个用户就只保存1个数据吗?
以用户ID来作为key,List<T>是用户的列表信息。这样说来每个用户是只需要保存一个数据的,只不过这个数据是一个泛型集合。[/quote] 集合是引用类型啊,你这个集合是实例对象还是静态对象?? 如果是静态的,那就没法给每个用户指定一个 如果是实例的,那你不如连字典也是实例的,弄个静态字典还有任何意义?[/quote] 集合是实例对象,登录的时候从数据库中获取的。每一个用户都有自己的集合信息,因此弄成键值对,使用静态是因为全局都要用的。每一个页面都需要访问这些数据,而每次都去查询数据库会影响效率。因此这里定义静态的变量当做缓存使用,但是不清楚这样的缓存和真正的缓存Cache有什么区别。如题,怎样实现用户注销或者关闭网页时清除缓存。希望前辈能够提点提点..
於黾 2015-01-27
  • 打赏
  • 举报
回复
引用 5 楼 u013324517 的回复:
[quote=引用 3 楼 Z65443344 的回复:] public static Dictionary<key,value> 你用什么作为key,用户名吗 那每个用户就只保存1个数据吗?
以用户ID来作为key,List<T>是用户的列表信息。这样说来每个用户是只需要保存一个数据的,只不过这个数据是一个泛型集合。[/quote] 集合是引用类型啊,你这个集合是实例对象还是静态对象?? 如果是静态的,那就没法给每个用户指定一个 如果是实例的,那你不如连字典也是实例的,弄个静态字典还有任何意义?
  • 打赏
  • 举报
回复
每个用户自己的信息用session就可以了,没必要static或者cache
  • 打赏
  • 举报
回复
引用 3 楼 Z65443344 的回复:
public static Dictionary<key,value> 你用什么作为key,用户名吗 那每个用户就只保存1个数据吗?
以用户ID来作为key,List<T>是用户的列表信息。这样说来每个用户是只需要保存一个数据的,只不过这个数据是一个泛型集合。
  • 打赏
  • 举报
回复
引用 2 楼 wyd1520 的回复:
public static 。。。 会被进程池回收哦。。。
不明觉厉....能讲详细一点吗?
於黾 2015-01-27
  • 打赏
  • 举报
回复
public static Dictionary<key,value> 你用什么作为key,用户名吗 那每个用户就只保存1个数据吗?
本拉灯 2015-01-27
  • 打赏
  • 举报
回复
public static 。。。 会被进程池回收哦。。。
加载更多回复(1)

62,046

社区成员

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

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

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

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