如何使用.Net 4的新并发集合实现支持超时的缓存类?
缓存类通常会包含数十万个条目。缓存的很大一部分可能会同时到期。
与典型的网络缓存不同,后者可能因内存压力而缩小,此类只应在超时时自动删除。
答案 0 :(得分:6)
为什么需要实现自定义缓存类?是不是默认实现足够了?有一个whole new assembly dedicated to caching in .NET 4.0。缓存值10分钟的示例:
var cache = MemoryCache.Default;
cache.Add("key", new object(), DateTime.Now.AddMinutes(10));
答案 1 :(得分:2)
退后一步,考虑一下基于大小的缓存的工作原理。 LRU策略将删除最近使用的最后一个条目。在访问(读取)或变异(写入)时,将考虑使用条目。最常见的算法是使用双向链表来交叉切割哈希表,以便表查找在O(1)时间内查找列表链中的条目。该列表维护头部是最近最少使用的尾部,尾部是最近使用的,因此访问的条目被移动到尾部。在驱逐时,头条目是受害者,它被取消链接并从表中移除。
现在考虑过期。实践中发现的策略将根据上次读取(空闲时间)或最后一次写入(生存时间)重置超时。这可能听起来类似于上述LRU算法,因为它基于相同的访问模式维护排序。唯一的区别是当缓存确定需要驱逐时:大小与时间。因此,我们可以应用相同的算法,只是改变我们检测溢出的方式!
这意味着您可以实现LRU算法并概括评估谓词,以允许在绑定到时间限制的容量之间切换。结果是时间和空间有效的可过期缓存。