客户端缓存
NCache 客户端缓存是应用节点上的本地同步 L1 缓存,它维护访问频率最高的数据,以避免网络延迟;因此,它充当应用和集群缓存(L2)之间的性能优化层。它支持进程内 (InProc) 和进程外 (OutProc) 隔离模式。客户端缓存 NCache 以两种不同的配置运行, 原价 和 全数据 客户端缓存。
常规客户端缓存
常规客户端缓存在客户端计算机上充当本地缓存(L1 缓存)。它从集群缓存中加载一部分经常访问的数据,并将其存储在靠近应用程序的位置。这减少了为了获取类似数据而频繁访问服务器的网络请求。为了确保数据完整性,客户端缓存会通过轮询集群缓存(L2 缓存)的更改通知来与 L2 缓存进行同步。但是,由于 L1 缓存无法保证常规客户端缓存中的数据完整,因此查询始终在集群缓存(L2 缓存)上进行。
所有基于键的写入操作,例如 添加, 插页和 删除首先,对集群缓存执行操作。操作成功后,数据会被添加到常规客户端缓存中的客户端缓存中。对于读取操作,如果客户端缓存中找不到数据,则会从集群缓存中获取数据,然后将其填充到客户端缓存中。
全数据客户端缓存
全数据客户端缓存通过在缓存启动时从集群缓存(L1 缓存)加载完整数据集,提供对缓存数据的快速访问。为了优化内存使用,它允许用户配置引用数据类型。但是,配置全数据客户端缓存需要比平时更多的客户端内存。默认情况下,如果在全数据客户端缓存(L1 缓存)中未找到已配置数据类型的请求键,则搜索将自动回退到集群缓存(L2 缓存)进行读取操作。对于 查询对于未配置的引用数据类型,这些查询将在集群缓存中执行。但是,对于已配置的引用数据类型,查询将首先在客户端缓存中执行,并且仅在数据部分加载时才会回退到集群缓存。
重要提示
您不能创建 全数据客户端缓存 无需配置至少一个参考数据类型。
但是,对于已配置的参考数据类型,如果您的用例要求严格依赖本地数据(无需回退到集群缓存),则可以启用 严格的本地读取 和 严格查询执行 通过提供的配置选项 NCache 管理中心. 下面详细描述这些功能。
注意:
无法使用全数据客户端缓存 配置 而 集群缓存正在运行.
重要提示
如果您对 全数据客户端缓存,你必须 重新开始 客户端缓存。
只有配置为引用数据类型的项目才会包含在基于键的写入操作(例如添加、插入和删除)中。这些操作首先在集群缓存上执行。其他客户端缓存实例则通过后台数据同步机制进行更新,稍后将对此机制进行介绍。
严格的本地读取
默认情况下,所有读取操作的请求都会转到客户端缓存 (L1)。如果未找到请求的数据,则请求将转到集群缓存 (L2)。但是,如果客户端缓存中没有数据,而您又不想让读取操作回退到集群缓存,则可以使用 严格的本地读取 功能。使用此功能时,任何在全数据客户端缓存 (L1) 中找不到的键都将导致缓存未命中,而不会尝试从集群缓存 (L2) 获取数据。此行为可确保所有读取操作都严格从本地缓存中执行。您可以通过选择“对于客户端缓存中未找到的任何键,返回缓存未命中,且不会回退到集群缓存“复选框 NCache 管理中心。因此,读取操作仅依赖于客户端缓存,从而允许严格的本地读取。
严格查询执行
对于查询,这些查询首先在客户端缓存上执行,并且只有当数据在客户端缓存中部分加载时才会回退到集群缓存。但是,如果您不想在集群缓存上执行查询,您可以启用 严格查询执行 功能。启用此设置后,仅当客户端缓存中存在完整数据集时,查询才会执行。如果数据仅部分加载,查询将立即失败并抛出异常“无法对客户端缓存执行查询,因为类型“{queryFQN}”已部分加载”您可以通过选中复选框来启用此功能“在客户端缓存中查询部分加载的数据集时抛出异常,且不会回退到集群缓存“通过 NCache 管理中心.
重要提示
严格的本地读取 和 严格查询执行 仅适用于引用数据类型 配置 在全数据客户端缓存中。
此外,如果用户尝试在全数据客户端缓存处于同步状态时(例如在缓存加载或重新同步期间)执行查询,则操作将失败。在这种情况下, NCache 将引发以下异常:“无法对客户端缓存执行查询。客户端缓存仍处于同步状态."
客户端缓存:即插即用
使用客户端缓存非常简单。应用程序端无需更改任何代码。配置也很简单。因此,您可以通过 NCache 管理中心 或 NCache 支持的 PowerShell cmdlet客户端缓存配置完成后,客户端应用程序将自动开始使用它。对于已运行的应用程序,需要重新启动应用程序。
其他客户端缓存实例通过后台更新 数据同步 机制,稍后将会解释。
注意:
在全数据客户端缓存中,只有与配置的参考数据类型相对应的数据才会被添加到客户端缓存中并提供给应用程序。
常规客户端缓存仅保存集群缓存数据的子集。因此,所有其他非基于键的操作(例如 SQL查询 和 获取标签这些操作直接在集群缓存上执行。然而,在全数据客户端缓存中,客户端缓存包含所有已配置的参考数据类型,允许用户执行这些操作。 询问 直接在客户端缓存上。

客户端缓存:隔离模式
客户端缓存在应用程序所在的客户端节点上运行。根据您的性能需求和应用程序架构,您可以选择客户端缓存支持的以下进程级隔离模式之一。
进程内隔离模式(进程中)
顾名思义,客户端缓存在应用程序进程内运行,从而消除了进程间通信。用户数据以对象形式保存,以避免反序列化开销。此模式可为应用程序提供最佳性能。由于客户端缓存托管在应用程序进程内,因此客户端缓存内的数据不会与其他应用程序实例共享。每个应用程序实例都托管一个专用的客户端缓存实例。虽然 InProc 模式可提供最大进程数,但它仅适用于以下情况:
应用热点数据集不是太大。
应用程序在每个具有足够物理内存的客户端节点上仅拥有几个实例。请记住,每个客户端缓存实例都保存着其数据副本。
应用程序的生命周期足够长,足以充分利用客户端缓存的优势。请记住,客户端缓存的生命周期取决于应用程序的生命周期。当应用程序宕机时,客户端缓存中的所有数据也会丢失。生命周期较短的应用程序可能会在客户端缓存完全填充之前关闭或重启。
每个应用程序都有自己的热数据集,这与其他应用程序不同。
进程外隔离模式(进程外)
此模式为客户端缓存提供进程级隔离。客户端缓存在客户端节点上的专用进程中运行。应用程序通过 TCP 套接字与客户端缓存通信。多个应用程序实例可以与同一个客户端缓存通信,从而共享数据。虽然 InProc 模式的性能优于 OutProc 模式,但 OutProc 模式也拥有其自身的优势。
在同一台客户端计算机上运行的多个应用程序与同一个客户端缓存进行通信。多个应用程序共享数据。一个应用程序加载或更新的数据可供其他应用程序使用。
应用程序重启不会导致客户端缓存数据丢失。
与每个应用程序进程都保存其客户端缓存副本的 InProc 模式相比,在 OutProc 模式下运行客户端缓存所需的物理资源(如 RAM 和 CPU)更少。
同步备份: 使用群集缓存来存储客户端缓存数据(在以下段落中解释)可以减轻群集缓存的负担,因为每个客户端计算机只运行一个客户端缓存实例。
注意:
如果 OutProc Client Cache 发生故障,应用程序将直接在集群缓存上执行操作。当 Client Cache 重新启动时,它将自动连接到 Client Cache。您可以通过设置 skip-if-unavailable 标志在 客户端.ncconf. 如果标志设置为 false,如果客户端缓存关闭,缓存操作将会失败。
使用集群缓存同步数据
鉴于客户端缓存保存着集群缓存数据的副本,对集群缓存中数据的更改应该传播到客户端缓存。对于给定的集群缓存,可能存在多个以 InProc 或 OutProc 模式运行的客户端缓存。客户端应用程序所做的数据更改将在其所连接的客户端缓存实例上执行。因此,此客户端缓存实例会自动同步。但是,客户端缓存的其他实例并不知道这些更改。对集群缓存数据的更改将通过后台数据同步机制与这些客户端缓存实例同步,下文将针对常规客户端缓存和全数据客户端缓存进行说明:
如果启动了客户端缓存, 全数据客户端缓存 执行初始 装载 与集群缓存同步的过程。它会加载与其配置的引用数据类型相关的所有数据,以确保缓存完全填充并同步。如果 常规客户端缓存,没有初始加载。仅当客户端请求的数据尚未存在于客户端缓存中时,才会填充,从而导致从集群缓存中获取数据。
当数据被添加到客户端缓存时,它会向给定数据的集群缓存注册数据变更通知。
集群缓存会跟踪每个
CacheItem客户端缓存保存并监控对数据所做的更改。一个专用的后台工作线程每秒检查一次数据更改,并确定哪些客户端缓存包含受影响的键。然后,它会向所有这些客户端缓存发送通知,告知它们数据已更改。
客户端缓存中运行的另一个专用后台工作线程负责在收到数据变更通知后将数据变更与集群缓存同步。该线程收到通知后,会立即请求集群缓存并请求数据更新。我们将这种同步机制称为 客户端缓存轮询.
该工作线程每 10 秒轮询一次数据变化。如果它没有收到来自集群缓存的任何通知。
当任何指定的引用数据类型(缓存已满)触发驱逐时 全数据客户端缓存,它将无法与集群缓存保持同步。为了保持与集群缓存的同步,客户端缓存在达到数据重新加载阈值(即系统尝试重新加载已驱逐数据的缓存总大小百分比)后,将从集群缓存中获取该特定数据类型的数据。
如果一个 全数据客户端缓存 重启后,它会自动与集群缓存同步以保持数据一致性。此同步过程涉及根据配置的参考数据类型从集群缓存重新加载数据。但是,对于常规客户端缓存,不会自动与集群缓存同步。
In 常规客户端缓存,同步是基于键的。只有与客户端缓存中存在的键对应的数据才会与集群缓存同步。
In 全数据客户端缓存,同步是基于针对配置的参考数据类型的数据。
注意:
参考数据类型将根据参考数据类型的优先级被驱逐并重新同步/重新加载。
- 使用全数据客户端缓存,如果集群缓存重新启动,客户端缓存将自行清除以维护数据完整性。
这种强大的同步机制可确保客户端应用程序始终使用来自客户端缓存的最新数据,并具有增强的性能和可扩展性。
客户端缓存同步模式
除了后台数据同步机制外,客户端缓存还支持 乐观同步 同步模式。
当应用程序从客户端缓存中获取数据,且客户端缓存中已保存该数据时,数据会直接返回给应用程序。同步过程在后台执行,如上所述。