用 SQL 同步缓存 / NoSQL Databases

NCache 是一种速度极快且可线性扩展的分布式缓存,可让您缓存应用程序以提高应用程序性能。 当您缓存应用程序数据时,您正在创建缓存中的数据副本,该副本也存在于您的数据库中。 如果数据库中的这些数据发生变化,您需要确保缓存也被更新,使其始终与数据库保持一致。

为了处理这种情况, NCache 提供强大的数据库同步功能,当关系或数据发生变化时,缓存会自行同步 NoSQL database. 这里的同步意味着从缓存中删除相应的缓存项(或使用 Read-through 重新加载)。 NCache 为数据库同步提供以下内容:

  1. SQL依赖
  2. Oracle依赖
  3. 与 Cosmos DB / MongoDB 同步缓存
  4. OleDB 依赖
  5. CLR 程序
  6. 带通读的自动重新加载

下图显示了如何实现的基本架构 NCache 支持数据库同步:

数据库同步

SQL 依赖

SQL依赖关系 由...使用 NCache 如果您的数据库是 SQL Server。 在缓存中添加或更新缓存项时,可以为任何缓存项指定 SqlDependency。 SQL Server 监视数据集的任何添加、更新或删除并通知 NCache 在数据库更新后几乎立即通过 SQL 通知。 这些是转换为 .NET 事件的数据库通知。

SqlDependency 可以是以下任意一种:

  • 参数化 SQL 查询
  • 存储过程

您可以在博客中找到有关此主题的更多详细信息 与 SQL Server 同步缓存.

使用参数化查询

以下是如何在 .NET 代码中通过动态参数化查询使用 SqlDependency:

string connString = ConfigurationManager.AppSettings["connectionString"];
string query = "SELECT ProductID, ProductName, UnitPrice FROM Products WHERE ProductID > @productID";
...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("@productID", param);

SqlCacheDependency sqlDepenency = new SqlCacheDependency(connString, query, SqlCommandType.Text, sqlCmdParam);

使用存储过程

以下是如何在 .NET 代码中将 SqlDependency 与存储过程一起使用:

...
var param = new SqlCmdParams();
...
sqlCmdParam.Add("productID", param);

SqlCacheDependency sqlDependency = new SqlCacheDependency(connString, "sp_GetProductByID", SqlCommandType.StoredProcedure, sqlCmdParams);

甲骨文依赖

Oracle依赖 由...使用 NCache 如果您的数据库是 Oracle 10g 或更高版本并在 Windows 或 Unix 上运行。 就像 SqlDependency 一样,您可以在缓存中添加或更新缓存项时为任何缓存项指定 OracleDependency。

OracleDependency 可以是以下任意一种:

  • 参数化 SQL 查询
  • 存储过程

Oracle 服务器然后监视此数据集是否有任何添加、更新或删除,当发生这种情况时,它会通知 NCache 数据库更新后几乎立即通过 Oracle 通知。 这些通知在底层使用 Oracle 的客户端/服务器通信并与 NCache 通过.NET。

使用参数化查询

以下是如何在 .NET 代码中通过动态参数化查询使用 OracleDependency:

...
var param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);

OracleCacheDependency oracleDepenency = new OracleCacheDependency(connString, query, OracleCommandType.Text, oracleParam);

使用存储过程

您可以在 Oracle 依赖项中使用参数化存储过程调用,如下所示:

...
OracleCmdParams param = new OracleCmdParams();
. . .
oracleParam.Add("productID", param);

OracleCacheDependency oracleDependency = new OracleCacheDependency(connString, "sp_GetProductByID", OracleCommandType.StoredProcedure, oracleParam);

与 Cosmos DB / MongoDB 同步缓存

NCache 还为如何以及何时调用对缓存项的依赖项提供了更大的灵活性和控制。 可扩展的通知依赖 允许您实现自定义逻辑,该逻辑指定何时从缓存中删除数据。 您可以为 Cosmos DB 和 MongoDB 等底层数据库编写自定义提供程序,并且此提供程序部署在缓存上。 然后缓存检查所有部署的依赖项是否需要删除。

