net core WebApi——緩存神器Redis

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

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


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

-Advertisement-
Play Games
更多相關文章
  • 通過上一篇(abp(net core)+easyui+efcore實現倉儲管理系統——EasyUI前端頁面框架 (十八) )文章,我們已經將EasyUI添加到我們的項目中了。下麵我們通過EasyUI做為前端頁面的UI控制項來展現一個貨物信息管理的前端功能,並使用創建相應的實體類,服務類等來實現後臺功能... ...
  • 原文地址: https://blog.csdn.net/chadcao/article/details/7859394 ASP.NET的安全認證,共有“Windows”、“Form”、“Passport”、“None”四種驗證模式。下麵來說說From認證,內容分三部分: 第一部分—— 怎樣實現Fro ...
  • 場景 Winform中實現讀取xml配置文件並動態配置ZedGraph的RadioGroup的選項: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/100540708 在上面實現了將RadioGroup的選項根據配置文件動態配置後 ...
  • 期待已久的.NET Core 3.0即將發佈! .NET Core 3.0在.NET Conf上發佈。大約還有9個多小時後,.NET Conf開始啟動。 為期3天的大概日程安排如下: 第1天-9月23日 9:00-10:00 Microsoft Studios播出的主題演講10:00-17:00從M ...
  • 前提 入行已經7,8年了,一直想做一套漂亮點的自定義控制項,於是就有了本系列文章。 GitHub:https://github.com/kwwwvagaa/NetWinformControl 碼雲:https://gitee.com/kwwwvagaa/net_winform_custom_contr ...
  • 單例類public class SnappingClass : ISnappingEnvironment, IExtension { // private static readonly SnappingClass instance = null; static SnappingClass() { ... ...
  • 原文地址:https://blog.csdn.net/FL1623863129/article/details/89013137 VS2019於昨日正式發佈,博主立馬下載一個專業版嘗嘗鮮,但是發現項目打開都沒反應,而且VS2019都死在進程,怎麼也打不開,這不是安裝包而是沒有以管理員運行,只要在屬性 ...
  • 對try catch finally的理解1.finally 總是會運行的,即使在catch中thorw拋出異常了。2.finally 在 return後沒有結束,而是繼續運行finally2.順序的話就是對try-》finally 或者 try-》catch-》finally不管怎樣finally ...
一周排行
    -Advertisement-
    Play Games
  • 概述:在C#中,++i和i++都是自增運算符,其中++i先增加值再返回,而i++先返回值再增加。應用場景根據需求選擇,首碼適合先增後用,尾碼適合先用後增。詳細示例提供清晰的代碼演示這兩者的操作時機和實際應用。 在C#中,++i 和 i++ 都是自增運算符,但它們在操作上有細微的差異,主要體現在操作的 ...
  • 上次發佈了:Taurus.MVC 性能壓力測試(ap 壓測 和 linux 下wrk 壓測):.NET Core 版本,今天計劃準備壓測一下 .NET 版本,來測試並記錄一下 Taurus.MVC 框架在 .NET 版本的性能,以便後續持續優化改進。 為了方便對比,本文章的電腦環境和測試思路,儘量和... ...
  • .NET WebAPI作為一種構建RESTful服務的強大工具,為開發者提供了便捷的方式來定義、處理HTTP請求並返迴響應。在設計API介面時,正確地接收和解析客戶端發送的數據至關重要。.NET WebAPI提供了一系列特性,如[FromRoute]、[FromQuery]和[FromBody],用 ...
  • 原因:我之所以想做這個項目,是因為在之前查找關於C#/WPF相關資料時,我發現講解圖像濾鏡的資源非常稀缺。此外,我註意到許多現有的開源庫主要基於CPU進行圖像渲染。這種方式在處理大量圖像時,會導致CPU的渲染負擔過重。因此,我將在下文中介紹如何通過GPU渲染來有效實現圖像的各種濾鏡效果。 生成的效果 ...
  • 引言 上一章我們介紹了在xUnit單元測試中用xUnit.DependencyInject來使用依賴註入,上一章我們的Sample.Repository倉儲層有一個批量註入的介面沒有做單元測試,今天用這個示例來演示一下如何用Bogus創建模擬數據 ,和 EFCore 的種子數據生成 Bogus 的優 ...
  • 一、前言 在自己的項目中,涉及到實時心率曲線的繪製,項目上的曲線繪製,一般很難找到能直接用的第三方庫,而且有些還是定製化的功能,所以還是自己繪製比較方便。很多人一聽到自己畫就害怕,感覺很難,今天就分享一個完整的實時心率數據繪製心率曲線圖的例子;之前的博客也分享給DrawingVisual繪製曲線的方 ...
  • 如果你在自定義的 Main 方法中直接使用 App 類並啟動應用程式,但發現 App.xaml 中定義的資源沒有被正確載入,那麼問題可能在於如何正確配置 App.xaml 與你的 App 類的交互。 確保 App.xaml 文件中的 x:Class 屬性正確指向你的 App 類。這樣,當你創建 Ap ...
  • 一:背景 1. 講故事 上個月有個朋友在微信上找到我,說他們的軟體在客戶那邊隔幾天就要崩潰一次,一直都沒有找到原因,讓我幫忙看下怎麼回事,確實工控類的軟體環境複雜難搞,朋友手上有一個崩潰的dump,剛好丟給我來分析一下。 二:WinDbg分析 1. 程式為什麼會崩潰 windbg 有一個厲害之處在於 ...
  • 前言 .NET生態中有許多依賴註入容器。在大多數情況下,微軟提供的內置容器在易用性和性能方面都非常優秀。外加ASP.NET Core預設使用內置容器,使用很方便。 但是筆者在使用中一直有一個頭疼的問題:服務工廠無法提供請求的服務類型相關的信息。這在一般情況下並沒有影響,但是內置容器支持註冊開放泛型服 ...
  • 一、前言 在項目開發過程中,DataGrid是經常使用到的一個數據展示控制項,而通常表格的最後一列是作為操作列存在,比如會有編輯、刪除等功能按鈕。但WPF的原始DataGrid中,預設只支持固定左側列,這跟大家習慣性操作列放最後不符,今天就來介紹一種簡單的方式實現固定右側列。(這裡的實現方式參考的大佬 ...