/// <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); }
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); }
/// <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); }
/// <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); }
/// <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); }