c#自带缓存使用方法 c#移除清理缓存


在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`来存储关键数据,特别是在需要持久化存储或高可靠性的场景下。