.NET Core應用中使用分散式緩存及記憶體緩存

来源:https://www.cnblogs.com/atree/archive/2019/09/12/netcore-Distributed-Cache.html
-Advertisement-
Play Games

.NET Core針對緩存提供了很好的支持 ,我們不僅可以選擇將數據緩存在應用進程自身的記憶體中,還可以採用分散式的形式將緩存數據存儲在一個“中心資料庫”中。對於分散式緩存,.NET Core提供了針對Redis和SQL Server的原生支持。除了這個獨立的緩存系統之外,ASP.NET Core還借... ...


.NET Core針對緩存提供了很好的支持 ,我們不僅可以選擇將數據緩存在應用進程自身的記憶體中,還可以採用分散式的形式將緩存數據存儲在一個“中心資料庫”中。對於分散式緩存,.NET Core提供了針對Redis和SQL Server的原生支持。除了這個獨立的緩存系統之外,ASP.NET Core還藉助一個中間件實現了“響應緩存”,它會按照HTTP緩存規範對整個響應實施緩存。ASP.NET Core 支持多種不同的緩存。

常見緩存響應的四種方式

1、記憶體緩存

  顧名思義,緩存在記憶體中,生命周期預設伴隨應用程式

2、響應緩存

  響應緩存可減少客戶端或代理到 web 伺服器發出的請求數。 響應緩存還減少了工作的 web 伺服器執行以生成響應。 響應緩存控制標頭,指定要如何客戶端、 代理和響應緩存中間件。

3、響應緩存中間件

  Microsoft.AspNetCore.ResponseCaching 包中的ResponseCaching

4、分散式緩存

  比較常用的是基於Redis和資料庫的分散式緩存。

在這裡我們重點說說記憶體緩存和分散式緩存。

如果你看到這段文字,說明您正使用RSS閱讀或轉自《一棵樹-博客園》,原文地址:https://www.cnblogs.com/atree/p/netcore-Distributed-Cache.html 

將數據緩存在記憶體中-記憶體緩存

與針對資料庫和遠程服務調用這種IO操作來說,應用針對記憶體的訪問性能將提供不止一個數量級的提升,所以將數據直接緩存在應用進程的內容中自然具有最佳的性能優勢。與基於記憶體的緩存相關的應用編程介面定義在NuGet包“Microsoft.Extensions.Caching.Memory”中,具體的緩存實現在一個名為MemoryCache的服務對象中,後者是我們對所有實現了IMemoryCache介面的所有類型以及對應對象的統稱。由於是將緩存對象直接置於記憶體之中,中間並不涉及持久化存儲的問題,自然也就無需考慮針對緩存對象的序列化問題,所以這種記憶體模式支持任意類型的緩存對象。

針對緩存的操作不外乎對緩存數據的存與取,這兩個基本的操作都由上面介紹的這個MemoryCache對象來完成。如果我們在一個ASP.NET Core應用對MemoryCache服務在啟動時做了註冊,我們就可以在任何地方獲取該服務對象設置和獲取緩存數據,所以針對緩存的編程是非常簡單的。不想看這些,直接看案例。

static void Main (string[] args) 
{ MemoryCache memoryCache
= new MemoryCache(new MemoryCacheOptions()); memoryCache.Set("name", "tom"); var value = memoryCache.Get("name"); Console.WriteLine(value); Console.ReadKey(); }

 設置過期時間:

