Skip to content

Modify entity then Delete or RemoveCache in 100ms,there will be some bug,cache queue will created new CacheItemSet #20

Description

@Jesse1205

Change code like this
public static dynamic GetPersonalEntity(string redisKey, out CacheItemSet itemSet) { itemSet = null; dynamic entity = null; KeyValuePair<string, CacheItemSet> itemPair; if (TryGetContainerCacheItem(redisKey, out itemPair)) { itemSet = itemPair.Value; if (itemSet != null) { switch (itemPair.Value.ItemType) { case CacheType.Entity: entity = itemPair.Value.ItemData; break; case CacheType.Dictionary: var set = itemPair.Value.ItemData as BaseCollection; if (set != null) { set.TryGetValue(itemPair.Key, out entity); } break; default: TraceLog.WriteError("Not suported CacheType:{0} for GetPersonalEntity key:{1}", itemPair.Value.ItemType, redisKey); break; } } } if (entity == null) { //while is remove entity is empty. //TraceLog.WriteComplement("GetPersonalEntity key:{0} is empty.", redisKey); } return entity; }

`public static bool TryGetContainerCacheItem(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 || schema.CacheType == CacheType.Entity)
            {
                container.Collection.TryGetValue(personalKey, out cacheItem);
                itemPair = new KeyValuePair<string, CacheItemSet>(entityKey, cacheItem);
                return true;
            }
            if (schema.CacheType == CacheType.Entity)
            {
                container.Collection.TryGetValue(entityKey, out cacheItem);
                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;
    }`

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions