net core WebApi——緩存神器Redis

前言

中秋過完不知不覺都已經快兩週沒動這個工程了,最近業務須要總算開始搞後臺雲服務了,果斷直接net core搞起,在作的中間遇到了很多問題,這個後續會一點點列出來包括解決方法,今天就先把以前挖的坑填一個。git

Redis

以前在緩存那篇提到過,CookieSessionCache這幾個不一樣的緩存方式,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.RedisCSRedisCore,這裏先試試官方的吧,官方擴展包地址api

引入完以後,咱們在appsettings.json來配置下地址目錄。
配置
以後咱們看下Redis的方法,畢竟調用第三方都是看看而後根據本身須要裹一下。
Redis瀏覽器

也是先要初始化配置信息,而後建立實體對象,調用方法,這裏說明下,默認的value值是byte[],固然官方也有擴展方法。
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的方法。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存儲以後會不會有什麼其餘問題等等,學以至用,用方知錯,錯而能改,改了就行

相關文章
相關標籤/搜索