static void Main (string[] args) 
{ MemoryCache memoryCache
= new MemoryCache (new MemoryCacheOptions ()); memoryCache.Set ("name", "jack", new MemoryCacheEntryOptions () { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds (5) //設置為5秒後過期 }); while (true) { System.Threading.Thread.Sleep (1000); string value; if (!memoryCache.TryGetValue ("name", out value)) { value = "已過期"; } Console.WriteLine (value); } }

基於記憶體的緩存具有最高的性能,但是由於它實際上是將緩存數據存在承載ASP.NET Core應用的Web服務上,對於部署在集群式伺服器中的應用會出現緩存數據不一致的情況。對於這種部署場景,我們需要將數據緩存在某一個獨立的存儲中心,以便讓所有的Web伺服器共用同一份緩存數據,我們將這種緩存形式稱為“分散式緩存”。ASP.NET Core為分散式緩存提供了兩種原生的存儲形式,一種是基於NoSQL的Redis資料庫,另一種則是微軟自家關係型資料庫SQL Server。

基於Redis的分散式緩存

Redis數目前較為流行NoSQL資料庫,很多的編程平臺都將它作為分散式緩存的首選,接下來我們來演示如何在一個ASP.NET Core應用中如何採用基於Redis的分散式緩存。考慮到一些人可能還沒有體驗過Redis,所以我們先來簡單介紹一下如何安裝Redis。Redis最簡單的安裝方式就是採用Chocolatey(https://chocolatey.org/) 命令行,後者是Windows平臺下一款優秀的軟體包管理工具(類似於NPM)。

採用PowerShell (要求版本在V3以上)命令行

iwr https://chocolatey.org/install.ps1 -UseBasicParsing | iex

或者普通CMD.exe命令行:

@powershell -NoProfile -ExecutionPolicy Bypass -Command "iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))" && SET "PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin"

來安裝Chocolatey。在確保Chocolatey 被本地正常安裝情況下,我們可以執行執行如下的命令安裝或者升級64位的Redis。

C:\>choco install redis-64
C:\>choco upgrade redis-64

Redis伺服器的啟動也很簡單,我們只需要以命令行的形式執行redis-server命令即可。如果在執行該命名之後看到如下圖所示的輸出,則表示本地的Redis伺服器被正常啟動,輸出的結果會指定伺服器採用的網路監聽埠。為了方便管理,可以下載安裝:客戶端工具:RedisDesktopManager。

針對Redis的分散式緩存實現在NuGet包“Microsoft.Extensions.Caching.Redis”之中,所以我們需要確保該NuGet包被正常安裝。不論採用Redis、SQL Server還是其他的分散式存儲方式,針對分散式緩存的操作都實現在DistributedCache這個服務對象向,該服務對應的介面為IDistributedCache。

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

Get、 GetAsync

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

Set、SetAsync

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

Refresh、RefreshAsync

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

Remove、RemoveAsync

根據鍵刪除緩存項。

在項目啟動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 (); }

實例對象,構造註入

private DistributedCache _Cache;

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

調用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 ();
}

基於SQL Server的分散式緩存

除了使用Redis這種主流的NoSQL資料庫來支持分散式緩存,微軟在設計分散式緩存時也沒有忘記自家的關係型資料庫採用SQL Server。針對SQL Server的分散式緩存實現在“Microsoft.Extensions.Caching.SqlServer”這個NuGet包中,我們先得確保該NuGet包被正常裝到演示的應用中。

所謂的針對SQL Server的分散式緩存,實際上就是將標識緩存數據的位元組數組存放在SQL Server資料庫中某個具有固定結構的數據表中,因為我們得先來創建這麼一個緩存表,該表可以藉助一個名為sql-cache 的工具來創建。在執行sql-cache 工具創建緩存表之前,我們需要在project.json文件中按照如下的形式為這個工具添加相應的NuGet包“Microsoft.Extensions.Caching.SqlConfig.Tools”。

在 SqlServer 資料庫引擎中創建一個資料庫,命名為:TestDb,打開項目根目錄,執行創建緩存數據表的操作,執行命令後如果輸出信息:Table and index were created successfully. 表示緩存表創建成功.

dotnet sql-cache create "Server=.\SQLEXPRESS;User=sa;Password=123456;Database=TestDb" dbo AspNetCoreCache

在 Startup.cs 中註冊分散式緩存

public void ConfigureServices (IServiceCollection services) {
    services.AddDistributedSqlServerCache (options => {
        options.SystemClock = new BLL.LocalSystemClock ();
        options.ConnectionString = this.Configuration["ConnectionString"];
        options.SchemaName = "dbo";
        options.TableName = "AspNetCoreCache";
        options.DefaultSlidingExpiration = TimeSpan.FromMinutes (1);
        options.ExpiredItemsDeletionInterval = TimeSpan.FromMinutes (5);
    });
    ...
}

在控制器中使用分散式緩存

[Route ("api/Home")]
[ApiController]
public class HomeController : Controller {
    private IDistributedCache cache;
    public HomeController (IDistributedCache cache) {
        this.cache = cache;
    }

    [HttpGet ("Index")]
    public async Task<ActionResult<string>> SetTime () {
        var CurrentTime = DateTime.Now.ToString ();
        await this.cache.SetStringAsync ("CurrentTime", CurrentTime);
        return CurrentTime;
    }

    [HttpGet ("GetTime")]
    public async Task<ActionResult<string>> GetTime () {
        var CurrentTime = await this.cache.GetStringAsync ("CurrentTime");
        return CurrentTime;
    }
}

就這樣,用起來挺方便的。


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

-Advertisement-
Play Games
更多相關文章
  • 一、使用java中的數組 數組:把數據碼成一排進行存放 在元素前面添加一個新元素 四、數組中查詢元素和修改元素 還是在上面的類中寫方法,這裡重寫toString方法,用於查詢元素 把前面寫的功能進行測試 說明還是成功的,由於int類型太單調,之後都將使用泛型來進行操作 七、動態數組 由於數組是由限制 ...
  • 作者:黃小斜 今天是9月10號教師節,也是馬老師卸任阿裡巴巴董事長的日子,同時也是阿裡巴巴召開20周年年會的日子。有幸抽中了門票,在現場見證這具有歷史意義的一幕,馬老師在中場時給我們帶來了一段演講,也是他的謝幕致辭,其中讓人印象很深刻的內容大概就是這三點了。1 阿裡20年來的發展和堅持馬老師感謝20 ...
  • 閱讀本文大概需要 5 分鐘。 作者:黃小斜 作為一名典型的非科班程式員,我在學習和工作一段時間之後,發現了自己跟科班程式員還是有很多的的區別,不管是思維上還是做事風格,以及對待問題的解決方式,都感覺有些差強人意。 今天我就給大家梳梳理一下,科班成為相對於非科班程式員,他們的優勢到底在哪裡? 第一點那 ...
  • 我知道有很多人進互聯網行業或者是成為程式員,都是為了心中的一廂熱情,或者是為了行業的高薪資,高福利等等。 但是實話說,從事程式員這一行業的大部分人,都是衝著錢來的,其中當然也有熱愛,但是恰飯顯然是更重要的,人為財死,鳥為食亡,這無可厚非。 大家也知道,程式員這一行吃的是青春飯,賺錢不易,高工資通常是 ...
  • 1、數字 1、布爾型(bool) bool型只有兩個值:True和False a = False b = True 2、整形 int型 n = 12 a = "12" 將字元串類型轉換為int型方法: int(a) 預設轉換為十進位 int型中的十進位也可以轉換為其他進位: 二進位: bin(n) ...
  • 閱讀本文大概需要 5 分鐘。 作者:黃小斜 這篇文章其實我很早之前就想寫了,沒想到最近又出了一件類似的事情,事情就發生在我剛畢業不久的學校,事情始末想必大家都已經看過,震驚和惋惜之餘,更多的是思考。 去年有個新聞大家應該都聽說過,在武漢有一所學校,裡面有一個碩士生導師,和他的學生有一些矛盾,事情經過 ...
  • 有時候我們調試location指令時希望location指令能夠直接輸出文本,這樣能夠方便我們進行調試。這時我們可以使用echo模塊實現,但是大多數情況我們沒有安裝這個模塊,那麼我們還可以使用另一個方法來實現這個想法 直接返迴文本 html標簽格式 返回json文本 ...
  • 項目環境搭建 一、創建django項目 1.創建python虛擬環境 在虛擬機上創建python虛擬環境,因為實際項目部署,實在linux 2.創建django項目 1.安裝django 選擇安裝django2.1.x最新的一個版本2.1.10 2.創建django項目 3.創建pycharm項目 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...