代码执行步骤:
  1、初始化桶加入到链表
  2、计算缓存数据长过期时间,并作为线程休眠的时间。
  3、线程触发时删除后一个桶并加入新的桶
  4、不断循环休眠触发触发
  5、启动线程
  整个桶的数据删除只需要加一次锁即可,保证其高效。
  获取、插入、删除
  遍历整个链表,查询到第一个满足key的立即返回,这需要保证不会有重复key。
  public V Get(K key)
  {
  lock (Obj)
  {
  foreach (var item in buckets)
  {
  if (item.ContainsKey(key))
  return item[key];
  }
  return default(V);
  }
  }
  在插入时删除对应的key,保证不会有重复的key出现。
  public void Put(K key, V value)
  {
  lock (Obj)
  {
  foreach (var item in buckets)
  {
  item.Remove(key);
  }
  buckets.First().Add(key, value);
  }
  }
  删除对应的key
  public void Remove(K key)
  {
  lock (Obj)
  {
  foreach (var item in buckets)
  {
  if (item.ContainsKey(key))
  item.Remove(key);
  }
  }
  }
  总结
  在那些年我们一起追过的缓存写法(三)中有介绍过关于惰性删除及高效LRU算法优化缓存容器的过期,有兴趣的童鞋可以看看。
  完整代码中有容器Size、ContainsKey的实现,github-TimeCacheMap.c#。
  在storm中,spout发射的消息和acker的消息即保存在各自的TimeCacheMap里,如果消息超时后会自动通知spout的fail方法。 在storm0.8后TimeCacheMap被弃用了,使用的是新的RotatingMap,但设计和实现基本没变,github-TimeCacheMap.java及github-RotatingMap.java。