在asp.net 4.0中缓存网站用户数据的最佳方法是什么?
我有一个用户设置表,可以跟踪各种用户或会话特定的内容,例如UI元素的状态(打开/关闭),首选项,某些对话框是否已被解除等等。由于这些不经常变化(对于每个用户,无论如何)但是经常被查找,因此缓存它们似乎是明智的。什么是最好的方式?这些是我发现的选项......
HttpContext.Current.Session
(例如Session["setting_name"]
)HttpContext.Current.Cache
static ConcurrentDictionary<string,string>
其中密钥是唯一的userID +设置名称值Session
或Cache
最明智的方法是什么?从实际角度来看,Session
与Cache
的区别如何?将字典存储为单个会话/缓存对象而不是直接添加大量值是否有意义?我认为查找可能会更快,但更新会更慢,因为我必须在更改时重新存储整个字典。
使用全局静态缓存可能会带来哪些问题或好处?这似乎是最快的,但我必须管理大小。如果它达到一定的大小,我可以定期冲洗它,或者保持交叉引用队列并在它达到一定大小时首先移除最旧的东西。这有什么意义,还是只是太努力了?
答案 0 :(得分:1)
Session
可能最终被存储在进程外或数据库中,这可能使得检索它变得昂贵。如果您的应用程序要托管在服务器场中,而不是单个服务器,则可能会使用会话数据库。服务器场提供了改进的可伸缩性和可靠性,并且它通常是常见的部署方案。你有没有想过这个?
此外,当您在进程中使用Session
时,它最终会将序列化发送到进程外或数据库,并且反序列化在检索时,您有效地执行上述描述:
... 更新会因为我的速度而变慢 在什么时候重新存储整个字典 它改变了。 ......
..因为,即使你使用单独的会话密钥,用户的整个Session
对象也会被序列化和反序列化(一次性完成)。
然而,Cache
在服务器场中的特定服务器上将在内存中,因此比退出流程或数据库更有效。但是,一台服务器上的缓存中的某些内容可能不在另一台服因此,如果用户的后续请求被定向到服务器场中的另一个服务器,则该服务器上的缓存可能尚未保留任何用户的项目。
尽管如此,如果您因性能原因而进行缓存,我建议您使用Cache
。
P.S。是的,你太努力了。除非你真的需要,否则不要重新发明轮子。 : - )
答案 1 :(得分:-1)
可能更好地将您的信息放入memcached以获得可伸缩性