2

我使用以下会话变量存储了一些我动态制作的大型位图:

   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;
            }
        }

使用磁盘缓存会更好,如果是这样,是否有一个很好的示例或文档。提前致谢。

4

1 回答 1

3

存储大项目SessionState通常是一个坏主意- 由于服务器内存的使用,它会限制应用程序的可伸缩性。即使您将SessionState 移动到 SQL,它也会增加应用程序的 IO 和存储要求。

下面,我假设您在控制器上有一个动态图像生成操作,然后被引用,例如<img src='http://myserver/image/generate/wmAvatar' >,您渲染动态图像的原因是为了浏览器的消费?

如果动态图像是特定的“每个用户”或每个会话:不使用会话状态,而是使用适当的Http 缓存标头 动态生成和传递图像,然后它们应该由浏览器缓存。您可能仍需要处理If-Modified-Since请求的案例

如果图像可以在多个用户之间共享,或者至少由同一用户在会话中重复使用,那么可以,您可以将它们存储到磁盘(例如 SSD)中配置为适当缓存的文件夹中(如果您甚至可以预先计算图像可以),然后您的img链接将不再是动态的(http://myserver/images/123456.jpg)。但是,您需要处理过期图像的清理,并处理已删除图像的 404 类型错误。如上,使用 Http 缓存头来减少不必要的 I/O。但是现在,使用键值/ NoSql 数据库在内存中缓存也很常见,例如Redis,然后可以在云中扩展,例如Elasticache

于 2013-05-10T06:52:03.470 回答