【轉載】在AspNetCore 中 使用Redis實現分散式緩存

来源:https://www.cnblogs.com/eyu1993/archive/2018/10/07/9749385.html
-Advertisement-
Play Games

原文地址:https://www.cnblogs.com/szlblog/p/9045209.html AspNetCore 使用Redis實現分散式緩存 上一篇講到了,Core的內置緩存:IMemoryCache,以及緩存的基礎概念。本篇會進行一些概念上的補充。 本篇我們記錄的內容是怎麼在Core ...


原文地址:https://www.cnblogs.com/szlblog/p/9045209.html

 

AspNetCore 使用Redis實現分散式緩存

上一篇講到了,Core的內置緩存:IMemoryCache,以及緩存的基礎概念。本篇會進行一些概念上的補充。

 

本篇我們記錄的內容是怎麼在Core中使用Redis 和 SQL Server 實現分散式緩存。

一、文章概念描述

分散式緩存描述

分散式緩存重點是在分散式上,相信大家接觸過的分散式有很多中,像分散式開發,分散式部署,分散式鎖、事物、系統 等有很多。使我們對分散式本身就有一個很明確的認識,分散式就是有多個應用程式組成,可能分佈在不同的伺服器上,最終都是在為web端提供服務。

分散式緩存有以下幾點優點:

(1)所有的Web伺服器上的緩存數據都是相同的,不會因為應用程式不同,伺服器的不同導致緩存數據的不一樣。

(2)緩存的是獨立的不受Web伺服器的重新啟動或被刪除添加的影響,也就是說這些Web的改變不到導致緩存數據的改變。

 

傳統的單體應用架構因為用戶的訪問量的不高,緩存的存在大多數都是存儲用戶的信息,以及一些頁面,大多數的操作都是直接和DB進行讀寫交互,這種架構簡單,也稱為簡單架構,

傳統的OA項目比如ERP,SCM,CRM等系統因為用戶量不大也是因為大多數公司業務的原因,單體應用架構還是很常用的架構,但是有些系統隨著用戶量的增加,業務的擴張擴展,導致DB的瓶頸的出現。

以下我所瞭解到的關於這種情況的處理有以下兩種

(1):當用戶訪問量不大,但是讀寫的數據量很大的時候,我們一般採取的是,對DB進行讀寫分離、一主多從、對硬體進行升級的方式來解決DB瓶頸的問題。

  這樣的缺點也同樣純在:

1、用戶量大的時候怎麼辦?,

2、對於性能的提升有限,

3、性價比不高。提升一點性能就需要花費很多代價,(打個比方,現在的I/O吞吐量是0.9的需要提升到1.0,我們在增加機器配置的情況下這個價格確實很可觀的)

2):當用戶訪問量也增加的時候,我們就需要引入緩存了來解決了,一張圖描述緩存的大致的作用。

 

 

 

 

緩存主要針對的是不經常發生改變的並且訪問量很大的數據,DB資料庫可以理解為只作為數據固化的或者只用來讀取經常發生改變的數據,上圖中我沒有畫SET的操作,就是想特意說明一下,緩存的存在可以作為一個臨時的資料庫,我們可以通過定時的任務的方式去同步緩存和資料庫中的數據,這樣做的好處是可以轉移資料庫的壓力到緩存中。

 

緩存的出現解決了資料庫壓力的問題,但是當以下情況發生的時候,緩存就不在起到作用了,緩存穿透、緩存擊穿緩存雪崩這三種情況。

 

緩存穿透:我們的程式中用緩存的時候一般採取的是先去緩存中查詢我們想要的緩存數據,如果緩存中不存在我們想要的數據的話,緩存就失去了做用(緩存失效)我們就是需要伸手向DB庫去要數據,這個時候這種動作過多資料庫就崩潰了,這種情況需要我們去預防了。比如說:我們向緩存獲取一個用戶信息,但是故意去輸入一個緩存中不存在的用戶信息,這樣就避過了緩存,把壓力重新轉移到數據上面了。對於這種問題我們可以採取,把第一次訪問的數據進行緩存,因為緩存查不到用戶信息,資料庫也查詢不到用戶信息,這個時候避免重覆的訪問我們把這個請求緩存起來,把壓力重新轉向緩存中,有人會有疑問了,當訪問的參數有上萬個都是不重覆的參數並且都是可以躲避緩存的怎麼辦,我們同樣把數據存起來設置一個較短過期時間清理緩存。

緩存擊穿:事情是這樣的,對於一些設置了過期時間的緩存KEY,在過期的時候,程式被高併發的訪問了(緩存失效),這個時候使用互斥鎖來解決問題,

