在 Limyee 电商平台之上创建新的应用程序或功能时 ,您需要考虑缓存以提高性能。不要使用 ASP.NET 缓存对象,而是利用 Limyee 电商平台缓存框架,以便无需编译即可进行运行时调整,并且可以更精细地控制缓存项目的位置。Limyee.Extensibility.Caching 命名空间提供了一个 API,用于向 Limyee 电商平台组件添加缓存功能。
何时使用 Limyee 电商平台缓存框架
当您需要创建自己的自定义应用程序,并且需要比 ASP.NET 缓存更精细地控制项目的缓存位置时。
缓存键和标签
缓存中的所有项目都有可用于标识它的关联密钥。密钥不区分大小写,并且将始终以小写形式存储。
除了键之外,您还可以通过放置一个或多个标签来进一步标识项目。与键一样,标签不区分大小写,并且将以小写形式存储。
在将数据分组到逻辑分区时,标签非常有用。使用标签,您可以在不知道所有单个键的情况下,吊销同一逻辑分区的一组项目。虽然标签在这方面很强大,但绝不应该用它们来代替一个好的密钥生成算法。与单键查找和删除相比,标记操作非常慢,因此在使用方式和时间方面要非常有选择性。
选择缓存范围
所有缓存操作都需要一个或多个 CacheScope 值。定义缓存层时(请参阅:缓存概述),每个层都将使用缓存范围来标识缓存类型。
例如,内置 ASP.NET 缓存将自己标识为进程范围层,因为它将项目存储在可用于应用程序内运行的所有线程的位置。
在缓存项目之前,您需要确定要在哪个(或)范围内操作。以下是您可以遵循的一些一般准则:
名字 |
描述 |
None |
未指定位置。 |
Context |
指定上下文位置。此作用域用于在短时间内存储项目,通常对用户是私有的。 |
Process |
指定了进程位置。此作用域将项目存储在正在运行的进程中,并在用户之间共享。 |
Distributed |
指定了分布式位置。当项目对所有正在运行的进程都可用时,将使用此作用域。通常,仅分布式缓存是最慢的缓存类型。 |
All |
指定了所有可能的作用域值。 |
Limyee 缓存对象附带了可供使用的内置提供程序。它们包括:
- HttpContext(上下文范围):项目缓存在当前 HTTP 请求中。这是可用于 Web 请求的最快缓存,应始终设计为网站环境中的最低级别缓存。
- NET(进程范围):项目缓存在 HttpRuntime 对象内。使用此提供程序缓存的项目可用于访问同一 HttpRuntime 对象的所有线程。
***注意:此缓存可以在 Web 请求之外使用。
缓存超时
将项目放入缓存时,不必给出超时。在这些情况下,将使用当前配置的默认超时值。开箱即用的默认超时为 100 秒。
在电商平台的大部分类都使用默认超时值。除了非常简单的缩放机制之外,控制默认超时还可以在担心过时的 Web 场中更好地控制缓存系统。通常,如果多个服务器正在运行站点,则默认超时值应较低,以将较快吊销陈旧数据。该值越低,您看到过时的可能性就越小 - 但代价是缓存性能降低。
默认超时是在缓存配置 XML 设置中设置的。有关详细信息,请参阅配置文档。
缓存因素
缓存因素使我们能够完整地了解项目应缓存多长时间。可以为任何缓存层设置缓存因子值,并将其用作超时的调整。
缓存因素变得很重要的地方是使用分布式缓存设置缓存时。例如,假设我们有一个包含许多节点的网站场。每个节点都运行 AspNetCache 提供程序,以便在每台服务器上本地缓存项目。由于我们处于网站场方案中,因此必须减少默认超时,因为我们不能冒缓存不一致的风险。
为了提高网站的缓存性能,我们希望引入分布式缓存,以便较长的对象可以在内存中保留更长的时间。在这种情况下,我们希望增加默认超时,因为我们知道,只要我们将更改中继回分布式缓存服务器,所有 Web 节点都将保持分布式缓存同步。但这带来了一个问题:如果我们增加默认超时,那么 AspNetCache 中的本地缓存项将面临在任何不处理数据操作的Web服务器中过时的风险。但是,如果我们不增加默认超时,则对象将从分布式缓存中删除的频率将比它们需要的频率高得多。
为了解决这个问题,我们可以在分布层上使用缓存因子。通过在分布式层上设置缓存因子,我们可以为本地服务器缓存保留较低的默认超时。默认情况下,发送到分布式缓存的项目将比在本地服务器上缓存的项目缓存更长时间。
应该注意的是,所有超时都受该因素的影响,而不仅仅是默认超时。
缓存因子在缓存配置 XML 设置中设置。有关详细信息,请参阅配置文档。
覆盖
Limyee 缓存系统中包括一种机制,允许对缓存操作进行运行时调整。这允许用户修改在 Limyee 电商平台中使用的值(或由第三方组件添加),如果他们有特定于站点的需求。应谨慎使用覆盖,但它们提供了一定程度的控制,可能会产生很大的好处。
在将项目发送到任何缓存层之前,将检查条件以查看是否应使用特定覆盖。如果满足某个条件,则会触发该覆盖,并且不会处理其他条件。这意味着每个缓存操作只能执行一个覆盖。
覆盖是使用 XML 以声明方式定义的。有关如何设置和配置替代的详细信息,请参阅配置文档。
示例
以下所有示例都假定我们定义了 this(这需要引用 Limyee.Components.dll):
使用 Limyee.Extensibility.Caching.Version1;
从缓存中检索项目。
var obj = CacheService.Get("key", CacheScope.Context | CacheScope.Process);
将对象放入缓存。
// Get the object from the source. var obj = GetObjectFromDataSource(); CacheService.Put("key", obj, CacheScope.Context | CacheScope.Process, TimeSpan.FromMinutes(1));
使用默认超时将对象放入缓存。
// Get the object from the source. var obj = GetObjectFromDataSource(); CacheService.Put("key", obj, CacheScope.Context | CacheScope.Process);
使用默认超时并将缓存标签对象放入缓存。
// Get the object from the source. var obj = GetObjectFromDataSource(); CacheService.Put("key", obj, CacheScope.Context | CacheScope.Process, new string[] { "tag1" });
从缓存中删除项目。
CacheService.Remove("key", CacheScope.Context | CacheScope.Process);
RemoveByTags 可从缓存中删除一组标签的项目。
CacheService.RemoveByTags(new string[] { "tag1" }, CacheScope.Context | CacheScope.Process);