请问session配置,cache使用和web farm(农场),负载均衡的关系

coyun 2015-05-22 09:33:43
我有一个网站,用load balancer(负载均衡)技术把它放在两个服务器上。
我在global.asax里面存了一个缓存cache:
If HttpContext.Current.Response.Cache("TestCache")==""
{
HttpContext.Current.Response.Cache.Insert("TestCache",testdata);
}
(上面语法不一定对,但是是这个意思。)
然后我在aspx.cs的page_load里面读取这个Cache.如果Cache值为空,就提示出错。

以前测试的时候,都没有问题,2,3个人都测试可以。今天叫了10个人,出问题了。刚开是30分钟还好,过了30分钟,开始报错,显示Cache值为空。后来把网站重新启动(recycle)才又恢复正常。

1)是session的设置有问题吗?我是用InProc,看有些文献说如果网站是Web Farm,就不能用InProc。但是我虽然用的是InProc,在代码里没有存Session值,也没有读取Session值,这种情况也不能用InProc?
2)是Cache的使用有问题吗?按照我上面的设计,在global.asax里面设置了Cache的值,在page_load里面完全可以读取啊。

谢谢
...全文
183 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
skyandcode 2015-05-23
  • 打赏
  • 举报
回复
1. 是不是 Session 问题,你把Session 禁止了,试一下就知道了。看你代码中,没有与 Session 有关的代码,应该不是。 2. 你确定你是在用你想的“缓存”?分清: Response.Cache 与 HttpContext.Current.Cache 。 缓存不是像你这样用的。如果你只是在【本次请求期间】保存某些数据,那应该使用:HttpContext.Current.Items
  • 打赏
  • 举报
回复
引用 3 楼 coyun 的回复:
那我在web.config里面把sessionState改成StateServer,然后继续使用asp.net自带的Cache object,可以吗? HttpContext.Current.Response.Cache.Insert("TestCache",testdata);
缓存可以提供本机(本服务器)的asp.net应用提高效率。例如你有5台Web服务器,你的网站有10万幅图片可能被用户下载,许多用户请求、每一个页面上都会瞬间请求大量图片,那么在asp.net中使用Cache就能将98%以上流量全都留在本地内存搜索,而不需要通过后台的局域网、跑到文件服务器上去读取。这显然可以提高至少100倍速度。 还有,例如保存凡是查询过的用户的基本信息(而不需要重复访问数据库服务器),保存csdn的首页,等等,使用cache都能让系统许多操作的速度提升100倍。 通过这些业务洛家描述,你可以看出,并不需要什么“另外一个内存数据库”来做缓存,就在本地Cache就行了。跑到另外一个服务器上去查询(又占带宽又浪费内存)是没有必要的。 我告诉你为什么许多年前的 jsp 程序员拼命用内存数据库?!因为它们没用过.net :-)
  • 打赏
  • 举报
回复
不用管什么 Web Farm,就算是单机,如果你从一个人“点点点点”变为10个人集中测试,再把所有功能都测至少一遍,再加上服务器上安装点别的软件同时也起来,再加上持续那么长时间,再加上过程中有人喜欢手动鼓捣服务器系统,Cache里边的一些多余的数据自动清空了也是很正常的。 你可以说某些数据立刻(而不是30分钟后)丢失可能是不正常的,但是你不能说Cache不清空任何缓存单元。
  • 打赏
  • 举报
回复
为什么Cache读取出来的是空就报错呢?你对缓存的概念也太偏了。你可能是把缓存当作 Static List<T> 集合来用的吧?那么你应该使用这个,而不是Cache啊。 缓存,就是具有“自动化地、按照一定规则、智能地“清空但愿”特性的,否则就不叫缓存了。所以编程中使用Cache,没有听说“.如果Cache值为空,就提示出错”的逻辑设计。
coyun 2015-05-22
  • 打赏
  • 举报
回复
那我在web.config里面把sessionState改成StateServer,然后继续使用asp.net自带的Cache object,可以吗? HttpContext.Current.Response.Cache.Insert("TestCache",testdata);
  • 打赏
  • 举报
回复
不知道你的loadbalance策略,如果是一次链接后,后面同地址过来的请求会被分配到之前的那台服务器,那么你用InProc或者StateServer都没问题,否则你必须要指向同一个StateServer,当然其它方式也是可以的,只有Inproc不可以
wyumening 2015-05-22
  • 打赏
  • 举报
回复
iis应用程序池默认情况下隔一段时间后就会回收资源,那个时候cache也会失效的,如果使用load blance的话,负责接收请求的哪台服务器都是随机的,用asp.net自带的cache对象的作用不明显的,既然使用了负载均衡,要用缓存就应该考虑使用第三方的分布式缓存,如redis, memcache这类做集群,具体选择哪个看你的具体需求了

62,025

社区成员

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

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

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

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