在C#中,虽然.NET Framework和.NET Core/.NET 5+等版本没有直接提供一个名为“自带缓存”的类,但通常我们可以使用`MemoryCache`(内存缓存)或`HttpCachePolicy`(主要用于ASP.NET Web应用的HTTP缓存)来实现缓存功能。对于内存缓存的移除和清理,我们主要关注`MemoryCache`。
### 使用MemoryCache
首先,你需要引入`System.Runtime.Caching`命名空间来使用`MemoryCache`。
using System.Runtime.Caching;
public class CacheExample
{
private static readonly MemoryCache cache = new MemoryCache("MyCache");
// 添加缓存项
public static void AddToCache(string key, object value, int cacheTimeMinutes)
{
var cacheItemPolicy = new CacheItemPolicy
{
AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(cacheTimeMinutes)
};
cache.Add(new CacheItem(key, value), cacheItemPolicy);
}
// 移除缓存项
public static void RemoveFromCache(string key)
{
cache.Remove(key);
}
// 清理缓存(移除所有项)
public static void ClearCache()
{
var cacheItemsKeys = cache.GetEnumerator();
while (cacheItemsKeys.MoveNext())
{
var cacheItem = cacheItemsKeys.Current;
cache.Remove((string)cacheItem.Key);
}
}
}
### 说明
- **AddToCache** 方法:用于向缓存中添加一个项,可以指定缓存项的过期时间。
- **RemoveFromCache** 方法:用于从缓存中移除一个指定的项。
- **ClearCache** 方法:用于移除缓存中的所有项。注意,由于`MemoryCache`的`GetEnumerator`方法返回的是一个弱类型的枚举器,我们需要将键转换为字符串(因为`MemoryCache`的键是`object`类型,但在这个例子中我们假设它们都是字符串)。
请注意,`MemoryCache`不是线程安全的,但在大多数情况下,`MemoryCache`内部已经处理了多线程环境下的并发问题。然而,在编写访问缓存的代码时,你应该注意避免在缓存操作中出现复杂的逻辑或长时间的阻塞,因为这可能会影响缓存的性能和效果。
此外,`MemoryCache`的清理机制并不是实时的,它依赖于缓存项的过期时间和内存压力。当系统内存不足时,.NET运行时可能会根据一定的算法移除缓存中的项以释放内存。因此,你不能完全依赖`MemoryCache`来存储关键数据,特别是在需要持久化存储或高可靠性的场景下。