C# 提高性能的缓存策略

C# 提高性能的缓存策略,c#,asp.net,.net,sql-server,caching,C#,Asp.net,.net,Sql Server,Caching,可能重复: 我有一个拥有约100万用户的web应用程序。该应用程序中的几乎每个网页都调用GetUser()方法(在活动流中加载名字和其他用户详细信息)。 现在,我正在为每个调用访问数据库,我正在考虑将所有用户缓存在内存中,并使用Linq从那里获取搜索结果或GetUser() 我唯一的问题是缓存所有用户(在内存中)是否是一个好主意。我会浪费公羊吗? 我个人认为,从RAM中获取数据要比从DB中获取数据快得多(即使DB经过了优化和索引) 请注意,我已经处理了缓存验证/更新等 stackoverflo

可能重复:

我有一个拥有约100万用户的web应用程序。该应用程序中的几乎每个网页都调用GetUser()方法(在活动流中加载名字和其他用户详细信息)。 现在,我正在为每个调用访问数据库,我正在考虑将所有用户缓存在内存中,并使用Linq从那里获取搜索结果或GetUser()

我唯一的问题是缓存所有用户(在内存中)是否是一个好主意。我会浪费公羊吗? 我个人认为,从RAM中获取数据要比从DB中获取数据快得多(即使DB经过了优化和索引)

请注意,我已经处理了缓存验证/更新等


stackoverflow会缓存所有用户吗?

我们做了类似的事情,但我们没有转向Linq,而是在每台web服务器上安装了一份SQL Server Express。我们会将用户数据更改推送到每个web服务器,本地应用程序使用中间层,只定期从本地数据库中提取数据(但至少是本地的,而不是每个人都访问数据库)


您使用什么技术进行缓存,以及应用程序(或Linq)如何知道何时刷新其本地副本,取决于允许缓存数据的陈旧程度。

如果GetUser在大多数时间返回同一组用户,并且如果很少检索到大多数用户,您可以尝试混合方法,首先设置字典(或其他集合)并检查该集合是否不存在,然后从数据库中获取该集合并将其存储到集合中

使用这种方法,您还可以使用缓存,因为它已经有了内置的机制来过时和清理自己


话虽如此,我过去曾在一个项目中为用户做过同样的事情(虽然我们只有大约100个用户),我们所有的研究和测试都发现每次访问数据库都会更快。

我们使用在更新时触发的事件等来动态更新缓存。对于缓存,我们使用内存中的.NET缓存对象。显然是事后诸葛亮-但在这种情况下,使用缓存服务器不是更好吗?@Stuart?这是在2000年代redis/memcached等真正成熟之前。即使在今天,团队仍然可能选择本地数据库方法,因为他们不必学习新技术来实现/与之交互。两者都将使用应用程序服务器上的内存,而不是主数据库服务器上的任何资源。哦,总的来说,在今天这个时代阅读这篇文章的人更多的是,根据现在可用的内容,为他们提供一种不同的方法。这不是和你谈论的用户数据量相同的问题吗?如果仅仅是用户名和其他几个字段,您可以考虑将其序列化为AuthCookie,然后在需要时从DB中延迟加载完整的用户数据。还可以向集合中添加一些条件,以便最频繁的用户比登录较少的用户更可能在集合中。