/// <summary> ///推送移除元素 /// </summary> private void CheckRemoveEntity() { Task.Factory.StartNew(() => { Thread.Sleep(3000); while (!removeEntities.IsEmpty) { RemoveEntity <TKey, TValue> entity = null; if (removeEntities.TryDequeue(out entity)) { if (CacheRemoveListener != null) { CacheRemoveListener(this, entity.Key, entity.Value, entity.State); } if (dicPersRemove != null) { dicPersRemove[entity.Key] = entity.Value; } } if (isStop) { break; } } if (!isStop) { CheckRemoveEntity();//递归更新线程 } }); }
/// <summary> /// 允许空间换时间 /// 记录操作:允许扩展空间并且是FIFO,LRU策略 /// </summary> private void RemovePolicyMemory() { // //全面用空间换时间 //所有key Dictionary <TKey, string> dic = new Dictionary <TKey, string>();//过滤 //所有Key顺序 LinkedList <TKey> list = new LinkedList <TKey>(); TKey[] tkeys = new TKey[stack.Count]; //要保障顺序,不能用多线程 int r = stack.TryPopRange(tkeys); for (int i = 0; i < r; i++) { if (!dic.ContainsKey(tkeys[i])) { list.AddLast(tkeys[i]); } else { dic[tkeys[i]] = null; } } //没有记录KEY,修正一下数据量 cacheSize = dic.Count; // WeakRef(list); //超时 CheckCacheTime(list); //FIFO,LRU TValue value = default(TValue); if (list.Count > weighter) { // int num = list.Count - weighter; do { //通过list删除 if (TryRemove(list.Last.Value, out value)) { RemoveEntity <TKey, TValue> element = new RemoveEntity <TKey, TValue>() { Key = list.Last.Value, State = 3 }; removeEntities.Enqueue(element); num--; } list.RemoveLast(); if (list.Count == 0) { break; } } while (num > 0); } }
/// <summary> /// 监测超时 /// </summary> /// <param name="keys"></param> private void CheckCacheTime(LinkedList <TKey> keys) { if (4 != kvState) { return; } // CacheEntity <TValue> entity = null; long curTime = DateTime.Now.Ticks; lastWriteTime = long.MaxValue; int leftTime = config.CacheTime * 1000; long timeLen = 0; Parallel.ForEach(keys, (key) => { if (!IsPersistent(key)) { //非持久元素 if (dicCache.TryGetValue(key, out entity)) { timeLen = curTime - entity.element.WriteTime; if (timeLen / ticksMS >= leftTime) { // RemoveEntity <TKey, TValue> element = new RemoveEntity <TKey, TValue>() { Key = key, State = 1 }; element.Value = entity.element.Value; removeEntities.Enqueue(element); } else { if (lastWriteTime > entity.element.WriteTime) { //记录最早的写入 lastWriteTime = entity.element.WriteTime; } } } } }); }
/// <summary> /// 移除元素 /// 按照设置的最大数据及权重 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="list"></param> /// <param name="dic"></param> private void RemovePolicyList <T>(List <T> list, Dictionary <T, TKey> dic) { int num = list.Count - weighter; //通过list删除 TKey key; TValue value; for (int i = 0; i < num; i++) { if (i >= list.Count - 1) { break; } if (dic.TryGetValue(list[i], out key)) { if (TryRemove(key, out value)) { RemoveEntity <TKey, TValue> element = new RemoveEntity <TKey, TValue>() { Key = key, State = 3, Value = value }; removeEntities.Enqueue(element); if (IsPersistent(key)) { lazyObject.Value.RemovePersistent(key); } } else { num++; } } else { num++; } } }
/// <summary> /// 监测弱引用,包括超时到期 /// </summary> /// <param name="keys"></param> private void WeakRef(LinkedList <TKey> keys) { if (4 == kvState) { return; } object item = null; long curTime = DateTime.Now.Ticks; TValue value = default(TValue); CacheEntity <WeakReference <object> > kv = null; CacheEntity <TValue> entity = null; lastWriteTime = long.MaxValue; int leftTime = config.CacheTime * 1000; Parallel.ForEach(keys, (key) => { if (!IsPersistent(key)) { //不是持久Key才判断 switch (kvState) { case 1: { if (dicWeakKV.TryGetValue(key, out kv)) { if (!kv.element.Value.TryGetTarget(out item)) { //没有数据了 dicWeakKV.Remove(key); RemoveEntity <TKey, TValue> element = new RemoveEntity <TKey, TValue>() { Key = key, State = 2 }; removeEntities.Enqueue(element); } else if ((curTime - kv.element.WriteTime) / ticksMS > leftTime) { // RemoveEntity <TKey, TValue> element = new RemoveEntity <TKey, TValue>() { Key = key, State = 1 }; if (TryRemove(key, out value)) { element.Value = value; } removeEntities.Enqueue(element); } else { if (lastWriteTime > kv.element.WriteTime) { //记录最早的写入 lastWriteTime = kv.element.WriteTime; } } } } break; case 3: { if (dicWeakValue.TryGetValue(key, out kv)) { if (!kv.element.Value.TryGetTarget(out item)) { //没有数据了 dicWeakValue.TryRemove(key, out kv); RemoveEntity <TKey, TValue> element = new RemoveEntity <TKey, TValue>() { Key = key, State = 2 }; removeEntities.Enqueue(element); } else if ((curTime - kv.element.WriteTime) / ticksMS > leftTime) { if (lazyObject.IsValueCreated) { //是否是持久缓存元素 if (!lazyObject.Value.IsPersistent(key)) { RemoveEntity <TKey, TValue> element = new RemoveEntity <TKey, TValue>() { Key = key, State = 1 }; if (TryRemove(key, out value)) { element.Value = value; } removeEntities.Enqueue(element); } } else { // RemoveEntity <TKey, TValue> element = new RemoveEntity <TKey, TValue>() { Key = key, State = 1 }; if (TryRemove(key, out value)) { element.Value = value; } removeEntities.Enqueue(element); } } if (lastWriteTime > kv.element.WriteTime) { //记录最早的写入 lastWriteTime = kv.element.WriteTime; } } } break; case 2: { if (dicWeakKey.TryGetValue(key, out entity)) { //值检查超时 if ((curTime - entity.element.WriteTime) / ticksMS > leftTime) { // RemoveEntity <TKey, TValue> element = new RemoveEntity <TKey, TValue>() { Key = key, State = 1 }; if (TryRemove(key, out value)) { element.Value = value; } removeEntities.Enqueue(element); } if (lastWriteTime > entity.element.WriteTime) { //记录最早的写入 lastWriteTime = entity.element.WriteTime; } } } break; } } }); }