using FluentEmail.Core;
namespace Admin.NET.Core;
public class RedisCache : FullRedis
{
///
/// Redis前缀
///
public string RedisPrefix { get; set; }
/// 实例化增强版Redis
public RedisCache() : base() { }
/// 实例化增强版Redis
///
///
///
public RedisCache(String server, String password, Int32 db) : base(server, password, db) { }
/// 实例化增强版Redis
///
public RedisCache(RedisOptions options) :base(options) {
RedisPrefix = options.Prefix;
}
/// 按照配置服务实例化Redis,用于NETCore依赖注入
/// 服务提供者,将要解析IConfigProvider
/// 缓存名称,也是配置中心key
public RedisCache(IServiceProvider provider, String name) : base(provider, name) { }
#region 基础操作
/// 缓存个数
public override Int32 Count => base.Count;
/// 获取所有键,限制10000项,超额请使用FullRedis.Search
public override ICollection Keys
{
get
{
if (string.IsNullOrWhiteSpace(RedisPrefix))
{
return base.Keys;
}
else {
return Execute(rds => rds.Execute("KEYS", RedisPrefix + "*"));
}
}
}
/// 获取信息
/// 是否获取全部信息,包括Commandstats
///
public override IDictionary GetInfo(Boolean all = false) => base.GetInfo(all);
/// 单个实体项
/// 键
/// 值
/// 过期时间,秒。小于0时采用默认缓存时间
public override Boolean Set(String key, T value, Int32 expire = -1) => base.Set(RedisPrefix+key,value,expire);
/// 获取单体
/// 键
public override T Get(String key) => base.Get(RedisPrefix + key);
/// 批量移除缓存项
/// 键集合
public override Int32 Remove(params String[] keys)
{
keys = keys.Select(key => RedisPrefix + key).ToArray();
return base.Remove(keys);
}
/// 清空所有缓存项
public override void Clear() => base.Clear();
/// 是否存在
/// 键
public override Boolean ContainsKey(String key) => base.ContainsKey(RedisPrefix + key);
/// 设置缓存项有效期
/// 键
/// 过期时间
public override Boolean SetExpire(String key, TimeSpan expire) => base.SetExpire(RedisPrefix + key, expire);
/// 获取缓存项有效期
/// 键
///
public override TimeSpan GetExpire(String key) => base.GetExpire(RedisPrefix + key);
#endregion
#region 集合操作
/// 批量获取缓存项
///
///
///
public override IDictionary GetAll(IEnumerable keys) {
keys = keys.Select(key => RedisPrefix + key).ToArray();
return base.GetAll(keys);
}
/// 批量设置缓存项
///
///
/// 过期时间,秒。小于0时采用默认缓存时间
public override void SetAll(IDictionary values, Int32 expire = -1)
{
IDictionary keyValues = new Dictionary();
values.ForEach(item =>
{
keyValues.Add(RedisPrefix + item.Key,item.Value);
});
base.SetAll(keyValues, expire);
}
/// 获取哈希
/// 元素类型
/// 键
///
public override IDictionary GetDictionary(String key) => base.GetDictionary(RedisPrefix + key);
/// 获取队列
/// 元素类型
/// 键
///
public override IProducerConsumer GetQueue(String key) => base.GetQueue(RedisPrefix + key);
/// 获取栈
/// 元素类型
/// 键
///
public override IProducerConsumer GetStack(String key) => base.GetStack(RedisPrefix + key);
/// 获取Set
///
///
///
public override ICollection GetSet(String key) => base.GetSet(RedisPrefix + key);
#endregion
#region 高级操作
/// 添加,已存在时不更新
/// 值类型
/// 键
/// 值
/// 过期时间,秒。小于0时采用默认缓存时间
///
public override Boolean Add(String key, T value, Int32 expire = -1) => base.Add(RedisPrefix + key,value,expire);
/// 设置新值并获取旧值,原子操作
/// 值类型
/// 键
/// 值
///
public override T Replace(String key, T value) => base.Replace(RedisPrefix + key, value);
/// 尝试获取指定键,返回是否包含值。有可能缓存项刚好是默认值,或者只是反序列化失败
///
/// 在 Redis 中,可能有key(此时TryGet返回true),但是因为反序列化失败,从而得不到value。
///
/// 值类型
/// 键
/// 值。即使有值也不一定能够返回,可能缓存项刚好是默认值,或者只是反序列化失败
/// 返回是否包含值,即使反序列化失败
public override Boolean TryGetValue(String key, out T value) => base.TryGetValue(RedisPrefix + key,out value);
/// 累加,原子操作
/// 键
/// 变化量
///
public override Int64 Increment(String key, Int64 value) => base.Increment(RedisPrefix + key, value);
/// 累加,原子操作,乘以100后按整数操作
/// 键
/// 变化量
///
public override Double Increment(String key, Double value) => base.Increment(RedisPrefix + key, value);
/// 递减,原子操作
/// 键
/// 变化量
///
public override Int64 Decrement(String key, Int64 value) => base.Decrement(RedisPrefix + key, value);
/// 递减,原子操作,乘以100后按整数操作
/// 键
/// 变化量
///
public override Double Decrement(String key, Double value) => base.Decrement(RedisPrefix + key, value);
#endregion
}