互斥鎖原理:通俗的描述就是,一萬個用戶訪問了,但是只有一個用戶可以拿到訪問資料庫的許可權,當這個用戶拿到這個許可權之後重新創建緩存,這個時候剩下的訪問者因為沒有拿到許可權,就原地等待著去訪問緩存。

 

永不過期:有人就會想了,我不設置過期時間不就行了嗎?可以,但是這樣做也是有缺點的,我們需要定期的取更新緩存,這個時候緩存中的數據比較延遲。

    緩存雪崩是指多種緩存設置了同一時間過期,這個時候大批量的數據訪問來了,(緩存失效)資料庫DB的壓力又上來了。解決方法在設置過期時間的時候在過期時間的基礎上增加一個隨機數儘可能的保證緩存不會大面積的同事失效。

二、文章內容實現

AspNetCore中使用  Redis實現緩存:

 

在項目中引用:using Microsoft.Extensions.Caching.Distributed; 使用IDistributedCache

IDistributedCache 介面

IDistributedCache介面包含同步和非同步方法。 介面允許在分散式緩存實現中添加、檢索和刪除項。 IDistributedCache介面包含以下方法:

GetGetAsync

採用字元串鍵並以byte[]形式檢索緩存項(如果在緩存中找到)。

SetSetAsync

使用字元串鍵向緩存添加項byte[]形式)。

RefreshRefreshAsync

根據鍵刷新緩存中的項,並重置其可調過期超時值(如果有)。

RemoveRemoveAsync

根據鍵刪除緩存項。

以下是我的代碼封裝DistributedCache類名:主要針對IDistributedCache中非非同步方法,非同步只寫了一個簡單的例子:

1、Get()獲取緩存

 

 /// <summary>
        /// 獲取緩存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public object Get(string key)
        {
            string ReturnStr = "";
            if (!string.IsNullOrEmpty(key))
            {
                if (Exists(key))
                {
                    ReturnStr = Encoding.UTF8.GetString(_cache.Get(key));
                }
            }
            return ReturnStr;
        }
View Code

 

2GetAsync()非同步獲取緩存
/// <summary>
        /// 使用非同步獲取緩存信息
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public async Task<object> GetAsync(string key)
        {
            string ReturnString = null;
            var value = await _cache.GetAsync(key);
            if (value != null)
            {
                ReturnString = Encoding.UTF8.GetString(value);
            }
            return ReturnString;
        }
View Code

3Set()設置或添加緩存

 /// <summary>
        /// 添加緩存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool Add(string key, object value)
        {
            byte[] val = null;
            if (value.ToString() != "")
            {
                val = Encoding.UTF8.GetBytes(value.ToString());
            }
            DistributedCacheEntryOptions options = new DistributedCacheEntryOptions();
            //設置絕對過期時間 兩種寫法
            options.AbsoluteExpiration = DateTime.Now.AddMinutes(30);
            // options.SetAbsoluteExpiration(DateTime.Now.AddMinutes(30));
            //設置滑動過期時間 兩種寫法
            options.SlidingExpiration = TimeSpan.FromSeconds(30);
            //options.SetSlidingExpiration(TimeSpan.FromSeconds(30));
            //添加緩存
            _cache.Set(key, val, options);
            //刷新緩存
            _cache.Refresh(key);
            return Exists(key);
        }
View Code

4、Remove()刪除緩存

 

 /// <summary>
        /// 刪除緩存
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool Remove(string key)
        {
            bool ReturnBool = false;
            if (key != "" || key != null)
            {
                _cache.Remove(key);
                if (Exists(key) == false)
                {
                    ReturnBool = true;
                }
            }
            return ReturnBool;
        }
View Code

 

5、修改緩存

  /// <summary>
        /// 修改緩存
        /// </summary>
        /// <param name="key"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public bool Modify(string key, object value)
        {
            bool ReturnBool = false;
            if (key != "" || key != null)
            {
                if (Remove(key))
                {
                    ReturnBool = Add(key, value.ToString());
                }

            }
            return ReturnBool;
        }
View Code

6、驗證緩存是否存在

/// <summary>
        /// 驗證是否存在
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public bool Exists(string key)
        {
            bool ReturnBool = true;
            byte[] val = _cache.Get(key);
            if (val == null || val.Length == 0)
            {
                ReturnBool = false;
            }
            return ReturnBool;
        }
View Code

三、文章內容調用

 

以上是代碼的封裝:下麵是在AspnetCore中調用

1、首先安裝Redis緩存:這個網上找個下載安裝就行

2、然後下載安裝:客戶端工具:RedisDesktopManager(方便管理)

