示例#1
0
 /// <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();//递归更新线程
         }
     });
 }
示例#2
0
        /// <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);
            }
        }
示例#3
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;
                            }
                        }
                    }
                }
            });
        }
示例#4
0
        /// <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++;
                }
            }
        }
示例#5
0
        /// <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;
                    }
                }
            });
        }