.net core 实例教程(九)缓存配置、Redis配置及类库
小白浏览:7132024-03-19 15:57:46本文累计收益:0我也要赚钱

本文源码下载地址:http://www.80cxy.com/Blog/ResourceView?arId=202403191532545995NAAqJh

系列教程地址:http://www.80cxy.com/Blog/ArticleView?arId=202403191517574161ay3s5V

本文讲解Redis缓存配置,及相关缓存操作类库,具体使用在后面的教程中随着模块的开发逐步进行讲解。

首先在SignUp.Common安装CSRedisCore包。

Install-Package CSRedisCore

新建RedisCacheService缓存操作类库,代码如下:
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; }
    }
}
为项目注入类库
            #region Redis配置
            services.AddSingleton<ICacheService, RedisCacheService>();
            #endregion

截止目前SignUp.Common目录截图如下:

学习交流

附笔者学习 .net core开发时参考相关项目实例源码:asp.net core webapi项目实例源代码锦集下载(72个)

评论列表
发表评论
+ 关注