中秋过完不知不觉都已经快两周没动这个工程了,最近业务须要总算开始搞后台云服务了,果断直接net core搞起,在作的中间遇到了很多问题,这个后续会一点点列出来包括解决方法,今天就先把以前挖的坑填一个。git
以前在缓存那篇提到过,Cookie,Session,Cache这几个不一样的缓存方式,Cookie是存在客户端浏览器的,Session实质上也是客户端的存储,至于Cache是服务端的,可是若是是分布式的话,这几个方式可能除了Cookie其余两个都要有点儿问题,毕竟一台服务只存储自身一台,若是多台的话,须要涉及到多服务的交互,好比一台服务作了Cache存储,须要给其余服务发送内部信号或是http请求,其余服务根据请求执行对应操做。github
固然这是在没有用到Redis的前提下,Redis是解决分布式缓存的神器,至关因而自身一台服务器专门处理数据的读写,能够理解为数据服务器(我的感受。。。),至于本身业务的分布式只是为了业务须要去执行,须要用到数据缓存便可直接调用Redis的读写操做(固然,各个服务的Redis配置要保持一致)。redis
Redis的安装和配置在Linux配置部署_新手向(四)——Redis安装与配置已经说过,当时就是为了使用Redis而作了个小铺垫。json
首先,只要是类库确定是引入Nuget包了,咱们在April.Util引入Microsoft.Extensions.Caching.Redis,固然其余也有StackExchange.Redis,CSRedisCore,这里先试试官方的吧,官方扩展包地址。api
引入完以后,咱们在appsettings.json来配置下地址目录。
以后咱们看下Redis的方法,毕竟调用第三方都是看看而后根据本身须要裹一下。
浏览器
也是先要初始化配置信息,而后建立实体对象,调用方法,这里说明下,默认的value值是byte[],固然官方也有扩展方法。
好了,看完了方法,咱们来开始Util吧。缓存
首先,咱们仍是要先作配置信息,前面已经在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的方法。app
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 总目录,感受代码贴的多了,本身也习惯了复制粘贴,看一个封装好的方法,就要去看他的源码(若是只是用的话就算了),这样对方法的使用以及自身的业务须要封装会有很好的帮助,毕竟会用是第一步,会改是第二步,封装是第三步,本身写那就是最终级了(这句纯属自勉)。
好了,写完以后,习惯来一遍测试,不想本身整理的东西最终仍是不能用,千篇一概不可怕,可怕的是不知道最终的效果。
新增
获取
覆盖
ps:说是覆盖,其实就是删除而后新增-,-|||
删除
写到这里基本上都结束了,简单的说明了Redis的使用,后续仍是会不断更新,好比那么多database,若是随意切换,redis存储以后会不会有什么其余问题等等,学以至用,用方知错,错而能改,改了就行。