net core WebApi——緩存神器Redis

来源:https://www.cnblogs.com/AprilBlank/archive/2019/09/23/11571365.html

@[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來配置下地址目錄。
配置
之後我們看下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的方法。

        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存儲之後會不會有什麼其他問題等等,學以致用,用方知錯,錯而能改,改了就行


您的分享是我們最大的動力!

更多相關文章
  • Controller繼承ControllrBase,ControllerBase繼承IController,而IController里只有一個Execute方法 1、ControllrBase里的Execute(),裡面調用了ExecuteCore(),而ExecuteCore()是個抽象方法,抽象 ...
  • 上一章介紹了配置的多種數據源被註冊、載入和獲取的過程,本節看一下這個過程系統是如何實現的。(ASP.NET Core 系列目錄) 一、數據源的註冊 在上一節介紹的數據源設置中,appsettings.json、命令行、環境變數三種方式是被系統自動載入的,這是因為系統在webHost.CreateDe ...
  • 通過以下思維導圖,學習委托的基本概念,後面著重講解委托的運用,希望通過最簡單的方式收穫更多的知識。 1.委托的各種寫法 1、委托 委托名=new 委托(會調用的方法名); 委托名(參數); 2、委托 委托名 =會調用的方法名; 委托名(參數); 3、匿名方法:委托 委托名=delegate(參數){ ...
  • ASP.NET有個大佬,HttpContext(在.Net Core中依然是它)Http請求的上下文,任何一個環節都是需要HttpContext的,需要的參數信息,處理的中間結果,最終的結果,都是放在HttpContext,是一個貫穿全局的對象。 所謂的六大對象,其實就是HttpContext的屬性 ...
  • public class CEBSignClient { public void StartSignClient() { } private static SignClientConfig _signClientConfig; public static SignClientConfig CebSi ...
一周排行
  • 前言 現在.net core跨平臺了,相信大部分人都把core的程式部署在了linux環境中,或者部署在了docker容器中,與之對應的,之前都是部署在windows環境中,在win中,我們可以用windbg來調試。但是在linux環境下 我們可以採用lldb(這隻是一種,還有其他方式) 環境 li ...
  • 一、WPF的Image控制項中設置ImageSource 還可以使用: 還可以使用: 二、Bitmap轉BitmapImage 先將Bitmap儲存成memorystream,然後指定給BitmapImage 三、Bitmap轉BitmapSource 四、BitmapSource轉Bitmap ...
  • 名詞: IWorkspaceFactory 工作空間工廠 ShapeFileWorksapceFactory 矢量文件工作空間工廠 IWorkspce 工作空間 IFeatrueWorkspace 要素工作空間 IFeatureClass 要素類 IFeatureLayer 要素圖層 Feature ...
  • 一、背景 最近在精讀 《CLR Via C 》和 《Effective C 》 的時候,發現的一個問題點。一般來說,我們實現 介面,是為了釋放托管資源和非托管資源。不過在 C 類型定義裡面有一個功能類似的東西,那就是 終結器 。 最開始我是學 C++ 的,之後學 C 的時候發現這玩意兒不論是寫法和作 ...
  • 1、Readonly成員 可將readonly修飾符應用於結構的任何成員,它指示該成員不會修改狀態。這比將readonly修飾符應用於struct聲明更精細。 像大多數結構一樣ToString()方法不會修改狀態。可以通過readonly修飾符添加到ToString()的聲明來對此進行指示: 上述更 ...
  • 轉發:https://www.cnblogs.com/Ninputer/archive/2008/11/22/generic_covariant.html 背景知識:協變和逆變 假設有這樣兩個類型:TSub是TParent的子類,顯然TSub型引用是可以安全轉換為TParent型引用的。如果一個泛型 ...
  • 在文檔屬性中,可以設置諸多關於文檔的信息,如創建時間、作者、單位、類別、關鍵詞、備註等摘要信息以及一些自定義的文檔屬性。下麵將通過C#程式來演示如何設置,同時對文檔內的已有信息,也可以實現讀取或刪除等操作。 示例大綱: 1. 添加文檔屬性 1.1 添加摘要信息 1.2 添加自定義文檔信息 2. 讀取 ...
  • 這篇文章粗略指引怎麼搭建.Net Core API,並使用Swagger服務。非常適合初學者,網上也有很多。 ...
  • 微軟官方概述: 在C 中,協變和逆變能夠實現數組類型、委托類型和泛型類型參數的隱式引用轉換。協變保留分配相容性,逆變則與之相反。 協變:能夠使用與原始指定的派生類型相比,派生程度更大的類型。 逆變:能夠使用派生程度更小的類型。 官方示例: 上面示例中,從 string object 的隱式轉換這是協 ...
  • 前端 後端 技術要點: 1.上傳附件<input type="file" name="goodsfile" id="goodsfile" class="layui-input" accept="application/vnd.openxmlformats-officedocument.spreads ...
x