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