System.Runtime.Caching.MemoryCache的通用实现

本文关键字:实现 MemoryCache Runtime Caching System | 更新日期: 2023-09-27 18:37:07

MemoryCache是否有任何通用的替代方案/实现?

我知道 MemoryCache 在后台使用哈希表,所以只需要过渡到使用 Dictionary<,>,这是 Hashtable 的通用版本。

这将提供类型安全性并提供性能优势,因为没有装箱/拆箱。

编辑:我感兴趣的另一件事是拥有不同的密钥类型。默认值为 System.String。

System.Runtime.Caching.MemoryCache的通用实现

MemoryCache是否有任何通用的替代方案/实现?

不在基类库中。 你必须自己滚动,尽管我个人只会围绕提供你想要的API的MemoryCache做一个包装器。

这将提供类型安全性并提供性能优势,因为没有装箱/拆箱

类型安全可以在包装类中相当容易地处理。 装箱/取消装箱只有在存储值类型(而不是类)时才是一个问题,即使这样,也可能是最小的,因为您不太可能经常从缓存中推送和拉取,以至于这是一个真正的性能问题。

至于类型安全性和可用性,我实际上已经编写了自己的方法来将MemoryCache项的调用包装在一个泛型方法中,从 API 的角度来看,这允许更好的使用。 这非常简单 - 通常只需要以下方法:

public T GetItem<T>(string key) where T : class
{
    return memoryCache[key] as T;
}

同样,您可以创建一个以相同方式设置值的方法。

编辑:我感兴趣的另一件事是拥有不同的密钥类型。默认值为 System.String。

这在MemoryCache中不直接支持,因此需要相当多的工作来生成自己的密钥。 一种选择是制作一个类型安全包装器,该包装器还提供了基于您的值生成字符串键的Func<T, string> - 这将允许您为任何类型的T生成缓存条目。 但是,您必须小心,将所需的字符串中的所有数据作为比较的一部分包含在字符串中。

我写了我的FWIW:

https://github.com/ysharplanguage/GenericMemoryCache#readme(链接失效)

这里有一个原始代码的分支:

https://github.com/caesay/GenericMemoryCache

我正在研究一种更快的MemoryCache替代方案,称为FastCache

支持键和值的泛型,查找速度几乎就像Dictionary,即比MemoryCache快7-10倍

附言免责声明:我是项目的维护者。