using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Caching.Redis; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; namespace TEAMModelOS.SDK.Module.Cache { public class CSRedisCacheService :ICacheService//,IDisposable { protected IDistributedCache _cache; public CSRedisCacheService(IDistributedCache cache ) { _cache = cache; } /// /// 验证缓存项是否存在 /// /// 缓存Key /// public bool Exists(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } return RedisHelper.Instance.Exists(key); // return _cache.KeyExists(GetKeyForRedis(key)); }/// /// 添加缓存 /// /// 缓存Key /// 缓存Value /// public bool Add(string key, object value) { if (key == null) { throw new ArgumentNullException(nameof(key)); } _cache.Set(key, Encoding.UTF8.GetBytes(JsonSerializer.Serialize(value))); return Exists(key); } /// /// 添加缓存 /// /// 缓存Key /// 缓存Value /// 滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间,Redis中无效) /// 绝对过期时长 /// public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte) { if (key == null) { throw new ArgumentNullException(nameof(key)); } _cache.Set(key, Encoding.UTF8.GetBytes(JsonSerializer.Serialize(value)), new DistributedCacheEntryOptions() { AbsoluteExpirationRelativeToNow=expiressAbsoulte,SlidingExpiration=expiresSliding}); return Exists(key); } /// /// 添加缓存 /// /// 缓存Key /// 缓存Value /// 缓存时长 /// 是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间,Redis中无效) /// public bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false) { if (key == null) { throw new ArgumentNullException(nameof(key)); } _cache.Set(key, Encoding.UTF8.GetBytes(JsonSerializer.Serialize(value)), new DistributedCacheEntryOptions() { SlidingExpiration = expiresIn }); return Exists(key); // return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), expiresIn); }/// /// 删除缓存 /// /// 缓存Key /// public bool Remove(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } _cache.Remove(key); return !Exists(key); } /// /// 批量删除缓存 /// /// 缓存Key集合 /// public void RemoveAll(IEnumerable keys) { if (keys == null) { throw new ArgumentNullException(nameof(keys)); } keys.ToList().ForEach(item => Remove(item)); } /// /// 获取缓存 /// /// 缓存Key /// public T Get(string key) where T : class { if (key == null) { throw new ArgumentNullException(nameof(key)); } var value = _cache.GetString(key); if ( string.IsNullOrEmpty(value)) { return default(T); } return JsonSerializer.Deserialize(value); } /// /// 获取缓存 /// /// 缓存Key /// public object Get(string key) { if (key == null) { throw new ArgumentNullException(nameof(key)); } var value = _cache.GetString(key); if (string.IsNullOrEmpty(value)) { return null; } return JsonSerializer.Deserialize(value); } /// /// 获取缓存集合 /// /// 缓存Key集合 /// public IDictionary GetAll(IEnumerable keys) { if (keys == null) { throw new ArgumentNullException(nameof(keys)); } var dict = new Dictionary(); keys.ToList().ForEach(item => dict.Add(item, Get(item))); return dict; } /// /// 修改缓存 /// /// 缓存Key /// 新的缓存Value /// public bool Replace(string key, object value) { if (key == null) { throw new ArgumentNullException(nameof(key)); } if (Exists(key)) if (!Remove(key)) return false; return Add(key, value); } /// /// 修改缓存 /// /// 缓存Key /// 新的缓存Value /// 滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间) /// 绝对过期时长 /// public bool Replace(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte) { if (key == null) { throw new ArgumentNullException(nameof(key)); } if (Exists(key)) if (!Remove(key)) return false; return Add(key, value, expiresSliding, expiressAbsoulte); } /// /// 修改缓存 /// /// 缓存Key /// 新的缓存Value /// 缓存时长 /// 是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间) /// public bool Replace(string key, object value, TimeSpan expiresIn, bool isSliding = false) { if (key == null) { throw new ArgumentNullException(nameof(key)); } if (Exists(key)) if (!Remove(key)) return false; return Add(key, value, expiresIn, isSliding); } //public void Dispose() //{ // if (_connection != null) // _connection.Dispose(); // GC.SuppressFinalize(this); //} public async Task ExistsAsync(string key) { return await Task.Run(() => Exists(key)); } public async Task AddAsync(string key, object value) { return await Task.Run(() => Add(key, value)); } public async Task AddAsync(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte) { return await Task.Run(() => Add(key, value, expiresSliding, expiressAbsoulte)); } public async Task AddAsync(string key, object value, TimeSpan expiresIn, bool isSliding = false) { return await Task.Run(() => Add(key, value, expiresIn, isSliding)); } public async Task RemoveAsync(string key) { return await Task.Run(() => Remove(key)); } public async Task RemoveAllAsync(IEnumerable keys) { await Task.Run(() => RemoveAll(keys)); } public async Task GetAsync(string key) where T : class { return await Task.Run(() => Get(key)); } public async Task GetAsync(string key) { return await Task.Run(() => Get(key)); } public async Task> GetAllAsync(IEnumerable keys) { return await Task.Run(() => GetAll(keys)); } public async Task ReplaceAsync(string key, object value) { return await Task.Run(() => Replace(key, value)); } public async Task ReplaceAsync(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte) { return await Task.Run(() => Replace(key, value, expiresSliding, expiressAbsoulte)); } public async Task ReplaceAsync(string key, object value, TimeSpan expiresIn, bool isSliding = false) { return await Task.Run(() => Replace(key, value, expiresIn, isSliding)); } } }