2013-05-10 82 views
2

我存放一些大的位图,我做动态的,使用会话变量使用以下:MVC会话变量存储内存VS磁盘缓存

public static MySession Current 
     { 
      get 
      { 
       MySession session = 
        (MySession)HttpContext.Current.Session["__MySession__"]; 
       if (session == null) 
       { 
        session = new MySession(); 
        HttpContext.Current.Session["__MySession__"] = session; 
       } 
       return session; 
      } 
     } 

会使用磁盘缓存是更好的,如果是的话是有很好的例子或文档。提前致谢。

回答

3

SessionState中存储大型项目通常是a bad idea - 由于使用服务器内存,它会限制应用程序的可伸缩性。即使你移动SessionState to SQL,它也会增加你的应用的IO和存储需求。下面,我假设你在控制器上有一个动态图像生成动作,然后被引用,例如, <img src='http://myserver/image/generate/wmAvatar' >,即您渲染动态图像的原因是为了浏览器的消耗?

如果动态图像是“每用户”特异性的,或每个会话: 代替使用会话状态的,产生并用适当Http Caching headers动态传递图像,并且它们应该然后被浏览器高速缓存。您可能还需要处理If-Modified-Since requests

的情况下,如果图像可以在多个用户之间共享,或者至少重新使用跨会话相同的用户然后是的,你可以将它们保存到磁盘(例如SSD )在配置为适当缓存的文件夹中(甚至可以预先计算图像),然后您的链接将不再是动态的(http://myserver/images/123456.jpg)。但是,您将需要处理过期图像的清理,并且还会为删除的图像处理404类型的错误。如上所述,使用Http缓存头来减少不必要的I/O。然而,现在,在关键值/ NoSql数据库中缓存在内存中也是常见的,例如, Redis,其然后可以在云中缩放,例如, Elasticache

+0

谢谢你的详细解答。 – hncl 2013-05-11 05:56:08