System.Runtime.Caching库是.NET 4.0引入的缓存库,用于提高应用程序性能。它提供了一组API,用于在内存中存储、检索和管理缓存对象,并包括一些高级功能,如回调和过期策略等。在.NET 7.0中,System.Runtime.Caching库进行了进一步改进和优化,可用于实现不同级别的缓存管理。下面我们对其进行详细介绍和分类。
以下是System.Runtime.Caching库按照不同的功能和用途进行分类,并附有源代码剖析:
System.Runtime.Caching库适用于需要在应用程序中实现内存缓存的场景。以下是一些常见的使用场景:
System.Runtime.Caching是Microsoft提供的内存缓存方案,封装了一组用于管理缓存的API。它使用MemoryCache类来实现内存缓存,可以用于单个应用程序域或分布式系统中。以下是System.Runtime.Caching的优缺点:
优点:
缺点:
System.Runtime.Caching提供了一组用于管理缓存的API,主要包括以下类型:
MemoryCache类
MemoryCache类是System.Runtime.Caching库中的核心类,它表示一个内存中的缓存集合。MemoryCache类是一个线程安全的、可扩展的、基于键值对的缓存系统。MemoryCache类提供了以下一些方法:
源代码剖析:
[DefaultMember("Item")]
public class MemoryCache : ObjectCache, IEnumerable, IDisposable
{
public MemoryCache(string name, NameValueCollection config = null);
public MemoryCache(string name, NameValueCollection config, bool ignoreConfigSection);
public override object this[string key] { get; set; }
public static MemoryCache Default { get; }
public long PhysicalMemoryLimit { get; }
public override string Name { get; }
public long CacheMemoryLimit { get; }
public TimeSpan PollingInterval { get; }
public override DefaultCacheCapabilities DefaultCacheCapabilities { get; }
// 添加缓存项
public override bool Add(CacheItem item, CacheItemPolicy policy);
public override object AddOrGetExisting(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null);
public override CacheItem AddOrGetExisting(CacheItem item, CacheItemPolicy policy);
public override object AddOrGetExisting(string key, object value, CacheItemPolicy policy, string regionName = null);
public override bool Contains(string key, string regionName = null);
public override CacheEntryChangeMonitor CreateCacheEntryChangeMonitor(IEnumerable<string> keys, string regionName = null);
public void Dispose();
// 获取缓存项
public override object Get(string key, string regionName = null);
public override CacheItem GetCacheItem(string key, string regionName = null);
public override long GetCount(string regionName = null);
public long GetLastSize(string regionName = null);
public override IDictionary<string, object> GetValues(IEnumerable<string> keys, string regionName = null);
public override object Remove(string key, string regionName = null);
// 移除缓存项
public object Remove(string key, CacheEntryRemovedReason reason, string regionName = null);
public override void Set(string key, object value, CacheItemPolicy policy, string regionName = null);
public override void Set(CacheItem item, CacheItemPolicy policy);
public override void Set(string key, object value, DateTimeOffset absoluteExpiration, string regionName = null);
public long Trim(int percent);
// 遍历缓存
protected override IEnumerator<KeyValuePair<string, object>> GetEnumerator();
}
CacheItem和CacheItemPolicy类
CacheItem表示一个缓存项,包括键、值、过期时间等属性。CacheItemPolicy则表示一个策略对象,用于指定缓存项的一些属性,如过期时间、回收策略、依赖项等。
源代码剖析:
public class CacheItem
{
public CacheItem(string key);
public CacheItem(string key, object value);
public CacheItem(string key, object value, string regionName);
public string Key { get; set; }
public object Value { get; set; }
public string RegionName { get; set; }
}
public class CacheItemPolicy
{
public CacheItemPolicy();
public DateTimeOffset AbsoluteExpiration { get; set; }
public Collection<ChangeMonitor> ChangeMonitors { get; }
public CacheItemPriority Priority { get; set; }
public CacheEntryRemovedCallback RemovedCallback { get; set; }
public TimeSpan SlidingExpiration { get; set; }
public CacheEntryUpdateCallback UpdateCallback { get; set; }
}
CacheEntryChangeMonitor类
CacheEntryChangeMonitor类提供了监视缓存项更改的功能,以便在发生更改时执行回调函数或其他操作。
源代码剖析:
public abstract class CacheEntryChangeMonitor : ChangeMonitor
{
protected CacheEntryChangeMonitor();
public abstract ReadOnlyCollection<string> CacheKeys { get; }
public abstract DateTimeOffset LastModified { get; }
public abstract string RegionName { get; }
}
过期策略
过期策略用于确定何时从缓存中删除对象,以防止缓存过多的对象导致内存泄漏或性能降低。System.Runtime.Caching库中提供了三种基本的过期策略:绝对时间、相对时间和空闲时间。可以通过CacheItemPolicy类中的AbsoluteExpiration、SlidingExpiration属性指定缓存项的过期策略。
源代码剖析:
public class CacheItemPolicy
{
// 设置过期时间(绝对时间)
public DateTimeOffset? AbsoluteExpiration { get; set; }
// 设置过期时间(相对时间)
public TimeSpan? SlidingExpiration { get; set; }
}
依赖关系
依赖关系用于使缓存项具有基于文件、目录、键或其他对象的依赖关系。当这些依赖项更改时,缓存中的项将自动无效。在System.Runtime.Caching库中,可以通过以下类实现依赖关系的管理:
源代码剖析:
public class CacheDependency : IDisposable
{
public CacheDependency(string filename);
public CacheDependency(string[] filenames);
public virtual string GetUniqueID();
public virtual void NotifyDependencyChanged(object sender, EventArgs e);
}
public abstract class ChangeMonitor : IDisposable
{
// 标识缓存项是否已过期
public virtual bool HasChanged { get; }
}
回调函数
回调函数用于在缓存项过期或被删除时执行指定的回调函数。在System.Runtime.Caching库中,可以通过CacheItemPolicy类中的RemovedCallback属性指定当缓存项过期或被删除时要执行的回调函数。
源代码剖析:
public class CacheItemPolicy
{
// 设置缓存项被删除时的回调函数
public int RemovedCallback { get; set; }
}
缓存统计信息
缓存统计信息提供了缓存对象的统计数据,如当前缓存项数目、命中率等。在System.Runtime.Caching库中,可以通过MemoryCacheStatistics类获取缓存统计信息。
源代码剖析:
public sealed class MemoryCacheStatistics
{
public int Count { get; }
public long Hits { get; }
public double HitRatio { get; }
public long Misses { get; }
public double MissRatio { get; }
}
高级回收策略
高级回收策略提供了自定义的回收策略,以更精细地控制缓存对象的生命周期。在System.Runtime.Caching库中,可以通过以下类实现高级回收策略的管理:
源代码剖析:
public interface ICachePolicyManager
{
CacheItemPolicy GetItemPolicy(string key, object value);
}
public sealed class CacheMemoryPressureMonitor : IDisposable
{
// 监视系统内存压力,并设置相应的缓存策略
}
public sealed class BackgroundMemoryMonitor : IDisposable
{
public BackgroundMemoryMonitor(ICachePolicyManager policyManager);
// 监视系统内存压力,并根据缓存策略来删除缓存项
}
缓存区域
缓存区域允许将缓存项分配到不同的区域,以便更好地管理和组织缓存项。在System.Runtime.Caching库中,可以通过CacheArea类实现缓存区域的管理。
源代码剖析:
public class CacheArea : IDisposable
{
public CacheArea(string name);
public string Name { get; }
public void Dispose();
public object Get(string key);
public bool Contains(string key);
public void Add(string key, object value, CacheItemPolicy policy);
public void Remove(string key);
}
以下是一个使用System.Runtime.Caching命名空间的示例代码,展示了如何使用MemoryCache类来创建缓存并添加、获取和删除缓存项:
using System;
using System.Runtime.Caching;
namespace MemoryCacheDemo
{
class Program
{
static void Main(string[] args)
{
// 创建一个内存缓存对象
MemoryCache cache = MemoryCache.Default;
// 添加一个缓存项
cache.Add("key1", "value1", DateTimeOffset.UtcNow.AddMinutes(30));
// 获取缓存项的值
Object value = cache.Get("key1");
if (value != null)
{
Console.WriteLine("获取缓存项:{0}", value);
}
// 删除缓存项
cache.Remove("key1");
// 再次尝试获取已被删除的缓存项
value = cache.Get("key1");
if (value == null)
{
Console.WriteLine("获取失败,缓存项已被删除");
}
// 设置缓存项的属性
CacheItemPolicy policy = new CacheItemPolicy();
policy.AbsoluteExpiration = DateTimeOffset.UtcNow.AddMinutes(30);
cache.Set("key2", "value2", policy);
Console.ReadKey();
}
}
}
在这个例子中,我们首先使用MemoryCache.Default静态属性来获取默认的内存缓存对象。然后,我们使用Add方法向缓存中添加一个项,Get方法从缓存中获取一个项,Remove方法从缓存中删除一个项,以及Set方法设置缓存项的属性。注意,我们使用CacheItemPolicy类来指定缓存项的过期时间和其他选项。
以上是System.Runtime.Caching库按照不同的功能和用途进行分类,并提供相应的源代码剖析。根据实际需求,可以选择适当的API和功能进行组合使用,以达到最佳的性能和效果。