直写式和后写式缓存概述
NCache 支持Write Through缓存,允许通过缓存直接对数据源进行写操作。这样,您就可以同步缓存和数据源。在直写式缓存中, NCache 首先更新缓存存储,然后将该操作应用于数据源。 例如,如果客户端应用程序更新缓存中的条目,则 NCache 还将更新数据源(如果启用了直写)。
备注
此功能仅在 NCache Enterprise 型号.
要在您的应用程序中使用直写缓存,您需要首先实现 IWriteThruProvider
界面。 NCache 将在内部使用此自定义提供程序对数据源执行写入操作。 NCache 将通过 Write-Through 在写操作(添加、插入、删除/删除)API 调用之后调用您的提供程序。
目前 NCache 提供以下两种直写缓存模式:
- 直写(同步更新数据源)
- 后写(异步更新数据源)
备注
NCache 提供性能计数器 Write-thru/sec
用于直写操作。
直写
在直写式缓存中,操作首先应用于缓存存储,然后同步更新到配置的数据源。 使用 Write-Through,操作将在之后完成 NCache 在数据源上应用该操作。 如果即时数据源更新很关键并且您需要在更新缓存后立即更新数据源,则可以使用直写缓存。
后写
在 Write-Through 中,由于对数据源的同步操作,操作的速率将与用户对缓存的操作速率相同。 对于具有高用户流量的应用程序,用户对缓存的操作率可能非常高,这会使您的数据源不堪重负。 同步数据源操作也可能影响用户操作的响应时间。
为了克服这些问题,可以使用 Write-Behind 代替 Write-Through。 在 Write-Behind 中,数据源操作在后异步执行 NCache 对缓存存储执行操作。 更新缓存存储后,这些操作会排队,然后异步应用于配置数据源。 因此使用 Write-Behind 将提高缓存操作的响应时间。
NCache 在Write-Behind中提供不同的配置设置来控制数据源上的操作流程。 例如,您可以指定 NCache 将通过 Throttling 对数据源应用 Write-Behind 操作。
节流
指示每秒应用于数据源的操作数。 节流的默认值为 500 ops/sec。 您可以通过 NCache 经理.
备注
NCache 提供性能计数器 Write-behind/sec
用于后写操作。
后写模式
NCache 允许您单独或批量应用 Write-Behind 操作。 为后写操作维护后写队列。 所有后写操作都将在此队列中排队,然后根据下面解释的配置的批处理或非批处理模式应用于数据源。
非批处理模式
默认情况下,将为 Write-Behind 操作配置非批处理模式。 在此模式下,Write-Behind 队列中的操作将根据配置的节流率,一一应用于数据源。 例如,如果限制率为每秒 500 次操作, NCache 将一次对数据源应用一个 Write-Behind 操作,并且不会超过每秒 500 次操作。
批处理模式
在批处理模式下,根据操作选择批处理/批量操作 operation delay
. 你可以配置 operation delay
对于 Write-Behind 操作,它表示每个操作在应用于数据源之前必须在 Write-Behind 队列中等待的时间(以毫秒为单位)。 默认情况下,它的值为零。
批处理间隔是可配置的间隔,根据该间隔 NCache 定期检查 Write-Behind 队列中的操作延迟超时操作。 例如,如果操作延迟设置为 1000ms,批处理间隔设置为 5s, NCache 每 5 秒检查一次 Write-Behind 队列中的操作,并选择所有操作延迟过期的操作(所有在队列中持续 1000 毫秒的操作)。
批量选择操作后,根据配置的节流率将它们应用于数据源。 假设从 Write-Behind 队列中选择大量 1000 个操作,然后以 500 个操作的批次(如果限制率为 500 ops/sec)将其应用于数据源,作为每秒应用于数据源的最大操作不能超过配置的限制值。
您可以指定从几秒到几天和几个月的操作延迟时间。 通过这种方式,您可以在可配置的时间内暂停对数据源的操作。 NCache 还为后写队列、操作计数和当前批处理操作计数提供性能计数器。 对于 Write-Behind,如果启用了批处理,则准备在数据源上执行的操作将从 Write-Behind 队列中出列。
备注
当前批处理间隔中出列的操作数将由 当前批处理操作计数计数器.
对后写配置的热应用支持
NCache 支持热适用的 Write-Behind 设置,允许您在运行时更改 Write-Behind 配置,而无需停止缓存。 您可以通过更改 Write-Behind 可配置属性 NCache 经理和 NCache 将动态合并这些更改。
在热应用支持中,您可以将 Write-Behind 模式从批处理更改为非批处理,反之亦然。 例如,如果您已将批处理模式更改为非批处理,那么 NCache 将忽略操作延迟值并开始单独执行操作。 此外,您可以根据需要在运行时更改节流率,类似地,操作延迟、批处理间隔、失败操作队列限制和失败操作驱逐率也可以在运行时更改。
警告
您只能增加 Failed operations queue limit 的值; 否则, NCache 将使用其默认值进行进一步的操作。
集群环境中的后写
由于为 Write-Behind 操作维护一个 Write-Behind 队列,一个单独的专用线程监视器执行其操作。 下面提到了 Write-Behind 的拓扑级别详细信息:
复制拓扑: Write-Behind 队列在所有节点上维护,但 Write-Behind 异步处理器仅存在于协调器节点上。 这意味着所有 Write-Behind 操作都通过此节点执行,并复制到集群范围内的其他节点队列。 这样,如果一个节点宕机,那么下一个协调节点会执行所有剩余的后写操作。
分区复制拓扑: Write-Behind 队列在每个活动节点上维护,并复制到其相应的副本。 每个节点负责其对数据源的 Write-Behind 操作。
镜像拓扑: Write-Behind 队列在主动和被动节点上都维护,但只有主动节点负责执行 Write-Behind 操作。 类似地,如果主动节点关闭,则被动节点变为主动节点并执行剩余的后写操作。
分区拓扑: 每个分区上都维护着 Write-Behind 队列,每个节点负责其对数据源的 Write-Behind 操作。
缓存操作结果
NCache 为您提供了根据操作结果在缓存中同步直写操作的灵活性。 对数据源应用操作(添加/插入)后,您可以指定操作状态,在此基础上 NCache 将同步缓存存储。 例如,在数据源操作失败的情况下,您可以决定从缓存中删除或保留该数据。 您还可以在数据源上重试该操作。 为此,您必须指定 Success
/Failure
/FailureRetry
/FailureDontRemove
as
OperationResult.Status
of OperationResult
. 这在直写和后写缓存中都提供。
数据源运行状态及其对应的动作由 NCache 描述如下:
成功:这表示数据源操作成功,项目已添加到数据源中,所以 NCache 也会将其保存在缓存中。
失败: 这表示数据源操作失败,无法将项目添加到数据源,所以 NCache 也会将其从缓存中删除。
失败不要删除:这表示数据源操作失败,无法将项目添加到数据源,但是 NCache 会将其保存在缓存中。
失败重试:这表示数据源操作失败,无法将项目添加到数据源,所以 NCache 会将项目保留在缓存中并重试。 重试将作为 Write-Behind 操作完成。
重试失败的操作
NCache 允许您在 Write-Through/Write-Behind 中重试操作,以防它们在数据源上失败。 为此,如果您启用操作重试,则 NCache 将在数据源上重试该操作。 在 Write-Through 或 Write-Behind 的情况下,所有重试操作将重新排队到 Write-Behind 队列,这意味着 Write-Through 重试操作将作为 Write-Behind 操作异步重试。
备注
NCache 还提供了一个性能计数器 Datasource failed operations/sec
. 对返回的数据源执行的写操作 Failure
/FailureRetry
/FailureDontRemove
as OperationResult.Status
of
OperationResult
此计数器每秒计数。
NCache 允许您限制要重试的失败操作的数量。 在这种情况下,您会通过
NCache 管理器,如果超过该限制,您可以通过可配置的驱逐比率驱逐失败的操作。 这里, NCache 当重试队列已满时,将驱逐大多数重试操作。 每个操作都有一个 RetryCount
与之关联的属性,在对数据源重试的每个操作时递增。
为了这, NCache 提供了一个性能计数器
Write-behind failure retry count
和 Write-behind evictions/sec
。 该 Write-behind failure retry count
显示重新排队重试的操作数。 数据源写操作返回 FailureRetry
as Status
in OperationResult
将重新排队重试。 然而, Write-behind evictions/sec
计数器显示每秒驱逐的重试操作数。
数据源操作后更新缓存
如前所述,在 Write-Through 缓存中,操作首先对缓存存储执行,然后对数据源执行。 可能存在这样的场景,在对数据源执行操作之后,数据会被修改,例如,在标识列的情况下,其值可能会被数据源操作修改。 在这种情况下,数据可能会在缓存和数据源中变得不一致。 为了处理这个, NCache 允许您指定是否在数据源操作后更新缓存中的数据。 您可以启用 UpdateInNCache
标志以在缓存存储上再次执行操作(添加/插入)以使其与数据源同步,因此,通过 Write-Through 同步更新缓存存储中的操作或通过 Write-Behind 缓存异步更新缓存存储中的操作。
备注
NCache 还提供了一个性能计数器 Datasource updates/sec
显示数据源写入操作后缓存中每秒更新操作的数量。
在本节中
配置直写提供程序
解释 Write-Through Provider 接口并提供该接口的示例实现。
带缓存操作的直写
提供示例以使用 Write-Through 和基本操作 NCache.
缓存操作的后写
提供示例以使用 Write-Behind 和基本操作 NCache.
监控直写计数器
描述由提供的性能计数器 NCache 监控直写缓存。