替代Session的方案?(asp.net mvc c#)

3
我被告知我们使用的服务器有2GB内存,但当前主要应用程序几乎已达到上限。 但对于我们正在构建的网站,它完全依赖于Web服务,我们需要在链中传递响应以前的请求... 即:

第一页

var stepone = project.webservice.stepone("companyname","companyid"); //List Array Returned

第二页

var steptwo = project.webservice.steptwo(stepone, otherargs);

由于“他们”不希望我们在会话中存储“大量”数据,而且我们使用的是ASP.net MVC C#,还有哪些其他方法可以使我们保持低内存占用,同时又能够存储用户进度所需的内容。


他们是谁?让他们安装更多的内存条。2GB对于生产服务器来说太低了,简直荒谬。 - Chris Marisic
服务器有3.5,这是32位操作系统上的最大可用量;计划在几个月后升级到64位,这将允许他们使用更多的内存。据我所知,2Gig用于IIS,其他1.5被操作系统等消耗。 - Chris McKee
5个回答

3

使用TempData,但在您自己的提供程序中实现ITempDataProvider接口,该提供程序使用数据库或类似会话的内容。


点赞:由于有人对其投了反对票,似乎在过程中的某些情况下是一个可行的选择,但在搜索结果的情况下,为了避免重复请求,我们当前将结果对象存储在会话中。临时数据在第二次请求该数据后会丢失,所以在所有情况下都不太可行。 - Chris McKee
根据>> http://msmvps.com/blogs/luisabreu/archive/2008/07/31/the-mvc-framework-the-tempdata-property.aspx - Chris McKee
1
我们已经决定使用TempData(从技术上来看仍然使用sessions)和普通Sessions的混合。使用TD可以确保一旦使用完毕,我们不需要的内容将被适当地处理掉,这很好:o) - Chris McKee

1

你可以查看微软分布式高度可扩展的内存缓存Velocity。请查看Stephen Walther的这篇博客文章


到目前为止,我发现Velocity唯一的问题是CPU开销。当我们试图将其用于替换企业缓存实现时,我们的CPU周期飙升了。最终我们选择了memcache,它不仅是一个非常成熟的软件,而且速度极快。 - Tom Anderson
显然,这只是技术预览版,作为一家不愿意提供我所需资源的大公司,他们不会安装任何未经批准的东西;因此,我不能在除了随 .net 3.5 附带的基本编程设置之外工作。 - Chris McKee
我确实知道这个限制,那么就利用TempData结构,等到预览结束后,如果需要可扩展的缓存,你可以将temprovider替换为使用分布式缓存。 - Tom Anderson
用大口径枪械击中它,并外包给了解Web应用程序开发的供应商;o) 我肯定会尽可能多地使用它,然后希望问题会消失,或者他们会给我整个服务器,而不是让我与占用内存的软件共享空间。 - Chris McKee
你是否已经审查了应用程序当前如何使用内存?有些东西是否在内存中保存的时间比需要的时间长?可能有一些更改和优化可以减少应用程序对内存的需求,并为其他事物留出一些内存。这些更改可能相对容易、成本较低,且比引入不同的缓存策略并进行彻底测试更有效。此外,缓存类型(磁盘I/O或进程外,例如数据库)可能会对性能产生不良影响,因为数据被序列化和反序列化。 - Mehmet Aras
显示剩余2条评论

0

你甚至可能需要放弃MVC(也许?)并回到使用基本的Web表单POST数据,并禁用所有事件状态。只要一个页面POST到另一个页面,您就可以通过表单变量和输入来管理所需的所有数据,这将消除会话。

这是一项痛苦且昂贵的工作,但您可以做到。只需向他们报价开发这种解决方案所需的人力成本,然后将其与购买良好服务器的成本进行对比即可。


4周时间完全设计、编码调试、PEN和负载测试...在ASP.net中有很多方法可以实现;MVC非常棒,我不打算为了一个IT创建的问题而改变。原始规格说明是他们提供一个自定义服务器...因此有点恼火。 - Chris McKee

0
根据数据的不同,您可以将其存储在cookie中。

小的字符串/整数等变量并不是问题;更多的是结果集(大小为500的列表数组)。 - Chris McKee
  • 每个Cookie最大为4KB
  • 总共300个Cookies,最大总大小为1.2 Mbytes
  • 从特定服务器或域名接受20个Cookie
- Chris McKee

0
如果您有一个数据库服务器,那么可以根据需要创建临时表来存储数据。

很遗憾,除了基本应用程序之外,我没有可用的存储空间;否则,这将是一个不错的选择,并且也可以作为会话存储的可选项,而不是inproc。 - Chris McKee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接