我使用 session 变量存储了许多动态制作的大位图:
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;
}
}
使用磁盘缓存会更好吗?如果是的话,是否有一个很好的示例或文档。提前致谢。
最佳答案
在 SessionState
中存储大型项目通常是 a bad idea - 由于服务器内存的使用,它会限制应用程序的可扩展性。即使您移动 SessionState to SQL ,它也会增加应用程序的 IO 和存储要求。
下面,我假设您在 Controller 上有一个动态图像生成操作,然后引用该操作,例如<img src='http://myserver/image/generate/wmAvatar' >
,即您渲染动态图像的原因是为了浏览器的消耗?
如果动态图像是特定的“每个用户”或每个 session :
不使用 session 状态,而是使用适当的 Http Caching headers 动态生成和传递图像,然后它们应该由浏览器缓存。您可能仍需要处理 If-Modified-Since
requests 的案例
如果图像可以在多个用户之间共享,或者至少可以由同一用户跨 session 重复使用,那么可以,您可以将它们存储到磁盘(例如 SSD)中配置为的文件夹中适当的缓存(如果可以的话,甚至预先计算图像),然后您的 img
链接将不再是动态的( http://myserver/images/123456.jpg
)。但是,您需要处理过期图像的清理,并处理已删除图像的 404 类型错误。如上所述,使用 Http 缓存 header 来减少不必要的 I/O。然而如今,使用键值/NoSql 数据库在内存中进行缓存也很常见,例如Redis ,然后可以在云中扩展,例如Elasticache
关于c# - MVC session 变量存储内存与磁盘缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16476320/