您可以创建自定义提供程序并将其部署在缓存上以在应用程序中使用自定义依赖项。 以下代码片段显示了如何在 .NET 代码中使用已部署的用于 Cosmos DB 同步的自定义提供程序,同时将项目添加到缓存:

Customer customer = LoadCustomerFromDB(customerId);

CacheDependency cosmosDbDependency = new CosmosDbNotificationDependency<Customer>(. . .) ;

var cacheItem = new CacheItem(customer);
cacheItem.Dependency = cosmosDbDependency;
cache.Insert("Customer:" + customer.Id, cacheItem);

OleDB 依赖

OleDB 依赖 OleDB 依赖项由 NCache 如果您的数据库既不是 SQL Server 也不是 Oracle,而是 OLEDB 兼容数据库。如果您不希望 SQL Server 和 Oracle 的事件通知在您的数据变化非常快时可能变得冗长,您还可以将 DbDependency 与 SQL Server 和 Oracle 一起使用。

在 DbDependency 中,您创建一个名为 ncache数据库中的 _db_sync 包含每个具有 DbDependency 的缓存项的一行。 当数据库中的相应数据发生更改时,您可以修改数据库触发器以更新此表中的行。 NCache 轮询此表以获取更新的行,因此在一次轮询中, NCache 获取数千行并将它们与数据库同步。

以下是在 .NET 代码中使用 DbDependency 的方法。

DBCacheDependency oledbDependency = DBDependencyFactory.CreateOleDbCacheDependency(connectionString, "PrimaryKey:dbo.Products");

var cacheItem = new CacheItem(product);
cacheItem.Dependency = oledbDependency;
cache.Insert(key, cacheItem);

CLR 程序

当缓存中有非常多的项目并且所有项目都需要与数据库同步时,最好写一个 CLR 程序 在 Windows 上的 SQL Server 中。 当相关数据发生变化时,从您的数据库触发器中调用此 CLR 过程。 然后,此 CLR 过程使异步 NCache 用于从缓存中添加、更新或删除相应缓存项的 API 调用。

下面是一个 CLR 过程的示例,该过程在对象被更新时将其删除。

[Microsoft.SqlServer.Server.SqlProcedure]
public static void RemoveOnUpdate(string cacheName, string key)
{            
    cacheName = "demoClusteredCache";
    Cache cache = CacheManager.GetCache(cacheName);
    cache.RemoveAsync(key);
}

使用 Read-Through 处理程序自动重新加载

数据库同步的默认行为是当数据库中相应数据发生变化时,将缓存项从数据库中移除。 但是,在某些情况下,您只想使用最新版本的数据对其进行更新。

为了应对这种需求, NCache 允许您将数据库同步与 通读 处理程序功能 NCache. 有了这个, NCache 只需调用 Read-through 处理程序来重新加载缓存项的最新副本,然后用它更新缓存。 此功能提供了同步的灵活性 NCache 与任何关系或 NoSQL database 已配置包括以下(以及更多):

  1. SQL服务器
  2. 神谕
  3. 宇宙数据库
  4. MongoDB的

以下代码片段显示了如何将数据自动批量重新加载到 NCache 从 Cosmos DB 使用 Read-Through。 您还可以在博客中找到更多详细信息 与 CosmosDB 同步缓存.

public Task ProcessChangesAsync(IChangeFeedObserverContext context, IReadOnlyList docs, CancellationToken cancellationToken) 
{
    cacheItems = cache.GetBulk(DocsKeys, new ReadThruOptions {Mode = ReadMode.ReadThruForced} );
    return Task.CompletedTask;
}

接下来做什么?

NCache 更多信息
下载免费 30 天安装密钥
请求个性化的现场演示
阅读产品文档

联系我们

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