using Microsoft.Extensions.DependencyModel; namespace Common.CacheManager { public interface ICacheService : IDisposable { #region 基本操作 /// <summary> /// 获取缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> string Get( string key); /// <summary> /// 删除缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> bool Remove( string key); /// <summary> /// 批量删除缓存 /// </summary> /// <param name="key">缓存Key集合</param> /// <returns></returns> void RemoveAll(IEnumerable< string > keys); /// <summary> /// 验证缓存项是否存在 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> bool Exists( string key); /// <summary> /// 设置过期时间 /// </summary> /// <param name="key">缓存Key</param> /// <param name="expireSeconds">过期时间,单位:秒</param> /// <returns></returns> bool Expire( string key, int expireSeconds = -1); #endregion #region String类型缓存 /// <summary> /// 添加String缓存 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> bool Add( string key, string value, int expireSeconds = -1); /// <summary> /// 添加String缓存,前提是这个key不存在,否则不执行。 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <returns></returns> bool AddNx( string key, string value); /// <summary> /// 添加String缓存,前提是这个key不存在,否则不执行。 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> bool AddNxExpire( string key, string value, int expireSeconds = -1); /// <summary> /// 添加String缓存(对象自动转换Json格式存入) /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存对象</param> /// <param name="expiresIn">缓存时长</param> /// <returns></returns> bool AddObject( string key, object value, int expireSeconds = -1); /// <summary> /// 获取缓存(Redis存储Json格式) /// </summary> /// <param name="key">缓存Key</param> /// <returns>对象</returns> T GetObject<T>( string key) where T : class ; #endregion #region Hash类型缓存 /// <summary> /// 添加Hash缓存 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expiresIn">缓存时长</param> /// <returns></returns> void AddHash( string key, Dictionary< string , string > value); /// <summary> /// 添加Hash缓存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">缓存Key</param> /// <param name="t">缓存对象</param> void AddHash<T>( string key, T t); /// <summary> /// 获取Hash缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns>对象</returns> T GetHash<T>( string key) where T : class ; #endregion #region List类型缓存 /// <summary> /// List写入head /// </summary> /// <param name="key">缓存Key</param> /// <param name="val">缓存Value</param> void LPush( string key, string val); /// <summary> /// List写入尾部 /// </summary> /// <param name="key">缓存Key</param> /// <param name="val">缓存Value</param> void RPush( string key, string val); /// <summary> /// List出队 lpop /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> object ListDequeue( string key); /// <summary> /// List出队 lpop /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> T ListDequeue<T>( string key) where T : class ; /// <summary> /// 移除list中的数据,keepIndex为保留的位置到最后一个元素如list 元素为1.2.3.....100 /// 需要移除前3个数,keepindex应该为4 /// </summary> /// <param name="key">缓存Key</param> /// <param name="keepIndex"></param> void ListRemove( string key, int keepIndex); #endregion #region lua脚本 /// <summary> /// 执行lua脚本 /// </summary> /// <param name="script">脚本</param> /// <param name="key">KEYS[1]</param> /// <param name="args">ARGV[1]</param> /// <returns></returns> object Eval( string script, string key, params object [] args); #endregion } } using CSRedis; using Microsoft.Extensions.Configuration; using Newtonsoft.Json; using System.Reflection; namespace Common.CacheManager { public class RedisCacheService : ICacheService { public RedisCacheService() { IConfigurationRoot configuration = new ConfigurationBuilder().AddJsonFile( "appsettings.json" ).Build(); var csredis = new CSRedisClient(configuration.GetValue< string >( "Redis:ConnStr" )); RedisHelper.Initialization(csredis); } #region 基本操作 /// <summary> /// 获取缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> public string Get( string key) { return RedisHelper.Get(key); } /// <summary> /// 删除缓存 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> public bool Remove( string key) { RedisHelper.Del(key); return true ; } /// <summary> /// 批量删除缓存 /// </summary> /// <param name="key">缓存Key集合</param> /// <returns></returns> public void RemoveAll(IEnumerable< string > keys) { RedisHelper.Del(keys.ToArray()); } /// <summary> /// 验证缓存项是否存在 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> public bool Exists( string key) { if (key == null ) { throw new ArgumentNullException(nameof(key)); } return RedisHelper.Exists(key); } /// <summary> /// 设置过期时间 /// </summary> /// <param name="key">缓存Key</param> /// <param name="expireSeconds">过期时间,单位:秒</param> /// <returns></returns> public bool Expire( string key, int expireSeconds = -1) { return RedisHelper.Expire(key, expireSeconds); } #endregion #region String类型缓存 /// <summary> /// 添加String缓存 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> public bool Add( string key, string value, int expireSeconds = -1) { return RedisHelper.Set(key, value, expireSeconds); } /// <summary> /// 添加String缓存(对象自动转换Json格式存入) /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存对象</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> public bool AddObject( string key, object value, int expireSeconds = -1) { return RedisHelper.Set(key, value, expireSeconds); } /// <summary> /// 添加String缓存,前提是这个key不存在,否则不执行。 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <returns></returns> public bool AddNx( string key, string value) { return RedisHelper.SetNx(key, value); } /// <summary> /// 添加String缓存,前提是这个key不存在,否则不执行。 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">缓存Value</param> /// <param name="expireSeconds">缓存时长</param> /// <returns></returns> public bool AddNxExpire( string key, string value, int expireSeconds = -1) { return RedisHelper.Set(key, value, expireSeconds, RedisExistence.Nx); } /// <summary> /// 获取缓存(Redis存储Json格式) /// </summary> /// <param name="key">缓存Key</param> /// <returns>对象</returns> public T GetObject<T>( string key) where T : class { return RedisHelper.Get<T>(key); } #endregion #region Hash类型缓存 /// <summary> /// 添加Hash缓存 /// </summary> /// <param name="key">缓存Key</param> /// <param name="value">字典类型</param> /// <returns></returns> public void AddHash( string key, Dictionary< string , string > value) { foreach (var item in value) { RedisHelper.HSet(key, item.Key, item.Value); } } /// <summary> /// 添加Hash缓存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">缓存Key</param> /// <param name="t">对象</param> public void AddHash<T>( string key, T t) { Dictionary< string , string > map = new Dictionary< string , string >(); //将对象转为Dictionary Type types = t.GetType(); PropertyInfo[] PropertyList = types.GetProperties(); foreach (var item in PropertyList) { string name = item.Name; object value = item.GetValue(t, null ); if (value != null ) { map.Add(name, value.ToString()); } else { map.Add(name, "" ); } } //写入Redis AddHash(key, map); } /// <summary> /// 获取Hash缓存 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">缓存Key</param> /// <returns>对象</returns> public T GetHash<T>( string key) where T : class { //获取所有键值 RedisScan<( string field, string value)> m_pair = RedisHelper.HScan(key, 0); ( string field, string value)[] items = m_pair.Items; //构造新实例 T t = Activator.CreateInstance<T>(); try { //获得新实例类型 var Types = t.GetType(); //获得遍历类型的属性字段 foreach (PropertyInfo sp in Types.GetProperties()) { //遍历Hash值 for ( int i = 0; i < items.Length; ++i) { //判断属性名是否相同 if (items[i].field == sp.Name) { string propertyType = sp.PropertyType.ToString(); //获得s对象属性的值复制给d对象的属性 if (propertyType.Equals( "System.Guid" )) sp.SetValue(t, Guid.Parse(items[i].value), null ); else sp.SetValue(t, items[i].value, null ); } } } } catch (Exception ex) { throw ex; } return t; } #endregion #region List类型缓存 /// <summary> /// List头部插入一个元素 /// </summary> /// <param name="key">缓存Key</param> /// <param name="val">缓存Value</param> public void LPush( string key, string val) { RedisHelper.LPush(key, val); } /// <summary> /// List尾部插入一个元素 /// </summary> /// <param name="key">缓存Key</param> /// <param name="val">缓存Value</param> public void RPush( string key, string val) { RedisHelper.RPush(key, val); } /// <summary> /// 从List尾部删除一个元素 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="key">缓存Key</param> /// <returns></returns> public T ListDequeue<T>( string key) where T : class { string value = RedisHelper.RPop(key); if ( string .IsNullOrEmpty(value)) return null ; return JsonConvert.DeserializeObject<T>(value); } /// <summary> /// 从List尾部删除一个元素 /// </summary> /// <param name="key">缓存Key</param> /// <returns></returns> public object ListDequeue( string key) { string value = RedisHelper.RPop(key); if ( string .IsNullOrEmpty(value)) return null ; return value; } /// <summary> /// 移除list中的数据,keepIndex为保留的位置到最后一个元素如list 元素为1.2.3.....100 /// 需要移除前3个数,keepindex应该为4 /// </summary> /// <param name="key"></param> /// <param name="keepIndex"></param> public void ListRemove( string key, int keepIndex) { RedisHelper.LTrim(key, keepIndex, -1); } #endregion #region lua脚本 public object Eval( string script, string key, params object [] args) { return RedisHelper.Eval(script, key, args); } #endregion public void Dispose() { } } /// <summary> /// 逻辑过期时间封装 /// </summary> public class RedisDataExtens { /// <summary> /// 缓存击穿逻辑过期穿解决方案中的逻辑过期时间 /// </summary> public DateTime ExpireTime { get ; set ; } public object Data { get ; set ; } } } |