通读、直写、后写 NCache

NCache 是一种速度极快且可扩展的 .NET 内存分布式缓存,可缓存应用程序数据以减少昂贵的数据库访问。 您可以使用 NCache 消除与数据存储和数据库可扩展性相关的性能瓶颈。

使用此类缓存的最常见方法是让应用程序从数据库/数据源读取数据,然后缓存它。 之后,当您的应用程序更新数据库中的此数据时,它还会更新缓存以确保缓存与数据库同步。

此外, NCache 提供了另一种非常强大的数据读写机制,称为数据源提供者(Read-through/Write-through/Write-behind) NCache 从您的数据库中读取和写入数据。

您可以使用三种方式 NCache 在这种情况下:

  1. 通读: 您开发一个 Read-through Handler,它驻留在集群中的所有缓存服务器上并运行。 然后,当您的应用程序从缓存中获取任何数据时, NCache 如果缓存中尚不存在该数据,则调用 Read-through Handler 从数据源中读取该数据。
  2. 直写(同步): 您开发了一个直写处理程序,该处理程序也驻留在集群中的所有缓存服务器上并在其上运行。 而且,当您的应用程序更新缓存中的数据时, NCache 首先更新缓存,然后调用 Write-through Handler 立即用它更新数据库。 并且,您的应用程序也会等待数据库中的数据更新。
  3. 后写(异步): 如果您不希望应用程序等到 Write-through Handler 完成数据库中数据的更新,您可以选择 Write-behind 选项,其中 NCache 异步更新数据库,您的应用程序不必等待数据库更新。 这可以加快您的应用程序的速度,因为数据库更新通常比缓存更新慢得多。
图 1:服务器端代码(.NET 版本)
图 1:服务器端代码(.NET 版本)
图 1:服务器端代码(Java 版)
图 2:服务器端代码(Java 版)

通读/直写/后写的好处

以下是在中使用 Read-through、Write-through 和 Write-behind 的一些好处 NCache.

  1. 使用 Write-behind 获得更好的写入性能: 更新数据库通常比更新缓存慢得多。 当您使用 Write-behind 时,您的应用程序仅更新缓存并继续运行 NCache 异步更新您的数据库。 这大大提高了您的应用程序性能。
  2. 通过 Write-behind Throttling 实现更高的数据库可扩展性: 如果您的应用程序非常频繁地更新数据库,则可能会出现阻塞。 但是,如果您使用 Write-behind 打开限制,那么 NCache 通过复制使数据在缓存中保持更新,并缓慢更新数据库。 这减轻了数据库的很大压力。
  3. 过期时自动刷新缓存: 如果您开发了 Read-through Handler,则可以在过期时启用自动刷新 NCache. 这样,每当任何缓存项过期时,而不是将其从缓存中删除, NCache 调用 Read-through Handler 从数据源重新加载新副本。
  4. 数据库更改时自动刷新缓存: 如果您开发了 Read-through Handler,则可以使用以下命令启用 SQL 依赖项/Oracle 依赖项的自动刷新 NCache. 这样,每当数据库中对应的数据发生变化时,而不是从缓存中移除缓存的项, NCache 调用通读处理程序以从数据库重新加载新副本。

功能亮点

