如今,Web 应用程序越来越多地使用分布式缓存来通过缓存常用数据来提高性能和可伸缩性,从而减少昂贵的数据库访问。 分布式缓存跨越多个缓存服务器并同步,让您以线性方式扩展。 一个好的分布式缓存通常有一个缓存依赖特性,让你在缓存项依赖的东西发生变化时过期。 缓存依赖关系可以是基于键的、基于文件的或基于数据库的。 因此,本质上,您可以指定一个缓存项依赖于缓存中的另一个项(基于键)、文件系统中的文件(基于文件)或 SQL Server 数据库中的行或数据集(数据库-基于)。 而且,当任何这些来源中的数据发生更改时,您的缓存项目会自动从缓存中删除,因为“依赖关系已过期”。 这使您可以始终保持缓存数据的新鲜和正确。
这一切都很好,但是如果您希望缓存的项目依赖于数据源中的数据而不是上述数据源中的数据,该怎么办。 例如,您可能有一个为您提供数据更改的 RSS 提要(Rich Site Summary)。 而且,您有自己的程序来读取此提要,并希望根据您在 RSS 提要中看到的任何数据更改使某些缓存项目过期。 还有很多其他类似的情况,数据源是“自定义”的。 因此,为了处理这些情况,一个好的分布式缓存应该为您提供为您的缓存项实现自己的自定义缓存依赖项的灵活性,以便在您的自定义数据源中的数据发生更改时它们可以过期。
NCache 提供了这样一个 自定义缓存依赖 功能。 NCache 是适用于各种 .NET 应用程序的强大分布式缓存。 和, NCache 让您实现自己的自定义依赖项。 让我演示一下如何轻松实现自定义依赖项 NCache 以下。 以下是您必须采取的步骤:
- 添加使用 Alachisoft.NCache.Runtime.Dependencies; 引用您的自定义依赖项实现。
- NCache 提供名为 ExtensibleDependency 的可扩展抽象类,它是所有依赖项的基类。 你只需要从 ExtensibleDependency 继承你的自定义依赖类,然后重写它的 HasChanged 属性。 当此属性返回 true 时,依赖项的项将从缓存中过期。
这是自定义依赖实现的完整示例,其中如果指定产品的可用单位小于 100,则将触发依赖更改。
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 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using Alachisoft.NCache.Runtime.Dependencies; [Serializable] public class CustomDependency : ExtensibleDependency { private string _connString; private int _productID; public override bool Initialize(){ return false; } public CustomDependency(int productID, string connStr) { _connString = connStr; _productID = productID; } internal bool DetermineExpiration() { if (GetAvailableUnits(_productID) < 100) return true; return false; } internal int GetAvailableUnits(int productID) { OleDbDataReader reader=null; OleDbConnection connection= new OleDbConnection(_connString); connection.Open(); int availableUnits=-1; try { OleDbCommand cmd = connection.CreateCommand(); cmd.CommandText = String.Format(CultureInfo.InvariantCulture, "Select UnitsInStock From Products" + " where ProductID = {0}", productID); reader = cmd.ExecuteReader(); if (reader.Read()) { availableUnits = Convert.ToInt32(reader["UnitsInStock"].ToString()); } reader.Close(); return availableUnits; } catch (Exception) { return availableUnits; } } public override bool HasChanged { get { return DetermineExpiration(); } } } |
- 一旦您实现了自定义依赖项并使用 NCache 服务,您所需要的只是在需要时在应用程序中使用相关缓存项注册此依赖项。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
using Alachisoft.NCache.Web.Caching; //add namespace //Add following code in your application Cache _cache = NCache.InitializeCache("myCache"); string connString = "Provider=SQLOLEDB;Data Source=localhost; User ID=sa;password=;Initial Catalog=Northwind"; CustomDependency hint = new CustomDependency(123, connString); _cache.Add("Product:1001", "Value", new CacheDependency(hint), Cache.NoAbsoluteExpiration, new TimeSpan(0, 0, 10), Alachisoft.NCache.Runtime.CacheItemPriority.Default); |
现在,当您的自定义数据源中的数据发生变化时, NCache 自动从缓存中使依赖的缓存项过期。 NCache 负责运行您的自定义依赖项代码,因此您无需担心实现自己的单独程序并将其托管在某个可靠的进程中。 尝试并针对您的应用程序特定场景进行探索。