示例#1
0
        /// <summary>
        /// Get cache datas by type
        /// </summary>
        /// <typeparam name="T">Data type</typeparam>
        /// <param name="size">Return data size</param>
        /// <returns></returns>
        protected virtual List <T> GetCacheDatasByType <T>(IQuery query, int size)
        {
            var type     = typeof(T);
            var needSort = query != null && !query.Orders.IsNullOrEmpty();

            if (needSort)
            {
                return(new List <T>(0));
            }

            #region get cache keys

            var typeName        = type.Name;
            var primaryKeys     = EntityManager.GetPrimaryKeys(type);
            var firstPrimaryKey = primaryKeys?.FirstOrDefault();
            if (string.IsNullOrWhiteSpace(firstPrimaryKey))
            {
                return(new List <T>(0));
            }
            var cacheObject = new CacheObject()
            {
                ObjectName = typeName
            };
            CacheKey mateKey = new CacheKey(cacheObject);
            mateKey.AddName(firstPrimaryKey);
            var getKeysCommand = new GetKeysOptions()
            {
                CacheObject = cacheObject,
                Query       = new KeyQuery()
                {
                    MateKey  = mateKey.GetActualKey(),
                    Type     = KeyMatchPattern.StartWith,
                    Page     = 1,
                    PageSize = size > 0 ? size : int.MaxValue
                }
            };
            var keyResponses = CacheManager.Keys.GetKeysAsync(getKeysCommand).Result?.Responses;
            if (keyResponses.IsNullOrEmpty())
            {
                return(new List <T>(0));
            }
            List <CacheKey> dataKeys = new List <CacheKey>();
            foreach (var response in keyResponses)
            {
                if (response?.Keys.IsNullOrEmpty() ?? true)
                {
                    continue;
                }
                bool fullData = false;
                foreach (var key in response.Keys)
                {
                    if (size > 0 && dataKeys.Count >= size)
                    {
                        fullData = true;
                        break;
                    }
                    dataKeys.Add(key);
                }
                if (fullData)
                {
                    break;
                }
            }
            if (dataKeys.IsNullOrEmpty())
            {
                return(new List <T>(0));
            }

            #endregion

            #region get cache data

            return(CacheManager.GetDataList <T>(dataKeys, cacheObject));

            #endregion
        }
示例#2
0
        /// <summary>
        /// Remove cache data by type
        /// </summary>
        /// <param name="type">Data type</param>
        protected virtual void RemoveCacheDataByType(Type type)
        {
            if (type == null)
            {
                return;
            }
            var cacheObject = new CacheObject()
            {
                ObjectName = type.Name
            };
            CacheKey mateKey = new CacheKey(cacheObject);

            do
            {
                var getKeysCommand = new GetKeysOptions()
                {
                    CacheObject = cacheObject,
                    Query       = new KeyQuery()
                    {
                        MateKey  = mateKey.GetActualKey(),
                        Type     = KeyMatchPattern.StartWith,
                        Page     = 1,
                        PageSize = 10000
                    }
                };
                var keyResponses = CacheManager.Keys.GetKeysAsync(getKeysCommand).Result?.Responses;
                if (keyResponses.IsNullOrEmpty())
                {
                    break;
                }
                List <CacheKey> cacheKeys = new List <CacheKey>();
                foreach (var response in keyResponses)
                {
                    if (response?.Keys.IsNullOrEmpty() ?? true)
                    {
                        continue;
                    }
                    foreach (var key in response.Keys)
                    {
                        cacheKeys.Add(key);
                    }
                }
                if (cacheKeys.IsNullOrEmpty())
                {
                    break;
                }
                var keyDeleteCommand = new DeleteOptions()
                {
                    CacheObject = cacheObject,
                    Keys        = cacheKeys
                };
                var result = CacheManager.Keys.Delete(keyDeleteCommand);
                if (result != null && !result.Responses.IsNullOrEmpty())
                {
                    foreach (var response in result.Responses)
                    {
                        if (!string.IsNullOrWhiteSpace(response?.Message))
                        {
                            LogManager.LogInformation <DefaultDataCachePolicy>(response.Message);
                        }
                    }
                }
            } while (true);
        }