3、在我們的項目Nuget中 引用 Microsoft.Extensions.Caching.Redis

 

 4、在項目啟動Setup.cs中註冊:Redis服務:代碼如下

 

public void ConfigureServices(IServiceCollection services)
        {
            //將Redis分散式緩存服務添加到服務中
            services.AddDistributedRedisCache(options =>
            {
                //用於連接Redis的配置  Configuration.GetConnectionString("RedisConnectionString")讀取配置信息的串
                options.Configuration = "localhost";// Configuration.GetConnectionString("RedisConnectionString");
                //Redis實例名RedisDistributedCache
                options.InstanceName = "RedisDistributedCache";
            });
            services.AddMvc();
        }
View Code

 

5、我是用CoreAPI來寫的 控制器中代碼如下:

1)先實例對象

  private DistributedCache _Cache;

        /// <summary>
        ///   構造註入
        /// </summary>
        /// <param name="Cache"></param>
        public ValuesController(IDistributedCache Cache)
        {
            _Cache = new DistributedCache(Cache);
        }
View Code

2)調用DistributedCache 類中的方法 代碼如下:

 

[HttpGet("{id}")]
        public string Get(int id)
        {
            //添加
            bool booladd = _Cache.Add("id", "sssss");
            //驗證
            bool boolExists = _Cache.Exists("id");
            //獲取
            object obj = _Cache.Get("id");
            //刪除
            bool boolRemove = _Cache.Remove("id");
            //修改
            bool boolModify = _Cache.Modify("id", "ssssssss"); 

            return obj.ToString();
        }
View Code

 

 

 


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

-Advertisement-
Play Games
更多相關文章
  • 1,安裝Microsoft.AspNetCore.Mvc.Versioning NET Core Mvc中,微軟官方提供了一個可用的Api版本控制庫Microsoft.AspNetCore.Mvc.Versioning。 2,修改Startup類 這裡我們需要在Startup類的ConfigureS ...
  • 1、前言 微服務架構概念的提出已經有非常長一段時間了,但在近期幾年卻開始頻繁地出現,大家都著手升級成微服務架構,使用著各種技術,大家認為框架有服務治理就是微服務,實現單一協議的服務調用,微服務雖然沒有太明確的定義,但是我認為服務應該是一個或者一組相對較小且獨立的功能單元,可以自由組合拆分,針對於業務 ...
  • 假如有100個知識點, 你會90個,你不主動說,面試官問了 你不會的10個裡的7個,其他的3個是你會的90個裡的 那麼你的得分是30分。 假如你會30個,你主動說了你會的7個,面試官問了你3個,其中有2個是你不會的那70個裡的,那麼你的得分是80分。 所以面試的時候要主動說出你擅長的領域,你會的東西 ...
  • 上次寫的隨筆,簡單21點紙牌小游戲,當窗體大小改變時,紙牌畫面會出現不顯示的問題,因為每一張牌都是用GDI+的方法,從圖片中剪裁下來的,沒有用到vs提供的控制項,如PictureBox控制項,這就需要自己在窗體的Paint事件中來重新繪製圖片,這樣在窗體大小改變時,就能夠正常顯示紙牌圖片了,代碼中紙牌父 ...
  • GraphQL 既是一種用於 API 的查詢語言也是一個滿足你數據查詢的運行時。 GraphQL來自Facebook,它於2012年開始開發,2015年開源。 GraphQL與編程語言無關,可以使用很多種語言/框架來構建Graph 伺服器,包括.NET Core。 像Github,Pinterest ...
  • 前一篇文章記錄了簡單的多線程編程的幾種方式,但是在實際的項目中,也需要等待多線程執行完成之後再執行的方法,這個就叫做多線程的同步,或者,由於多個線程對同一對象的同時操作造成數據錯亂,需要線程安全。這篇文章主要記錄多線程的同步非同步如何實現線程安全的幾種方式的筆記,如有錯誤,請大神不吝賜教。 因為代碼里 ...
  • 官方教程 安裝linux https://www.cnblogs.com/LittleFeiHu/p/9749455.html 第一步 :選擇和你本機適用的Linux版本,我這裡用的是18.04. 第二步 :註冊秘鑰,產品倉儲,以及安裝依賴項,每台機器只需要註冊一次, 第三步:安裝.net core ...
  • 1. 2.重啟電腦 3.在winstore下載和安裝 ubuntu 4.查看當前win10子系統的linux版本 lsb_release -a 5.設置root賬號密碼, 在終端輸入命令 sudo passwd, 然後輸入當前用戶的密碼, enter,終端會提示我們輸入新的密碼並確認, 此時的密碼 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...