/// <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> /// <param name="tags">Тэги, которые будут удалены.</param> /// <returns>Признак успешности выполнения.</returns> public bool RemoveData(IEnumerable <string> tags = null) { var isOk = Cache == null; if (!isOk) { var tagsToRemove = tags != null && tags.Any() ? new HashSet <string>(tags) : null; IEnumerable <string> dataKeys = null; lock (DataKeysByTag) { dataKeys = DataKeysByTag .Where(x => tagsToRemove == null || tagsToRemove.Contains(x.Key)) .SelectMany(x => x.Value) .Distinct() .ToArray(); if (tagsToRemove != null) { foreach (var tag in tagsToRemove) { DataKeysByTag.Remove(tag); } } else { DataKeysByTag.Clear(); } foreach (var dataKey in dataKeys) { Cache.Remove(dataKey); } } isOk = true; } return(isOk); }