以下是 Read-through、Write-through 和 Write-behind 的一些亮点 NCache.

  1. 服务器端代码(.NET 或 Java): 您可以使用 .NET 或 Java 开发通读/通写处理程序。 每个处理程序都有一个接口,您可以在集群中的所有缓存服务器上开发和部署代码。 NCache 能够在需要时在运行时调用它们。 .NET 中开发的任何处理程序都由以下人员本地调用 NCache 因为它也是用 .NET 开发的。 然而,用Java开发的处理程序是通过 NCache 通过 Java 本机接口 (JNI)。
  2. 多个通读/通写处理程序: 您可以开发多个 Read-through 和 Write-through Handler 并将它们注册到 NCache。 在这种情况下,它们都已命名,您的应用程序可以通过指定它们的名称来请求其中的任何一个。
  3. 默认读/写处理程序: 如果您有多个注册为命名处理程序的处理程序,则 NCache 允许您选择其中之一作为默认选项。 当您的应用程序未指定处理程序名称时,将使用此默认处理程序。
  4. 通读亮点
    1. 强制通读: NCache 提供一个选项,您可以告诉它使用 Read-through,即使该项目存在于缓存中(通常,仅当在缓存中找不到项目时才调用 Read-through)。 如果您认为数据库中的数据可能已更改,这允许您从数据库中刷新此项。
    2. 批量通读: NCache 提供批量获取 API,允许您的应用程序提供一个键列表,您可以根据这些键从缓存中获取数据。
    3. 数据结构通读(计数器、字典、列表、队列、集合): NCache 为您的应用程序提供获取任何数据结构的能力 NCache 调用 Read-through 处理程序从数据库中获取此数据。
  5. 直写亮点
    1. 删除项目直写: NCache 还为您的应用程序提供了删除 API,它允许您使用密钥从缓存中删除项目,然后从数据源中删除项目。
    2. 批量删除项目直写: NCache 还提供批量删除 API,让您的应用程序提供要从缓存和数据源中批量删除的键列表。
    3. 批量添加/更新直写: NCache 提供批量添加/更新 API,让您的应用程序提供键列表及其值以批量添加/更新缓存。 直写也适用于这种情况,并使用这些项目批量添加/更新您的数据库/数据源。
    4. 数据结构直写(计数器、字典、列表、队列和集合): NCache 为您的应用程序提供更新任何数据结构的能力,并且 NCache 调用直写处理程序以使用更改更新数据库。
    5. 异步添加/更新/删除直写: NCache API 提供异步添加/插入/删除。 Write-through 支持此 API,并在您的应用程序进行该 API 调用时被调用。 这里。 直写式假设您的应用程序正在等待操作完成,并且只有在客户端 API 级别才能识别它是异步的这一事实。
  6. 后记亮点
    1. 异步操作队列复制(高可用性): Write-behind 接受客户端更新缓存的请求并立即更新缓存,但将数据库更新排队以便稍后异步执行。 根据缓存拓扑,该队列始终会复制到多个缓存服务器,以确保在任何缓存服务器突然停机时这些操作都不会丢失。
    2. 节流: 您可以为 Write-behind 异步操作指定限制级别。 这使您可以将它们分散开。 默认限制级别为 500 次操作/秒。
    3. 后写模式(非批处理或批处理): 非批处理模式意味着后写队列中的每个操作都是单独执行的,而在批处理模式下,您将多个操作集中在一起并共同执行。
    4. 批量操作延迟: 您可以指定两个批处理模式操作之间的延迟。 如果需要,这允许您减慢数据库的更新速度。
    5. 失败的操作队列: 由于 Write-behind 在操作失败时异步执行所有操作, NCache 可以将其放入失败操作队列中,以便可以再次执行它,而不会干扰尚未失败的新操作。 您可以指定最大大小和驱逐。
  7. 通过计数器监视直写/后写: NCache 提供了一组丰富的计数器,您可以使用它们监视直写式/后写式中发生的情况。 这些计数器可在 NCache 监视器、Windows PerfMon 工具、SNMP 计数器、Prometheus 和 Grafana。

通读/通写代码接口

开发 Read-through 和 Write-through Handler 的代码是一个简单的过程。 以下是两者的接口示例。

public interface IReadThruProvider
{
	void Init(IDictionary parameters, string cacheId);
	ProviderCacheItem LoadFromSource(string key);
	IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection<string> keys);
	ProviderDataTypeItem<IEnumerable> LoadDataTypeFromSource(string key, DistributedDataType dataType);
	void Dispose();
}
public interface ReadThruProvider extends java.lang.AutoCloseable
{
	void init(java.util.Map<java.lang.String,java.lang.String> parameters, java.lang.String cacheId) throws java.lang.Exception;
	ProviderCacheItem loadFromSource(java.lang.String key) throws java.lang.Exception;
	java.util.Map<java.lang.String,ProviderCacheItem> loadFromSource(java.util.Collection<java.lang.String> keys) throws java.lang.Exception;
	ProviderDataStructureItem loadDataStructureFromSource(java.lang.String key, DistributedDataStructureType distributedDataStructureType) throws java.lang.Exception;
}
public interface IWriteThruProvider
{
	void Init(IDictionary parameters, string cacheId);
	OperationResult WriteToDataSource(WriteOperation operation);
	ICollection<OperationResult> WriteToDataSource(ICollection<WriteOperation> operations);
	ICollection<OperationResult> WriteToDataSource(ICollection<DataTypeWriteOperation> dataTypeWriteOperations);
	void Dispose();
}
public interface WriteThruProvider extends java.lang.AutoCloseable
{
	void init(java.util.Map<java.lang.String,java.lang.String> parameters, java.lang.String cacheId) throws java.lang.Exception;
	OperationResult writeToDataSource(WriteOperation operation) throws java.lang.Exception;
	java.util.Collection<OperationResult> writeToDataSource(java.util.Collection<WriteOperation> operations) throws java.lang.Exception;
	java.util.Collection<OperationResult> writeDataStructureToDataSource(java.util.Collection<DataStructureWriteOperation< dataStructureWriteOperations) throws java.lang.Exception;
}

联系我们

联系电话
©版权所有 Alachisoft 2002 - 版权所有。 NCache 是 Diyatech Corp. 的注册商标。