1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        ASP.NET Core中的分布式緩存

        共 3872字,需瀏覽 8分鐘

         ·

        2020-07-28 18:36

        ASP.NET Core中的分布式緩存

        在上一篇文章中[1],我解釋了如何使用內(nèi)存緩存在ASP.NET Core應(yīng)用程序中管理緩存。如果您的應(yīng)用程序托管在單個(gè)服務(wù)器上,則可以使用這種類型的緩存。那.NET Core框架可以使用哪些工具在云中的分布式方案中進(jìn)行緩存呢

        IDistributedCache接口

        該框架提供以下接口:

        public interface IDistributedCache{    byte[] Get(string key);    Task <byte[]> GetAsync(string key);
        void Set(string key, byte[] value, DistributedCacheEntryOptions options); Task SetAsync(string key, byte[] value, DistributedCacheEntryOptions options);
        void Refresh(string key); Task RefreshAsync(string key);
        void Remove(string key); Task RemoveAsync(string key);
        }

        如果您還記得上一篇文章(IMemoryCache)中使用的接口,則可能會(huì)注意到一些相似之處,但甚至有很多區(qū)別,例如:

        1.異步方法2.刷新方法(無(wú)需請(qǐng)求數(shù)據(jù)即可更新緩存鍵)3.基于字節(jié)而非基于對(duì)象的方法

        到目前為止,Microsoft提供了3種實(shí)現(xiàn):一種是內(nèi)存中的,主要用于應(yīng)用程序的開(kāi)發(fā)階段,第二種是在SQL Server上,最后一種是基于REDIS。

        要使用基于REDIS的版本,必須安裝NuGet軟件包Microsoft.Extensions.Caching.Redis。

        分布式內(nèi)存緩存

        該實(shí)現(xiàn)由框架提供,并將我們的數(shù)據(jù)保存在內(nèi)存中。它不是完全分布式的緩存,因?yàn)閿?shù)據(jù)是從應(yīng)用程序?qū)嵗4嬖谄渌诘姆?wù)器上的。在某些情況下可能會(huì)有用:

        ?開(kāi)發(fā)與測(cè)試?在生產(chǎn)中使用單個(gè)服務(wù)器時(shí),內(nèi)存消耗不是問(wèn)題。

        無(wú)論如何,我們將使我們的應(yīng)用程序僅在必要時(shí)才使用“真實(shí)的”分布式解決方案(用于保存的接口是相同的)。要啟用此IDistributedCache實(shí)現(xiàn),您只需要在Startup類中注冊(cè)它,如下所示:

        `services.AddDistributedMemoryCache();`

        分布式SQL Server緩存

        此實(shí)現(xiàn)使分布式緩存可以將SQL Server數(shù)據(jù)庫(kù)用作存儲(chǔ)。有一些配置步驟。第一步包括創(chuàng)建用于保留數(shù)據(jù)的表。有一個(gè)命令行命令工具,可通過(guò)簡(jiǎn)單的指令輕松實(shí)現(xiàn)

        dotnet sql-cache create <connection string > <schema > <table >

        ?

        允許創(chuàng)建具有以下結(jié)構(gòu)的表:

        CREATE TABLE [dbo].[CacheTable](    [Id] [nvarchar](449) NOT NULL,    [Value] [varbinary](max) NOT NULL,    [ExpiresAtTime] [datetimeoffset](7) NOT NULL,    [SlidingExpirationInSeconds] [bigint] NULL,    [AbsoluteExpiration] [datetimeoffset](7) NULL, CONSTRAINT [pk_Id] PRIMARY KEY CLUSTERED (    [Id] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,     IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,     ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] CREATE NONCLUSTERED INDEX [Index_ExpiresAtTime] ON [dbo].[CacheTable](    [ExpiresAtTime] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,     SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF,     ONLINE = OFF, ALLOW_ROW_LOCKS = ON,     ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

        配置此實(shí)現(xiàn)的第二個(gè)也是最后一個(gè)步驟,即在我們的應(yīng)用程序中進(jìn)行注冊(cè)。在Startup類的ConfigureServices方法內(nèi),我們添加以下代碼塊:

        services.AddDistributedSqlServerCache(o =>{    o.ConnectionString = Configuration["ConnectionStrings:Default"];    o.SchemaName = "dbo";    o.TableName = "Cache";});

        分布式Redis緩存

        在分布式緩存場(chǎng)景中,Redis的使用非常廣泛。Redis是一個(gè)快速存儲(chǔ)的數(shù)據(jù)存儲(chǔ),它是開(kāi)源的并且是鍵值類型。它提供的響應(yīng)時(shí)間不到1毫秒,從而允許在各個(gè)領(lǐng)域中的每個(gè)實(shí)時(shí)應(yīng)用程序每秒接收數(shù)百萬(wàn)個(gè)請(qǐng)求。如果您的應(yīng)用程序的基礎(chǔ)結(jié)構(gòu)基于Azure云,則可以使用服務(wù)Azure Redis緩存,并且可以從您的訂閱中對(duì)其進(jìn)行配置。

        要在Redis上使用分布式緩存,必須安裝軟件包Microsoft.Extensions.Caching.Redis。第一步是在Startup.class中配置服務(wù)?[6]

        public void ConfigureServices(IServiceCollection services){  // Add framework services.  // ... altri servizi ...     services.AddDistributedRedisCache(cfg =>   {    cfg.Configuration = Configuration.GetConnectionString("redis");  });}

        如果使用的是Azure Redis緩存,則可以通過(guò)訪問(wèn)面板的“訪問(wèn)鍵”部分找到連接字符串。


        如何使用IDistributedCache

        接口IDistributedCache的使用特別簡(jiǎn)單:如果您已經(jīng)閱讀了有關(guān)接口IMemoryCache的使用的文章,那么您將在命令中找到幾點(diǎn)。如果要在控制器中使用它,則需要首先將實(shí)例注入構(gòu)造函數(shù)中,如下面的代碼所示:

        public class HomeController : Controller{    private readonly IDistributedCache _cache;     public HomeController(IDistributedCache cache)    {        _cache = cache;    }    public async Task  Index()    {        await _cache.SetStringAsync("TestString", "TestValue");         var value = _cache.GetString("TestString");         return View();    }}

        如果讓此代碼運(yùn)行,并在Index方法的最后一行插入一個(gè)斷點(diǎn),則會(huì)得到以下結(jié)果:

        我們可以使用DistributedCacheEntryOptions類輕松檢查緩存的持續(xù)時(shí)間。在下面的代碼中,我們創(chuàng)建一個(gè)實(shí)例,將持續(xù)時(shí)間設(shè)置為一小時(shí)。

        public async Task  Index(){    var options = new DistributedCacheEntryOptions    {        AbsoluteExpiration = DateTime.Now.AddHours(1)    };     await _cache.SetStringAsync("TestString", "TestValue", options);     var value = _cache.GetString("TestString");     return View();}

        ?結(jié)論與建議

        在我們的應(yīng)用中使用哪種IDistributedCache實(shí)現(xiàn)的決定取決于某些因素。在Redis和SQL之間進(jìn)行選擇(我將內(nèi)存實(shí)現(xiàn)僅保留在測(cè)試和開(kāi)發(fā)中,所以我將其保留在外)應(yīng)該基于對(duì)您可用的基礎(chǔ)結(jié)構(gòu),性能要求和開(kāi)發(fā)團(tuán)隊(duì)的經(jīng)驗(yàn)進(jìn)行選擇。

        如果團(tuán)隊(duì)對(duì)Redis感到放心,這將是最佳選擇。SQL實(shí)現(xiàn)仍然是一個(gè)很好的解決方案,但應(yīng)記住,數(shù)據(jù)恢復(fù)時(shí)將不會(huì)提供出色的性能,因此應(yīng)謹(jǐn)慎選擇要緩存的數(shù)據(jù)。

        瀏覽 72
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            性色av蜜臀av高清久久苏然 | 啊啊啊好大好舒服视频 | 久久久免费精品 | 北条麻妃办公室性爱 | 美女h视频| 特级西西444www大胆高清图片 | 精品一区二区三区免费观看 | 日韩AV一区二区三区四区 | 狠狠色噜噜狠狠狠狠色综合久97 | 欧美丰满少妇bbbbbb |