成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

.NET中的緩存實現

存儲 存儲軟件
軟件開發中最常用的模式之一是緩存,這是一個簡單但非常有效的概念,想法是重用操作結果,執行繁重的操作時,我們會將結果保存在緩存容器中,下次我們需要該結果時,我們將從緩存容器中取出它,而不是再次執行繁重的操作。

 軟件開發中最常用的模式之一是緩存,這是一個簡單但非常有效的概念,想法是重用操作結果,執行繁重的操作時,我們會將結果保存在緩存容器中,下次我們需要該結果時,我們將從緩存容器中取出它,而不是再次執行繁重的操作。

例如,要獲得某人的頭像,您可能需要前往數據庫。我們不會每次都執行那次查詢,而是將結果保存在緩存中,每次需要時都將其從內存中刪除。

緩存非常適合不經常更改的數據,甚至永遠不會改變。不斷變化的數據不適合緩存,如當前機器的時間不應緩存,否則您將得到錯誤的結果。

[[269436]]

進程內緩存,持久化緩存和分布式緩存

  • 進程內緩存用于在單個進程中實現緩存時,當進程終止時,緩存會隨之消失。如果您在多個服務器上運行相同的進程,則每個服務器都有一個單獨的緩存。
  • 持久化緩存是指在進程內存之外備份緩存,它可能位于文件中,也可能位于數據庫中。這實現比較困難,但如果重新啟動進程,緩存不會丟失。
  • 分布式緩存是指您為多臺計算機提供共享緩存,通常它將是幾個服務器,使用分布式緩存,它存儲在外部服務中。這意味著如果一臺服務器保存了緩存項,其他服務器也可以使用它。像Redis這樣的服務非常適合這種情況。

單線程的緩存

 

這個簡單的代碼解決了一個關鍵問題,要獲取test的值,只有***個請求才會實際執行數據庫操作,然后將數據保存在進程存儲器中,以后有關test的請求都將從內存中提取,從而節省時間和資源。

但是,作為編程中的大多數事情,沒有什么是如此簡單。由于許多原因,上述解決方案并不好。首先,這種實現不是線程安全的,多個線程使用時可能會發生異常,除此之外,緩存的項目將永遠留在內存中,這實際上非常糟糕。

例如:

 

運行結果7234859,運行 的數據丟失了

這就是為什么我們應該從Cache中刪除項目:

  1. 緩存可能占用大量內存,最終導致內存不足異常和崩潰。
  2. 高內存消耗可導致GC壓力(又稱內存壓力)。在這種狀態下,垃圾收集器的工作量超出預期,會影響性能。
  3. 如果數據發生更改,可能需要刷新緩存,我們的緩存基礎架構應該支持這種能力。

為了處理這些問題,緩存框架具有驅逐策略(即刪除策略),這些是根據某些邏輯從緩存中刪除項目的規則,常見的驅逐政策是:

  • 絕對過期策略將在一段固定的時間后從緩存中刪除一個項目。
  • 如果未在固定的時間內訪問項目,則滑動過期策略將從緩存中刪除項目。因此,如果我將到期時間設置為1分鐘,只要我每隔30秒使用一次,該項目就會保持在緩存中,一旦我不使用它超過一分鐘,該項目被驅逐。
  • 大小限制策略將限制高速緩存大小。

現在我們知道了我們需要什么,讓我們繼續尋找更好的解決方案。

改善方案

令我非常沮喪的是,作為博主,微軟已經創建了一個很棒的緩存實現,這剝奪了我自己創建類似實現的樂趣,但至少我寫這篇博文的工作較少。

我將向您展示Microsoft的解決方案,如何有效地使用它,以及如何在某些情況下改進它。

System.Runtime.Caching / MemoryCache與Microsoft.Extensions.Caching.Memory

微軟有2個解決方案,2個不同的NuGet包用于緩存,兩者都很棒,根據微軟的建議,更喜歡使用Microsoft.Extensions.Caching.Memory因為它與Asp更好地集成.NET核心。它可以很容易地注入到Asp .NET Core的依賴注入機制中。

這是一個基本的例子Microsoft.Extensions.Caching.Memory:

 

這與我自己非常相似NaiveCache,所以改變了什么?嗯,首先,這是一個線程安全的實現。您可以安全地從多個線程一次調用它。

帶有逐出政策的IMemoryCache:

 

