<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          ASP.NET Core中的分布式緩存

          共 3872字,需瀏覽 8分鐘

           ·

          2020-07-28 18:36

          ASP.NET Core中的分布式緩存

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

          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)中使用的接口,則可能會注意到一些相似之處,但甚至有很多區(qū)別,例如:

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

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

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

          分布式內存緩存

          該實現(xiàn)由框架提供,并將我們的數(shù)據(jù)保存在內存中。它不是完全分布式的緩存,因為數(shù)據(jù)是從應用程序實例保存在其所在的服務器上的。在某些情況下可能會有用:

          ?開發(fā)與測試?在生產(chǎn)中使用單個服務器時,內存消耗不是問題。

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

          `services.AddDistributedMemoryCache();`

          分布式SQL Server緩存

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

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

          ?

          允許創(chuàng)建具有以下結構的表:

          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]

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

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

          分布式Redis緩存

          在分布式緩存場景中,Redis的使用非常廣泛。Redis是一個快速存儲的數(shù)據(jù)存儲,它是開源的并且是鍵值類型。它提供的響應時間不到1毫秒,從而允許在各個領域中的每個實時應用程序每秒接收數(shù)百萬個請求。如果您的應用程序的基礎結構基于Azure云,則可以使用服務Azure Redis緩存,并且可以從您的訂閱中對其進行配置。

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

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

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


          如何使用IDistributedCache

          接口IDistributedCache的使用特別簡單:如果您已經(jīng)閱讀了有關接口IMemoryCache的使用的文章,那么您將在命令中找到幾點。如果要在控制器中使用它,則需要首先將實例注入構造函數(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();    }}

          如果讓此代碼運行,并在Index方法的最后一行插入一個斷點,則會得到以下結果:

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

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

          ?結論與建議

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

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

          瀏覽 72
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲国产综合视频 | 国产精品久久久久久成人 | 性猛交XXXXX富婆免费视频 | 国产足交在线观看 | 亚洲天堂电影 |