欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

net core WebApi——缓存神器Redis

程序员文章站 2022-05-28 21:16:06
@[toc] 前言 中秋过完不知不觉都已经快两周没动这个工程了,最近业务需要总算开始搞后台云服务了,果断直接net core搞起,在做的中间遇到了不少问题,这个后续会一点点列出来包括解决方法,今天就先把之前挖的坑填一个。 Redis 之前在缓存那篇提到过, Cookie , Session , Ca ......

目录

@

前言

中秋过完不知不觉都已经快两周没动这个工程了,最近业务需要总算开始搞后台云服务了,果断直接net core搞起,在做的中间遇到了不少问题,这个后续会一点点列出来包括解决方法,今天就先把之前挖的坑填一个。

redis

之前在缓存那篇提到过,cookiesessioncache这几个不同的缓存方式,cookie是存在客户端浏览器的,session实质上也是客户端的存储,至于cache是服务端的,但是如果是分布式的话,这几个方式可能除了cookie其他两个都要有点儿问题,毕竟一台服务只存储自身一台,如果多台的话,需要涉及到多服务的交互,比如一台服务做了cache存储,需要给其他服务发送内部信号或是http请求,其他服务根据请求执行对应操作。

当然这是在没有用到redis的前提下,redis是解决分布式缓存的神器,相当于是自身一台服务器专门处理数据的读写,可以理解为数据服务器(个人感觉。。。),至于自己业务的分布式只是为了业务需要去执行,需要用到数据缓存即可直接调用redis的读写操作(当然,各个服务的redis配置要保持一致)。

redis的安装和配置在linux配置部署_新手向(四)——redis安装与配置已经说过,当时就是为了使用redis而做了个小铺垫。

使用

首先,只要是类库肯定是引入nuget包了,我们在april.util引入microsoft.extensions.caching.redis,当然其他也有stackexchange.rediscsrediscore,这里先试试官方的吧,官方扩展包地址

引入完之后,我们在appsettings.json来配置下地址目录。
net core WebApi——缓存神器Redis
之后我们看下redis的方法,毕竟调用第三方都是看看然后根据自己需要裹一下。
net core WebApi——缓存神器Redis

也是先要初始化配置信息,然后创建实体对象,调用方法,这里说明下,默认的value值是byte[],当然官方也有扩展方法。
net core WebApi——缓存神器Redis
好了,看完了方法,我们来开始util吧。

redisutil

首先,我们还是要先做配置信息,前面已经在appsettings写过配置信息,这里直接在aprilconfig中添加上。

private static string _isopencache = string.empty;
        /// <summary>
        /// 是否使用redis
        /// </summary>
        public static bool isopencache
        {
            get
            {
                if (string.isnullorempty(_isopencache))
                {
                    _isopencache = configuration["redis:isopenredis"];
                }
                if (_isopencache.tolower() == "true")
                {
                    return true;
                }
                return false;
            }
        }

        private static string _redisconnectionstring = string.empty;
        /// <summary>
        /// redis默认连接串
        /// </summary>
        public static string redisconnectionstring
        {
            get
            {
                if (string.isnullorempty(_redisconnectionstring))
                {
                    _redisconnectionstring = configuration["redis:connectionstring"];
                }
                return _redisconnectionstring;
            }
        }

配置信息设置完成之后,开始初始化redis的方法。

        private static rediscache _rediscache = null;
        private static rediscacheoptions options = null;
        /// <summary>
        /// 初始化redis
        /// </summary>
        public static void initredis()
        {
            if (aprilconfig.isopencache)
            {
                _rediscache = new rediscache(getoptions());
            }
        }
        /// <summary>
        /// 获取配置项信息
        /// </summary>
        /// <returns></returns>
        protected static rediscacheoptions getoptions()
        {
            options = new rediscacheoptions();
            options.configuration = aprilconfig.redisconnectionstring;
            options.instancename = "april.redis";
            return options;
        }
        /// <summary>
        /// 添加数据
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        /// <param name="expriretime">过期时间</param>
        public static void add(string key, object value, int expriretime = 10)
        {
            if (string.isnullorempty(key))
            {
                return;
            }
            string strvalue = string.empty;
            try
            {
                strvalue = jsonconvert.serializeobject(value);
            }
            catch (exception ex)
            {
                logutil.error($"redis.add转换失败:{ex.message}");
            }
            if (!string.isnullorempty(strvalue))
            {
                _rediscache.setstring(key, strvalue, new microsoft.extensions.caching.distributed.distributedcacheentryoptions()
                {
                    absoluteexpiration = datetime.now.addminutes(expriretime)
                });
            }
        }
        /// <summary>
        /// 获取数据(对象)
        /// </summary>
        /// <typeparam name="t">对象类型</typeparam>
        /// <param name="key">键</param>
        /// <returns></returns>
        public static t get<t>(string key)
        {
            string value = get(key);
            if (string.isnullorempty(value))
            {
                return default(t);
            }
            t obj = default(t);
            try
            {
                obj = jsonconvert.deserializeobject<t>(value);
            }
            catch (exception ex)
            {
                logutil.error($"redis.get转换失败:{ex.message},数据:{value}");
            }
            return obj;
        }
        /// <summary>
        /// 移除数据
        /// </summary>
        /// <param name="key">键</param>
        public static void remove(string key)
        {
            if (!string.isnullorempty(key))
            {
                _rediscache.remove(key);
            }
        }
        /// <summary>
        /// 重置数据
        /// </summary>
        /// <param name="key">键</param>
        /// <param name="value">值</param>
        /// <param name="expiretime">过期时间</param>
        public static void replace(string key, object value, int expiretime = 10)
        {
            if (!string.isnullorempty(key))
            {
                remove(key);
                add(key, value, expiretime);
            }
        }

具体使用的方法,这里不多写了,代码地址见net core webapi 总目录,感觉代码贴的多了,自己也习惯了复制粘贴,看一个封装好的方法,就要去看他的源码(如果只是用的话就算了),这样对方法的使用以及自身的业务需要封装会有很好的帮助,毕竟会用是第一步,会改是第二步,封装是第三步,自己写那就是最终级了(这句纯属自勉)。

测试

好了,写完之后,习惯来一遍测试,不想自己整理的东西最终还是不能用,千篇一律不可怕,可怕的是不知道最终的效果。
新增
net core WebApi——缓存神器Redis
net core WebApi——缓存神器Redis

获取
net core WebApi——缓存神器Redis
net core WebApi——缓存神器Redis

覆盖
ps:说是覆盖,其实就是删除然后新增-,-|||
net core WebApi——缓存神器Redis
net core WebApi——缓存神器Redis

删除
net core WebApi——缓存神器Redis
net core WebApi——缓存神器Redis

小结

写到这里基本上都结束了,简单的说明了redis的使用,后续还是会不断更新,比如那么多database,如果随意切换,redis存储之后会不会有什么其他问题等等,学以致用,用方知错,错而能改,改了就行