讓我們分析一下新增內容:

  1. SizeLimit加入了MemoryCacheOptions,這會將基于大小的策略添加到緩存容器中。相反,我們需要在每個緩存條目上設置大小,在這種情況下,我們每次設置為1 SetSize(1),這意味著緩存限制為1024個項目。
  2. 當我們達到大小限制時,應該刪除哪個緩存項?您實際上可以設置優先級.SetPriority(CacheItemPriority.High)。級別為Low,Normal,High和NeverRemove。
  3. SetSlidingExpiration(TimeSpan.FromSeconds(2))添加了,將滑動到期時間設置為2秒,這意味著如果超過2秒內未訪問某個項目,它將被刪除。
  4. SetAbsoluteExpiration(TimeSpan.FromSeconds(10))添加了,它將絕對到期時間設置為10秒,這意味著如果物品尚未在10秒內被驅逐。

除了示例中的選項之外,您還可以設置一個RegisterPostEvictionCallback委托,當項目被驅逐時將調用該委托。

這是一個非常全面的功能集。它讓你想知道是否還有其他東西要添加,實際上有幾件事。

問題和缺失的功能

這個實現中有幾個重要的缺失部分。

  1. 雖然您可以設置大小限制,但緩存實際上并不監視gc壓力。如果我們確實對其進行監控,我們可以在壓力較大時收緊政策,并在壓力較低時放松政策。
  2. 當同時請求具有多個線程的相同項時,請求不等待***個完成,該項目將被多次創建。例如,假設我們正在緩存阿凡達,從數據庫中獲取頭像需要10秒鐘,如果我們在***次請求后2秒請求頭像,它將檢查頭像是否被緩存(它還沒有),并開始另一次訪問數據庫。

英文原文中有說明,但是覺得不太好,再次沒有翻譯。

英文原文地址:

https://michaelscodingspot.com/cache-implementations-in-csharp-net/?utm_source=csharpdigest&utm_medium=web&utm_campaign=featured

代碼與所寫有所修改,但是大致意思一樣,如果感興趣,可以看看英文。

責任編輯:武曉燕 來源: 零度編程
相關推薦

2021-09-13 07:00:01

C# .NET 緩存

2009-07-20 15:39:32

ASP.NET緩存

2024-12-05 08:31:10

2020-01-14 08:00:00

.NET緩存編程語言

2009-07-29 15:34:13

2009-07-29 11:44:30

ASP.NET緩存Cache

2024-10-15 16:01:19

SpringBoot緩存預熱

2024-07-01 12:42:58

2009-07-31 10:23:44

緩存頁面ASP.NET緩存

2009-01-04 13:27:10

URL RewriteIISASP.NET

2009-08-04 14:44:40

callback實現機ASP.NET2.0

2024-05-31 13:07:29

.NET Core定時任務編程

2009-08-03 18:47:12

ASP.NET數據緩存

2009-11-09 08:53:21

ASP.NET緩存

2009-07-28 15:29:03

實現HTTP請求ASP.NET

2009-07-29 10:35:51

ASP.NET緩存

2009-07-31 10:33:54

ASP.NET頁面輸出

2009-08-04 15:22:33

ASP.NET緩存機制

2009-07-29 14:35:34

頁面輸出緩存ASP.NET

2009-08-13 16:57:37

.NET緩存機制
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区精品 | 久久精品视频在线播放 | 午夜久久久久久久久久一区二区 | 久久国产精品精品国产色婷婷 | 欧美a∨| 日本成人在线免费视频 | 欧美日韩精品久久久免费观看 | 精品一区二区三区在线观看国产 | 色欧美综合 | 色婷婷综合久久久中字幕精品久久 | 国产精品1区2区 | 亚洲最大的成人网 | 97色在线观看免费视频 | 免费视频一区 | 国产高清视频 | 欧美另类视频在线 | 成人做爰999 | 亚洲精品久久久一区二区三区 | 日韩视频在线观看 | 中文字幕精品一区 | 精品久久久久久久久久久 | 亚洲精品自在在线观看 | 日韩a在线| 中文字幕一区二区三 | aaaaa毛片 | 成人一区二区在线 | 久久久久久久久久久久亚洲 | 亚洲欧美中文日韩在线v日本 | 一区在线播放 | 中文字幕一区二区三区四区 | 精品99在线| 伊人焦久影院 | 天天爱天天操 | 日韩一区二区三区在线播放 | 九九导航| 日本三级在线 | 亚洲人成人一区二区在线观看 | 日本视频中文字幕 | 人人操日日干 | 日本字幕在线观看 | 国产午夜高清 |