在 ASP.NET HttpContext 缓存中使用 SQL 查询/文件路径作为缓存键
Using SQL query / file paths as cache keys in ASP.NET HttpContext caching
我正在考虑使用文件路径和可能的原始 sql 作为我的 asp.net HttpContext 缓存中的缓存键。这些项目只会缓存几分钟。
我的问题是我是否会 运行 进入不正确的缓存数据以及频率。在单用户测试环境中一切看起来都很好,但是在负载下多个用户会发生什么?
我的直觉告诉我这是个坏主意,但当我试图确认它是个坏主意时,我发现了一些相互矛盾的信息,这让我觉得这可能没问题。
例如,缓存键没有长度限制,因为缓存键是散列的,并且字典具有内部冲突解决方案。这是否意味着我没事?错误缓存数据的结果对于应用程序来说确实是灾难性的。
答案在(某种程度上)在您的问题中。缓存键被散列。缓存键越长,发生冲突的可能性就越大。因此,缓存键越短越好。
我通常采用的方法是使密钥尽可能简洁(但仍然确定且唯一)。这通常意味着以对象类型名称开头,后跟标识对象的键,中间有一个标准化的分隔符。此解决方案可轻松扩展,因为如果您需要以其他方式区分您的缓存,您只需添加附加信息即可。
// this will be used to cache the instance MyClass with
// ID (key) value of MyClassKey (usually this is a Guid or int)
var key = "MyClass|MyClassKey";
// this will be used to cache the result of the call to
// MyClass.MyFunctionName(Parameter1Value, Parameter2Value);
var key = "MyClass|MyFunctionName|Parameter1Value|Parameter2Value";
附带说明一下,如果您使用的是 .NET Framework 4 或更高版本,System.Runtime.Caching
是一个比 System.Web.Caching
更健壮和可插入的框架,并且它的工作方式非常相似,但不依赖于在 System.Web
.
我正在考虑使用文件路径和可能的原始 sql 作为我的 asp.net HttpContext 缓存中的缓存键。这些项目只会缓存几分钟。
我的问题是我是否会 运行 进入不正确的缓存数据以及频率。在单用户测试环境中一切看起来都很好,但是在负载下多个用户会发生什么?
我的直觉告诉我这是个坏主意,但当我试图确认它是个坏主意时,我发现了一些相互矛盾的信息,这让我觉得这可能没问题。
例如,缓存键没有长度限制,因为缓存键是散列的,并且字典具有内部冲突解决方案。这是否意味着我没事?错误缓存数据的结果对于应用程序来说确实是灾难性的。
答案在(某种程度上)在您的问题中。缓存键被散列。缓存键越长,发生冲突的可能性就越大。因此,缓存键越短越好。
我通常采用的方法是使密钥尽可能简洁(但仍然确定且唯一)。这通常意味着以对象类型名称开头,后跟标识对象的键,中间有一个标准化的分隔符。此解决方案可轻松扩展,因为如果您需要以其他方式区分您的缓存,您只需添加附加信息即可。
// this will be used to cache the instance MyClass with
// ID (key) value of MyClassKey (usually this is a Guid or int)
var key = "MyClass|MyClassKey";
// this will be used to cache the result of the call to
// MyClass.MyFunctionName(Parameter1Value, Parameter2Value);
var key = "MyClass|MyFunctionName|Parameter1Value|Parameter2Value";
附带说明一下,如果您使用的是 .NET Framework 4 或更高版本,System.Runtime.Caching
是一个比 System.Web.Caching
更健壮和可插入的框架,并且它的工作方式非常相似,但不依赖于在 System.Web
.