using Microsoft.Extensions.Caching.Redis;
using Newtonsoft.Json;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace TEAMModelOS.SDK.Module.Cache
{
public class RedisCacheService : ICacheService,IDisposable
{
protected IDatabase _cache;
private ConnectionMultiplexer _connection;
private readonly string _instance;
public RedisCacheService(RedisCacheOptions options, int database = 0)
{
_connection = ConnectionMultiplexer.Connect(options.Configuration);
_cache = _connection.GetDatabase(database);
_instance = options.InstanceName;
}
public string GetKeyForRedis(string key)
{
return _instance + key;
}///
/// 验证缓存项是否存在
///
/// 缓存Key
///
public bool Exists(string key)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
return _cache.KeyExists(GetKeyForRedis(key));
}///
/// 添加缓存
///
/// 缓存Key
/// 缓存Value
///
public bool Add(string key, object value)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)));
}
///
/// 添加缓存
///
/// 缓存Key
/// 缓存Value
/// 滑动过期时长(如果在过期时间内有操作,则以当前时间点延长过期时间,Redis中无效)
/// 绝对过期时长
///
public bool Add(string key, object value, TimeSpan expiresSliding, TimeSpan expiressAbsoulte)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
return _cache.StringSet(GetKeyForRedis(key), Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(value)), expiressAbsoulte);
}
///
/// 添加缓存
///
/// 缓存Key
/// 缓存Value
/// 缓存时长
/// 是否滑动过期(如果在过期时间内有操作,则以当前时间点延长过期时间,Redis中无效)
///
public bool Add(string key, object value, TimeSpan expiresIn, bool isSliding = false)
{
if (key == null)
{
throw new ArgumentNullException(nameof(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));
}
return _cache.KeyDelete(GetKeyForRedis(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.StringGet(GetKeyForRedis(key));
if (!value.HasValue)
{
return default(T);
}
return JsonConvert.DeserializeObject(value);
}
///
/// 获取缓存
///
/// 缓存Key
///
public object Get(string key)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}
var value = _cache.StringGet(GetKeyForRedis(key));
if (!value.HasValue)
{
return null;
}
return JsonConvert.DeserializeObject(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(GetKeyForRedis(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