为了一个简单的例子,我想要一个字符串列表。列表中的每个项目应在将其添加到列表后5分钟“过期”。虽然可能没有一种简单的内置方法可以做到这一点,但我想最终得到一个数据结构,其API感觉就像“正常工作”。
您可以按如下方式使用它:
var now = DateTime.now();
var list = new ListWithTTL<string>();
list.add("Bob", now);
list.add("Joe", now.AddMinutes(1));
list.add("Tom", now.AddMinutes(2));
list.add("Tim", now.AddMinutes(2));
立即检查元素会产生
["Bob", "Joe", "Tom", "Tim"]
几分钟后它应该产生
["Tom", "Tim"]
最终列表应为空。
答案 0 :(得分:24)
您可以使用.NET 4中的MemoryCache
类,它允许您在添加项目时指定TTL。
简单示例:
MemoryCache cache = new MemoryCache("foo");
cache.Add("bar", "baz", DateTime.Now.AddSeconds(5));
var bar = cache["bar"];//returns "baz"
Thread.Sleep(TimeSpan.FromSeconds(6));
var expired = cache["bar"]; //returns null
虽然没有直接向您提供TTL列表,但您可以根据您的解决方案进行调整,而不需要自己实现缓存过期。
答案 1 :(得分:0)
您应该能够使用SortedDictionary<DateTime, ...>
和自定义IComparer<DateTime>
来“反转”字典的顺序,以便最早的元素排在第一位。在从字典中返回元素之前,只需删除太旧的前N个元素。
当然,当调用者期待简单的读取时,修改“隐藏”下的集合可能会导致多线程环境中的问题,但这是一个不同的主题...