Beispiel #1
0
        /// <summary>
        /// Поместить данные в хранилище.
        /// </summary>
        /// <typeparam name="T">Тип данных.</typeparam>
        /// <param name="key">Ключ.</param>
        /// <param name="data">Данные.</param>
        /// <returns>Признак успешности выполнения.</returns>
        public bool PutData <T>(CoreCachingKey key, T data)
        {
            var dataKey = Helper.ConvertToDataKey(key.Name);

            var isOk = PutDataToDatabase(dataKey, data);

            if (isOk)
            {
                var expiry = key.GetCacheExpiryTimeSpan(Helper.ExpiryInSeconds);

                if (expiry.HasValue)
                {
                    var db = Helper.GetDatabase();

                    isOk = db.KeyExpire(dataKey, expiry);
                }

                if (isOk)
                {
                    var tagKeys = Helper.ConvertToTagKeys(key.Tags);

                    BindDataKeyToTagKeys(tagKeys, dataKey);
                }
            }

            return(isOk);
        }
Beispiel #2
0
        /// <summary>
        /// Получить данные из хранилища.
        /// </summary>
        /// <typeparam name="T">Тип данных.</typeparam>
        /// <param name="key">Ключ.</param>
        /// <returns>Данные.</returns>
        public T GetData <T>(CoreCachingKey key)
        {
            var dataKey = Helper.ConvertToDataKey(key.Name);

            var data = default(T);

            if (Cache != null)
            {
                if (typeof(T) == typeof(string) || typeof(T) == typeof(byte[]))
                {
                    data = (T)(dynamic)Cache.Get(dataKey);
                }
                else
                {
                    var value = (byte[])Cache.Get(dataKey);

                    if (value != null)
                    {
                        data = value.CoreBaseExtProtoBufDeserialize <T>();
                    }
                }
            }

            return(data);
        }
Beispiel #3
0
        /// <summary>
        /// Асинхронно поместить данные в хранилище.
        /// </summary>
        /// <typeparam name="T">Тип данных.</typeparam>
        /// <param name="key">Ключ.</param>
        /// <param name="data">Данные.</param>
        /// <returns>Задача с признаком успешности выполнения.</returns>
        public async Task <bool> PutDataAsync <T>(CoreCachingKey key, T data)
        {
            var dataKey = Helper.ConvertToDataKey(key.Name);

            var isOk = await PutDataToDatabaseAsync(dataKey, data).CoreBaseExtTaskWithCurrentCulture(false);

            if (isOk)
            {
                var expiry = key.GetCacheExpiryTimeSpan(Helper.ExpiryInSeconds);

                if (expiry.HasValue)
                {
                    var db = Helper.GetDatabase();

                    isOk = await db.KeyExpireAsync(dataKey, expiry).CoreBaseExtTaskWithCurrentCulture(false);
                }

                if (isOk)
                {
                    var tagKeys = Helper.ConvertToTagKeys(key.Tags);

                    await BindDataKeyToTagKeysAsync(tagKeys, dataKey).CoreBaseExtTaskWithCurrentCulture(false);
                }
            }

            return(isOk);
        }
        /// <summary>
        /// Ядро. Кэширование. Расширение. Вызвать. Чтение.
        /// При этом происходит занесение в кэш результатов чтения.
        /// </summary>
        /// <typeparam name="T">Тип данных, возвращаемых функцией чтения.</typeparam>
        /// <param name="func">Функция чтения.</param>
        /// <param name="cache">Кэш.</param>
        /// <param name="cacheKey">Ключ кэша.</param>
        /// <returns>Задача, возвращаемая функцией чтения.</returns>
        public static async Task <T> CoreCachingExtInvokeRead <T>(
            this Func <Task <T> > func,
            ICoreCachingCache cache,
            CoreCachingKey cacheKey
            )
            where T : class
        {
            T result = null;

            var isCachingEnabled = cache != null && cache.IsEnabled && cacheKey != null;

            if (isCachingEnabled)
            {
                result = await cache.GetAsync <T>(cacheKey).CoreBaseExtTaskWithCurrentCulture(false);
            }

            if (result == null)
            {
                result = await func.Invoke().CoreBaseExtTaskWithCurrentCulture(false);

                if (isCachingEnabled)
                {
                    if (!await cache.SetAsync(cacheKey, result).CoreBaseExtTaskWithCurrentCulture(false))
                    {
                        result = null;
                    }
                }
            }

            return(result);
        }
