Esempio n. 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="entityKey"></param>
        /// <param name="entityData"></param>
        /// <param name="periodTime"></param>
        /// <param name="itemSet"></param>
        /// <param name="isLoad"></param>
        /// <returns></returns>
        public bool AddOrUpdateEntity(string entityKey, T entityData, int periodTime, out CacheItemSet itemSet, bool isLoad = false)
        {
            try
            {
                if (!Container.TryGetValue(entityKey, out itemSet))
                {
                    itemSet = CreateItemSet(CacheType.Entity, periodTime);

                    if (!Container.TryAdd(entityKey, itemSet))
                    {
                        return(false);
                    }
                }
                CheckEventBind(entityData as AbstractEntity);
                itemSet.SetItem(entityData);
                if (!isLoad)
                {
                    entityData.TriggerNotify();
                }
                entityData.IsInCache = true;
                return(true);
            }
            catch (Exception e)
            {
                itemSet = null;
                TraceLog.WriteError("添加或更新实体失败,出现异常:{0}\r\n{1}", e.Message, e.StackTrace);
            }
            return(false);
        }
Esempio n. 2
0
 internal bool TryGetOrAddRank(string key, out CacheItemSet itemSet, int periodTime = 0)
 {
     if (!Container.TryGetValue(key, out itemSet))
     {
         itemSet = new CacheItemSet(CacheType.Rank, periodTime, IsReadonly);
         itemSet.SetItem(new CacheList <T>());
         if (!Container.TryAdd(key, itemSet))
         {
             return(false);
         }
     }
     return(true);
 }
Esempio n. 3
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="entityKey"></param>
 /// <param name="entityData"></param>
 /// <param name="periodTime"></param>
 /// <param name="itemSet"></param>
 /// <param name="isLoad"></param>
 /// <returns></returns>
 public bool TryAddEntity(string entityKey, T entityData, int periodTime, out CacheItemSet itemSet, bool isLoad = false)
 {
     itemSet = CreateItemSet(CacheType.Entity, periodTime);
     itemSet.SetItem(entityData);
     if (Container.TryAdd(entityKey, itemSet))
     {
         CheckEventBind(entityData as AbstractEntity);
         if (!isLoad)
         {
             entityData.TriggerNotify();
         }
         entityData.IsInCache = true;
         return(true);
     }
     return(false);
 }
Esempio n. 4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="groupKey"></param>
        /// <param name="entityData"></param>
        /// <param name="periodTime"></param>
        /// <param name="expiredHandle"></param>
        /// <returns></returns>
        public bool TryAddQueue(string groupKey, T entityData, int periodTime, Func <string, CacheQueue <T>, bool> expiredHandle)
        {
            var lazy = new Lazy <CacheItemSet>(() =>
            {
                var temp = new CacheItemSet(CacheType.Queue, periodTime, IsReadonly);
                temp.SetItem(new CacheQueue <T>(expiredHandle));
                return(temp);
            });

            var itemSet = Container.GetOrAdd(groupKey, name => lazy.Value);

            if (itemSet != null)
            {
                ((CacheQueue <T>)itemSet.GetItem()).Enqueue(entityData);
                return(true);
            }
            return(false);
        }
Esempio n. 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="redisKey"></param>
        /// <param name="itemPair">key:entity's key, value:</param>
        /// <param name="periodTime"></param>
        /// <returns></returns>
        public static bool TryGetCacheItem(string redisKey, out KeyValuePair <string, CacheItemSet> itemPair, int periodTime = 0)
        {
            itemPair = default(KeyValuePair <string, CacheItemSet>);
            CacheItemSet cacheItem;

            string[] keys = (redisKey ?? "").Split('_');
            if (keys.Length == 2 && !string.IsNullOrEmpty(keys[0]))
            {
                CacheContainer container = null;
                string         typeName  = RedisConnectionPool.DecodeTypeName(keys[0]);
                var            schema    = EntitySchemaSet.Get(typeName);
                periodTime = periodTime > 0 ? periodTime : schema.PeriodTime;
                if (_writePools != null && !_writePools.TryGetValue(typeName, out container))
                {
                    _writePools.InitContainer(typeName);
                    _writePools.TryGetValue(typeName, out container);
                }
                if (container == null)
                {
                    return(false);
                }

                string[] childKeys   = keys[1].Split('|');
                string   personalKey = childKeys[0];
                string   entityKey   = childKeys.Length > 1 ? childKeys[1] : "";
                if (schema.CacheType == CacheType.Dictionary)
                {
                    var lazy = new Lazy <CacheItemSet>(() =>
                    {
                        bool isReadonly = schema.AccessLevel == AccessLevel.ReadOnly;
                        BaseCollection itemCollection = isReadonly
                            ? (BaseCollection) new ReadonlyCacheCollection()
                            : new CacheCollection(schema.IsMutilKey ? 0 : 1);
                        var itemSet = new CacheItemSet(schema.CacheType, periodTime, isReadonly);
                        if (!isReadonly && _writePools.Setting != null)
                        {
                            itemSet.OnChangedNotify += _writePools.Setting.OnChangedNotify;
                        }
                        itemSet.HasCollection = true;
                        itemSet.SetItem(itemCollection);
                        return(itemSet);
                    });
                    cacheItem = container.Collection.GetOrAdd(personalKey, key => lazy.Value);
                    itemPair  = new KeyValuePair <string, CacheItemSet>(entityKey, cacheItem);
                    return(true);
                }
                if (schema.CacheType == CacheType.Entity)
                {
                    var lazy = new Lazy <CacheItemSet>(() =>
                    {
                        bool isReadonly = schema.AccessLevel == AccessLevel.ReadOnly;
                        var itemSet     = new CacheItemSet(schema.CacheType, periodTime, isReadonly);
                        if (!isReadonly && _writePools.Setting != null)
                        {
                            itemSet.OnChangedNotify += _writePools.Setting.OnChangedNotify;
                        }
                        return(itemSet);
                    });
                    cacheItem = container.Collection.GetOrAdd(entityKey, key => lazy.Value);

                    itemPair = new KeyValuePair <string, CacheItemSet>(entityKey, cacheItem);
                    return(true);
                }
                if (schema.CacheType == CacheType.Queue)
                {
                    TraceLog.WriteError("Not support CacheType.Queue get cache, key:{0}.", redisKey);
                }

                ////存在分类id与实体主键相同情况, 要优先判断实体主键
                //if (!string.IsNullOrEmpty(personalKey) && container.Collection.TryGetValue(entityKey, out cacheItem))
                //{
                //    itemPair = new KeyValuePair<string, CacheItemSet>(entityKey, cacheItem);
                //    return true;
                //}
                //if (!string.IsNullOrEmpty(personalKey) && container.Collection.TryGetValue(personalKey, out cacheItem))
                //{
                //    itemPair = new KeyValuePair<string, CacheItemSet>(entityKey, cacheItem);
                //    return true;
                //}
            }
            return(false);
        }