ASP .NET Core:如何根据用户输入缓存数据?

时间:2019-01-31 13:30:10

标签: c# performance web-services caching asp.net-core

我们正在构建一个新的ASP.Net Core WebService,它将提供来自现有数据库的数据。

为了减少数据库负载并缩短响应时间,我考虑过从数据库中缓存某些对象和配置。

我发现此内容是在ASP.Net Core:https://docs.microsoft.com/en-us/aspnet/core/performance/caching/memory?view=aspnetcore-2.2中进行缓存的 似乎是要走的路。文章还说:请勿使用外部输入作为缓存键

我现在的问题是,基本上所有数据都取决于用户或用户输入。

我知道,缓存仅对经常使用但很少更改的对象有意义。 这是当我可能要使用缓存时的简化示例:我们有假日/工作日配置,每个州的配置可能不同。因此,它可能因用户而异,但是可能有数百个用户使用相同的配置。

还有一些共享的组件,许多用户共享,但是返回的组件取决于请求的内容。

那么缓存此类实体的最佳方法是什么? 我也愿意接受任何可以帮助我减少对数据库的调用的想法。

感谢和问候, 马克

2 个答案:

答案 0 :(得分:1)

该文档不鼓励将外部输入用作缓存键,因为它可能导致太多的缓存项并消耗大量RAM,进而对性能产生负面影响。

您需要进行实验。也许您最终不会拥有太多不同的用户输入变量。

您还可以考虑使用外部缓存服务,例如Memcached,您可以在其中使用其他服务器作为缓存。这将允许您缓存更多的值并减少数据库的负载。

答案 1 :(得分:0)

我认为您误会了。注意不要将外部用户输入用作缓存。换句话说,您不应从用户那里获取一些输入,而应该通过该输入在缓存中进行设置:

_cache.SetString(userInput, "foo");

这不是在将用户输入设置为,即:

_cache.SetString("my cache key", userInput);

它也不是在按用户分离缓存:

_cache.SetString($"cache key for user {userId}", "foo");

后两种情况都很好。只是,允许用户自行设置密钥,这可能会使自己面临诸如潜在的SQL注入攻击之类的麻烦,具体取决于您的缓存存储。

另外,请注意,它主要是在谈论未经消毒的用户输入。如果这就像枚举,用户只能从一组定义的值中进行选择,那么您就可以了。或者,如果您另外知道输入不会引起问题。例如,您已验证的邮政编码仅包含数字,也可能包含一个破折号。恶意用户对此无能为力,所以很好。但是,至少可以说,像“名称”这样的自由格式文本字段是有问题的。