Beispiel #5
0
        /// <summary>
        /// Создать ключ кэша.
        /// </summary>
        /// <param name="nameParts">Части имени.</param>
        /// <param name="tags">Тэги.</param>
        /// <param name="cacheExpiryInSeconds">Окончание срока действия кэша в секундах.</param>
        /// <returns>Ключ кэша.</returns>
        private CoreCachingKey CreateCacheKey(
            IEnumerable <object> nameParts,
            IEnumerable <string> tags,
            int cacheExpiryInSeconds
            )
        {
            if (nameParts == null || !nameParts.Any())
            {
                throw new ArgumentException("Enumeration is null or empty", "keyParts");
            }

            if (tags == null || !tags.Any())
            {
                throw new ArgumentException("Enumeration is null or empty", "tags");
            }

            if (cacheExpiryInSeconds < 0)
            {
                throw new ArgumentException(string.Format("{0} is less than zero", cacheExpiryInSeconds), "cacheExpiryInSeconds");
            }

            var result = new CoreCachingKey(
                string.Concat("{", string.Join(",", nameParts.Select(x => ConvertToString(x))), "}")
                );

            result.Tags = tags;
            result.CacheExpiryInSeconds = cacheExpiryInSeconds;

            return(result);
        }
Beispiel #6
0
        /// <summary>
        /// Поместить данные в хранилище.
        /// </summary>
        /// <typeparam name="T">Тип данных.</typeparam>
        /// <param name="key">Ключ.</param>
        /// <param name="data">Данные.</param>
        /// <returns>Признак успешности выполнения.</returns>
        public object PutData <T>(CoreCachingKey key, T data)
        {
            object value = null;

            var isOk = Cache == null;

            if (isOk)
            {
                value = data;
            }
            else
            {
                var dataKey = Helper.ConvertToDataKey(key.Name);

                var expiry = key.GetCacheExpiryTimeSpan(Helper.ExpiryInSeconds);

                var absoluteExpiration = expiry.HasValue ? DateTime.Now.Add(expiry.Value) : (DateTime?)null;

                var options = new MemoryCacheEntryOptions();

                if (absoluteExpiration.HasValue)
                {
                    options.AbsoluteExpiration = absoluteExpiration.Value;
                }

                if (typeof(T) == typeof(byte[]) || typeof(T) == typeof(string))
                {
                    value = data;
                }
                else
                {
                    value = data.CoreBaseExtProtoBufSerialize();
                }

                lock (DataKeysByTag)
                {
                    foreach (var tag in key.Tags)
                    {
                        HashSet <string> dataKeys;

                        if (!DataKeysByTag.TryGetValue(tag, out dataKeys))
                        {
                            dataKeys = new HashSet <string>();

                            DataKeysByTag[tag] = dataKeys;
                        }

                        dataKeys.Add(dataKey);
                    }

                    Cache.Set(dataKey, value, options);
                }

                isOk = true;
            }

            return(isOk ? value : null);
        }
Beispiel #7
0
        /// <summary>
        /// Асинхронно получить данные из хранилища.
        /// </summary>
        /// <typeparam name="T">Тип данных.</typeparam>
        /// <param name="key">Ключ.</param>
        /// <returns>Задача с полученными из хранилища данными.</returns>
        public async Task <T> GetDataAsync <T>(CoreCachingKey key)
        {
            var dataKey = Helper.ConvertToDataKey(key.Name);

            T data = default;

            var db = Helper.GetDatabase();

            if (typeof(T) == typeof(string) || typeof(T) == typeof(byte[]))
            {
                data = (T)(dynamic)await db.StringGetAsync(dataKey).CoreBaseExtTaskWithCurrentCulture(false);
            }
            else
            {
                byte[] value = await db.StringGetAsync(dataKey).CoreBaseExtTaskWithCurrentCulture(false);

                if (value != null)
                {
                    data = value.CoreBaseExtProtoBufDeserialize <T>();
                }
            }

            return(data);
        }