缓存加载器和刷新器属性和概述
NCache 提供启动缓存加载器,在启动时预加载必要数据的缓存。在应用程序开始执行后立即需要特定数据集的情况下,此机制至关重要。
例如,假设一个视频流站点有数百个视频,需要在用户访问该站点时提供给用户。 在这里,缓存可以在缓存启动时预加载现有视频,而不是手动添加数据。
备注
有时,由于主数据源的连接问题或执行自定义缓存加载器实现时出现错误,缓存加载器可能无法成功加载数据。要识别此类错误/异常,请检查执行服务日志。
在启动时用数据加载缓存非常有用。 通过这样做,您可以避免由于缓存为空而在缓存启动时出现性能问题 - 导致频繁向数据库请求数据(这很慢)。 这 NCache 缓存启动加载器功能将帮助您在启动时使用您选择的数据预加载缓存。
尽管预加载数据具有优势,但它确实会导致缓存中加载的数据变得陈旧。 用户在缓存启动时加载相关数据,数据源中发生的任何更改都会使其过时。 为了防止这种无效, NCache 提供了另一个称为缓存刷新器的功能。缓存刷新器负责将缓存中加载的数据与数据源中更新的数据进行同步。
缓存加载器和刷新器属性
NCache 缓存加载器和刷新器是提高整体应用程序性能的重要功能,尤其是在缓存启动时。 与每个功能一样,这些功能也有其各自的属性。 我们在下面解释这些属性:
NCache 执行服务
在较早的 NCache 在过去的版本中,缓存和缓存加载器过去在同一进程中运行,这使得缓存进程负担过重,尤其是在加载时。 这种压力导致整个缓存的性能暂时下降。
因此,对于 OutProc 拓扑, NCache 有专门的 NCache 执行服务(以前称为加载器服务)用于管理任务并在缓存启动时将数据从数据源加载到缓存中。该服务在 .NET 和 Java 版本中履行不同的职责。在.NET版本中,它管理Cache Loader和Refresher。而在 Java 版本中,该服务负责管理缓存加载器、刷新器、数据源提供程序和 JMX 计数器发布。
或者,在集群拓扑中,每个节点都有一个专用服务,负责将数据加载到其缓存中。但是,在 InProc 拓扑中,任务仍然在同一进程中执行。
数据集
对于集群拓扑,如果单个节点上的数据加载占用了相当长的时间, NCache 允许在集群节点之间分配数据负载。数据根据用户为每个节点提供的数据集进行分发。每个节点有 NCache 分配执行服务根据数据集加载数据。基本上,数据集是一种将相似数据分组并加载在一起的方法。
在运行时将数据集分配给缓存服务器
备注
NCache 在内部将数据集分配给节点——确保没有两个节点最终在缓存中加载相同的数据。 此分配还允许在更短的时间内加载大量数据。
协调器节点以循环方式在集群节点之间分发数据集。 因此,每个服务器都从列表中分配了一个数据集。 当其中一个节点完成针对其数据集加载数据时,它会接收下一个要加载的数据集。 本质上,如果分布数据集的数量大于节点的数量, NCache 将为每个节点分配一个数据集,当没有更多节点可用时,它将下一个数据集分配给第一个可用节点(已完成加载数据)。
假设用户希望在启动时将 Northwind 数据库中的特定数据加载到 3 个节点的集群缓存中,那么 Cache Loader 的性能会受到分配的数据集数量的影响。 我们下面讨论这种行为:
5 个要加载的数据集: 用户分配 5 个数据集 (对客户的, 订购产品, 热销产品, 员工及 供应商)到装载机。 然后协调器节点以循环方式将数据集分配给节点 - 对客户的 到节点1, 订单 到节点2,并且 热销产品 到节点3。 一旦节点完成加载数据,协调器就会分配下一个数据集,即 员工 并最终 供应商 到下一个可用节点。
3 个要加载的数据集: 用户分配 3 个数据集 (合作伙伴, 热销产品及 订单) 到 Loader - 意味着每个节点负责分配给它的数据集,因此它将根据数据集加载数据,同时确保均匀分布。
2 个要加载的数据集: 用户分配 2 个数据集 (合作伙伴 和 热销产品)到装载机。 由于集群由三个节点组成,因此在加载过程中第三个节点将处于空闲状态。 这就是为什么它更喜欢数据集的数量等于或大于节点的数量 - 确保最大利用率。
数据集调度
数据集需要调度刷新。 所以, NCache 提供一个调度选项来决定更新缓存数据的时间间隔。 此时,刷新间隔会检查要更新的数据集,从而更新/刷新缓存中的后续数据。 缓存刷新程序提供的四种不同的计划选项的工作方式如下:
每日间隔:每天的间隔确保数据集在缓存启动后按照设定的间隔刷新。 间隔值以分钟为单位。 例如,20 分钟表示数据集每 20 分钟刷新一次。
每日时间:每日时间选项可确保数据集每天在用户提供的特定时间刷新。 与最大间隔为 60 分钟的每日间隔不同,它通常间隔 24 小时,并且一开始不依赖缓存启动。 当数据集更新频率不如每天更新的数据集时,通常会使用它。
包周:每周选项可确保数据集在每周的特定日期、用户指定的时间刷新。 例如,如果您希望加载的数据集在每周一、周四和周六的午夜精确刷新,则需要设置每周数据集计划。
包月:每月选项可确保数据集在每月指定的一天或多天以及每周的一个或多个工作日刷新。 例如,您可以指定数据集的刷新,以便服务在每月第一周和最后一周的每个星期一刷新它。
调度表达式的格式为 week:days:hours:minutes
指定调度表达式。
- 周可以是 1-4,1 是该月的第一周。
- 天数可以是 1-7,显示一周中的天数。 小时和分钟可以根据一天中的时间进行调度。 您可以通过添加以逗号分隔的天数来指定一周中的多天。
- 用户可以选择一个月中的多个星期进行调度。
让我们举几个例子来理解调度表达式是如何工作的:
表达方式
1,2:2:00:00
调度是指数据集在每月第一周和第二周的第二天午夜刷新。表达方式
1:1,2,7:15:30
用于计划显示数据集在每月第一周(周一、周二和周日)的第一天、第二天和第七天下午 3:30 刷新
加载机制
用户指定从主数据源加载哪些对象的实现。 每个单独的数据都作为一个完整的数据存在 CacheItem
- 在缓存启动时添加到缓存中。
缓存加载器重试
如果加载缓存时操作失败, NCache 在继续下一步之前执行它。 默认, NCache 不会重试失败的操作。 但是,您可以通过 NCache 管理中心.
缓存加载器重试间隔
如果用户选择为失败的操作启用重试,用户还可以指定在再次尝试失败的操作之前等待的时间间隔(以秒为单位)。 间隔默认为 0。 但是,它是用户可配置的,通过 NCache 管理中心.
刷新间隔
为了检查哪些数据集需要更新/刷新,线程会在特定时间(称为刷新间隔)后运行。 默认情况下,刷新间隔为 900 秒。 此间隔的最小值为 1 秒,最大值为 3600 秒。 用户可以通过以下方式配置刷新间隔 NCache 管理中心.
按需数据集刷新
用户还可以选择手动刷新他们的数据集 调用刷新数据集 cmdlet。 通过此 cmdlet,用户可以立即或在接下来的 24 小时内使用 RefreshPreference
此 cmdlet 的选项。 此选项根据该过程是否会导致性能下降来确定何时发生此按需刷新。 如果没有,数据集将 RefreshNow
. 如果是这样,数据集将在下一个预定时间通过 RefreshOnNextTimeOfDay
选项。