客户端缓存
NCache 集群拓扑旨在为您的应用程序提供最佳性能和可扩展性。 随着业务需求的增长,应用程序需要处理更多的客户端请求和数据。 向分布式缓存无缝添加更多节点可提供线性可扩展性。 与硬件处理器缓存一样,客户端缓存通过使热数据集更靠近您的应用程序,甚至在应用程序的进程中使用 InProc 模式.
考虑电子商务应用程序的示例。 该应用程序经常访问当前活跃用户的产品目录和数据。 此类数据可以保存在客户端盒上运行的客户端缓存中。 一方面,将此数据保留在客户端缓存中可以避免访问数据库和集群缓存,从而提高应用程序的性能。 另一方面,它通过使集群缓存能够接受更多请求,从集群缓存中卸载许多读/写操作。 而且,这种性能提升不会影响数据一致性。 客户端缓存使其数据与集群缓存保持同步。 以下各节将介绍客户端缓存如何与集群缓存同步。
即插即用: 使用客户端缓存非常简单。 应用程序端无需更改代码。 这是一个简单的配置选项。 您可以通过以下方式创建客户端缓存 NCache 管理中心 或者 NCache 支持的 Powershell cmdlet。 配置客户端后,客户端应用程序将自动开始使用它。 对于已经运行的应用程序,需要重新启动应用程序。
所有类型 CRUD 操作 将缓存键作为输入,例如 地址, 积极, 插页及 删除,通过客户端缓存路由。 读取操作首先在客户端缓存中查找数据。 客户端缓存返回数据(如果找到)。 否则,读取操作将针对集群缓存执行。 从集群缓存返回的数据在添加到客户端缓存后返回给应用程序。 因此,对相同数据的下一次读取调用将从客户端缓存提供服务。 对于批量读取操作,仅从集群缓存中获取客户端缓存中缺少的数据。
基于键的写操作,例如, 地址 和 插页,首先在集群缓存上执行。 成功完成后,数据将添加到客户端缓存,然后转发到应用程序。 其他客户端缓存实例通过后台数据同步机制进行更新,即 稍后解释.
客户端缓存仅保存集群缓存数据的子集。 因此,所有其他非基于密钥的操作,如 获取组, SQL查询及 获取标签等直接在集群缓存上执行。
客户端缓存:隔离模式
客户端缓存在运行应用程序的客户端节点上运行。 根据您的性能需求和应用程序架构,您可以选择客户端缓存支持的以下进程级隔离模式之一。
进程内
顾名思义,客户端缓存在应用程序进程内部运行,消除了进程间通信。 用户数据以对象形式保存以避免反序列化成本。 此模式为应用程序提供最大性能。 由于客户端缓存托管在应用程序进程内部,因此客户端缓存内的数据不会在其他应用程序实例之间共享。 应用程序的每个实例都托管一个专用的客户端缓存实例。 尽管 InProc 模式提供了最大进程数,但仅在以下情况下才适用:
应用热点数据集不会太大。
该应用程序在每个客户端节点上只有几个具有足够物理内存的实例。 请记住,每个客户端缓存实例都保存其数据副本。
应用程序生命周期足够长,可以从客户端缓存中获益。 请记住,客户端缓存生命周期取决于应用程序的生命周期。 当应用程序出现故障时,客户端缓存中的所有数据也会丢失。 生命周期较短的应用程序将在客户端缓存完全填充之前关闭或重新启动。
每个应用程序都有自己的热点数据集,这与其他应用程序不同。
输出程序
此模式为客户端缓存提供进程级隔离。 客户端缓存在客户端节点上的专用进程中运行。 应用程序通过 TCP 套接字与客户端缓存进行通信。 多个应用程序实例可以与同一客户端缓存通信,从而共享数据。 尽管 InProc 在性能上优于 OutProc 模式,但 OutProc 模式有其自身的一系列优点。
在同一台客户端计算机上运行的多个应用程序与同一客户端缓存进行通信。 多个应用程序共享数据。 一个应用程序加载或更新的数据可用于其他应用程序。
应用程序重启不会导致客户端缓存数据丢失。
当每个应用程序进程保存其客户端缓存的副本时,与 InProc 模式相比,在 OutProc 模式下运行客户端缓存所需的物理资源(例如 RAM 和 CPU)需要更少。
客户端缓存数据(稍后解释)与集群缓存的同步减轻了集群缓存的负担,因为您在每台客户端计算机上运行一个客户端缓存实例。
备注
如果OutProc客户端缓存宕机,应用程序将直接对集群缓存执行操作。 当客户端缓存再次启动时,会自动与客户端缓存连接。 您可以通过设置来更改此行为 skip-client-cache-if-unavailable
标志在 客户端.ncconf. 如果标志设置为 false
,如果客户端缓存关闭,缓存操作将失败。
与集群缓存同步数据
尽管即插即用设置很简单,但我们不能忽视客户端缓存保存集群缓存数据副本的事实。 对集群缓存中的数据所做的更改应传播到客户端缓存。 对于给定的集群缓存,可能存在以 InProc 或 OutProc 模式运行的多个客户端缓存。 客户端应用程序所做的数据更改是在该应用程序所连接的客户端缓存实例上执行的。 因此,该客户端缓存实例会自动同步。 但是,客户端缓存的其他实例不知道这些更改。 对集群缓存数据所做的更改通过后台数据同步机制与这些客户端缓存实例同步,如下所述:
当数据被添加到客户端缓存时,它会向集群缓存注册给定数据的数据更改通知。
集群缓存跟踪每个
CacheItem
客户端缓存保存并监视对数据所做的更改。专用的后台工作线程每秒检查数据更改,并确定应将更改通知给哪些客户端缓存。 它向受影响的客户端缓存发送数据已更改的通知。
另一个运行在客户端缓存中的专用后台工作线程负责在收到数据更改通知后将数据更改与集群缓存同步。 一旦收到通知,它就会请求集群缓存并请求数据更新。 我们将这种同步机制称为客户端缓存轮询。
如果客户端缓存中运行的工作线程没有收到来自集群缓存的任何通知,则每 10 秒轮询一次数据更改,以处理由于客户端缓存和集群缓存之间的连接丢失而可能错过通知的情况。
这种强大的同步机制确保客户端应用程序始终使用来自客户端缓存的最新数据提供服务,并增加了性能和可扩展性。
同步模式
除了后台数据同步机制外,客户端缓存还支持以下两种同步方式。
乐观同步
这是客户端缓存的默认同步模式。 当应用程序从客户端缓存中获取数据并且客户端缓存保存该数据时,数据会简单地返回给应用程序。 如上所述,同步在后台执行。
悲观同步
后台同步机制适用于大多数应用程序,并为应用程序提供最佳的性能和可扩展性。 然而,对于更敏感并希望确保始终提供最新数据的应用程序,悲观模式是为它们设计的。 使用此模式,当应用程序从客户端缓存获取数据并且客户端缓存保存该数据时,客户端缓存会与集群缓存验证项目版本。 如果在集群缓存中找到数据的更新版本,则会将其提取并更新到客户端缓存中。 因此保证应用程序获得最新版本 CacheItem
.