在分布式缓存环境中,可能存在某些数据应存在于缓存中以供应用程序在开始执行后立即使用的情况。 最初,当缓存启动时,它不包含任何可能导致昂贵的数据源访问以获取数据,从而影响应用程序性能的数据。 因此,用于存储数据的缓存在应用程序开始使用之前预加载一些参考数据变得很重要。
以此目的, NCache 提供了一个 缓存启动加载器 该功能允许用户实现一个接口,以便在缓存启动后立即将所需的参考数据预加载到缓存中。 因此,用户应用程序不会出现缓存未命中和更少的数据源访问,从而实现更快的性能。
缓存启动加载器的组件
每次缓存启动时,Cache Startup Loader 会自动从数据源中获取数据,供用户预先使用。 因此,在讨论 Cache Loader 的工作原理之前,用户应该了解它的一些特性,这些特性将在下面解释。
- 数据集: 数据集是用户对不同类型的数据进行分组的一种方式,以便他们可以以不同的时间间隔或事件分别加载或刷新它们以实现并行性。
- 装载机服务: 它负责管理任务并在启动时将数据从数据源加载到缓存中。
- 缓存加载器重试: 如果在加载缓存时操作失败,可以通过配置的重试次数选项再次执行这些失败的操作,然后再移动到下一个操作 NCache 网络管理器。
NCache 更多信息 缓存加载器和刷新器文档 NCache 配套文档
如何实现缓存启动加载器?
要启用 Cache Startup Loader,用户首先需要实现 缓存加载器 界面。 NCache 使用这个接口和下面解释的方法在缓存启动时从缓存中的数据源加载数据。
初始化缓存启动加载器
在里面 在 Cache Startup 上调用方法来传递配置的参数,以便用户可以相应地使用它来初始化他们的缓存和数据源。 只需通过打开数据库连接(如 SQL)来配置连接,并使用给定名称初始化缓存,如下面的 .NET 和 Java 示例实现。
1 2 3 4 5 6 7 8 9 |
public void Init(IDictionary<string, string> parameters, string cacheName) { cache = CacheManager.GetCache(cacheName); connectionString = parameters.ContainsKey("ConnectionString") ? parameters["ConnectionString"] : null; if (connectionString != null) { connection = new SqlConnection(connectionString); } } |
1 2 3 4 5 6 7 8 |
public void init(Map<String, String> parameters, String cacheName) { cache = CacheManager.getCache(cacheName); connectionString = parameters.containsKey("ConnectionString") ? parameters.get("ConnectionString") : null; if (connectionString != null) { connection = DriverManager.getConnection(connectionString); } } |
在缓存启动时加载数据
.NET 和 Java 的以下示例实现,该方法 启动时加载数据集 of ICacheLoader
接口从数据源获取数据,并在缓存启动时将其添加到缓存中以预加载缓存。 它返回一个用户上下文,其中包含有关缓存中加载的数据的信息。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public object LoadDatasetOnStartup(string dataset) { // Create a list of datasets to load at cache startup IList<object> datasetToLoad; switch (dataSet.ToLower()) { // If dataset is "products", fetch products from data source to load in cache case "products": datasetToLoad = FetchProductsFromDataSource(); // Insert fetched product in the cache foreach (var product in datasetToLoad) { string key = $"ProductID:{product.Id}"; cache.Insert(key, product); } break; // You can add more cases for different datasets as per requirement and fetch them from the data source default: // Invalid dataset } // User context is the time at which datasets were loaded in the cache object userContext = DateTime.Now; return userContext; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
public Object loadDatasetsOnStartup(String dataset) { // Create a list of datasets to load at cache startup List<Object> datasetToLoad; switch (dataset.toLowerCase()) { // If dataset is "products", fetch products from data source and add in cache case "products": datasetToLoad = fetchProductsFromDataSource(); // Insert fetched product in the cache for (var product : datasetToLoad) { string key = "ProductID:" + product.productID; cache.insert(key, product); } break; // You can add more cases for different datasets as per the requirement and fetch them from data source default: // Invalid dataset } // User context is the time at which datasets were loaded in the cache Object userContext = LocalDateTime.now(); return userContext; } |
就像数据的预加载是一件很重要的事情一样,加载的数据很可能会过时。 由于数据源中发生的任何更改,缓存中已加载的数据可能会发生更改,这就是预加载的数据可能变得陈旧的原因。 为了使这些加载的数据保持新鲜, NCache 提供了一个功能 缓存刷新器 它使用缓存加载器实现来保持加载的数据新鲜并与数据源同步。
NCache 更多信息 配置缓存加载器和刷新器 缓存刷新文档
通过配置缓存加载器 NCache 网络管理员
一旦用户实现了 Cache Startup Loader,他们可以通过 NCache 网络管理员. 下面是如何做到的。
结论!
正如你可以看到, NCache 为其用户提供强大的功能缓存启动加载器,以将数据预加载到缓存中,而不是手动跟进。 所以,抓住 NCache 并获得其所有惊人的功能,以获得更快的应用程序性能和可扩展性!