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

时间:2012-06-13 15:46:22

标签: c# generics caching optimization

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

我知道MemoryCache在底层使用了Hashtable,所以它只需转换到使用Dictionary<,>这是Hashtable的通用版本。

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

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

2 个答案:

答案 0 :(得分:14)

  

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

不在基类库中。你必须自己动手,尽管我个人只会在MemoryCache附近制作一个提供你想要的API的包装。

  

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

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

至于类型安全性和可用性,我实际上已经编写了自己的方法来将MemoryCache项的调用包装在一个通用的方法中,这样可以从API的角度更好地使用它。这很容易 - 通常只需要一个方法:

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

同样,您可以使用相同的方法设置值。

  

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

MemoryCache不直接支持此功能,因此需要花费大量工作才能生成自己的密钥。一种选择是创建一个类型安全的包装器,它还提供了一个Func<T, string>来根据你的值生成一个字符串键 - 这将允许你为任何类型T生成一个缓存条目。当然,您必须小心地将所有数据包含在比较中所需的字符串中。

答案 1 :(得分:1)

我写了我的,FWIW:

https://github.com/ysharplanguage/GenericMemoryCache#readme (链接已死)

这里有原始代码的分支:

https://github.com/caesay/GenericMemoryCache