自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

.NET中的緩存實(shí)現(xiàn)

存儲(chǔ) 存儲(chǔ)軟件
軟件開(kāi)發(fā)中最常用的模式之一是緩存,這是一個(gè)簡(jiǎn)單但非常有效的概念,想法是重用操作結(jié)果,執(zhí)行繁重的操作時(shí),我們會(huì)將結(jié)果保存在緩存容器中,下次我們需要該結(jié)果時(shí),我們將從緩存容器中取出它,而不是再次執(zhí)行繁重的操作。

 軟件開(kāi)發(fā)中最常用的模式之一是緩存,這是一個(gè)簡(jiǎn)單但非常有效的概念,想法是重用操作結(jié)果,執(zhí)行繁重的操作時(shí),我們會(huì)將結(jié)果保存在緩存容器中,下次我們需要該結(jié)果時(shí),我們將從緩存容器中取出它,而不是再次執(zhí)行繁重的操作。

例如,要獲得某人的頭像,您可能需要前往數(shù)據(jù)庫(kù)。我們不會(huì)每次都執(zhí)行那次查詢,而是將結(jié)果保存在緩存中,每次需要時(shí)都將其從內(nèi)存中刪除。

緩存非常適合不經(jīng)常更改的數(shù)據(jù),甚至永遠(yuǎn)不會(huì)改變。不斷變化的數(shù)據(jù)不適合緩存,如當(dāng)前機(jī)器的時(shí)間不應(yīng)緩存,否則您將得到錯(cuò)誤的結(jié)果。

[[269436]]

進(jìn)程內(nèi)緩存,持久化緩存和分布式緩存

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

單線程的緩存

 

這個(gè)簡(jiǎn)單的代碼解決了一個(gè)關(guān)鍵問(wèn)題,要獲取test的值,只有***個(gè)請(qǐng)求才會(huì)實(shí)際執(zhí)行數(shù)據(jù)庫(kù)操作,然后將數(shù)據(jù)保存在進(jìn)程存儲(chǔ)器中,以后有關(guān)test的請(qǐng)求都將從內(nèi)存中提取,從而節(jié)省時(shí)間和資源。

但是,作為編程中的大多數(shù)事情,沒(méi)有什么是如此簡(jiǎn)單。由于許多原因,上述解決方案并不好。首先,這種實(shí)現(xiàn)不是線程安全的,多個(gè)線程使用時(shí)可能會(huì)發(fā)生異常,除此之外,緩存的項(xiàng)目將永遠(yuǎn)留在內(nèi)存中,這實(shí)際上非常糟糕。

例如:

 

運(yùn)行結(jié)果7234859,運(yùn)行 的數(shù)據(jù)丟失了

這就是為什么我們應(yīng)該從Cache中刪除項(xiàng)目:

  1. 緩存可能占用大量?jī)?nèi)存,最終導(dǎo)致內(nèi)存不足異常和崩潰。
  2. 高內(nèi)存消耗可導(dǎo)致GC壓力(又稱內(nèi)存壓力)。在這種狀態(tài)下,垃圾收集器的工作量超出預(yù)期,會(huì)影響性能。
  3. 如果數(shù)據(jù)發(fā)生更改,可能需要刷新緩存,我們的緩存基礎(chǔ)架構(gòu)應(yīng)該支持這種能力。

為了處理這些問(wèn)題,緩存框架具有驅(qū)逐策略(即刪除策略),這些是根據(jù)某些邏輯從緩存中刪除項(xiàng)目的規(guī)則,常見(jiàn)的驅(qū)逐政策是:

  • 絕對(duì)過(guò)期策略將在一段固定的時(shí)間后從緩存中刪除一個(gè)項(xiàng)目。
  • 如果未在固定的時(shí)間內(nèi)訪問(wèn)項(xiàng)目,則滑動(dòng)過(guò)期策略將從緩存中刪除項(xiàng)目。因此,如果我將到期時(shí)間設(shè)置為1分鐘,只要我每隔30秒使用一次,該項(xiàng)目就會(huì)保持在緩存中,一旦我不使用它超過(guò)一分鐘,該項(xiàng)目被驅(qū)逐。
  • 大小限制策略將限制高速緩存大小。

現(xiàn)在我們知道了我們需要什么,讓我們繼續(xù)尋找更好的解決方案。

改善方案

令我非常沮喪的是,作為博主,微軟已經(jīng)創(chuàng)建了一個(gè)很棒的緩存實(shí)現(xiàn),這剝奪了我自己創(chuàng)建類似實(shí)現(xiàn)的樂(lè)趣,但至少我寫(xiě)這篇博文的工作較少。

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

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

微軟有2個(gè)解決方案,2個(gè)不同的NuGet包用于緩存,兩者都很棒,根據(jù)微軟的建議,更喜歡使用Microsoft.Extensions.Caching.Memory因?yàn)樗cAsp更好地集成.NET核心。它可以很容易地注入到Asp .NET Core的依賴注入機(jī)制中。

這是一個(gè)基本的例子Microsoft.Extensions.Caching.Memory:

 

這與我自己非常相似NaiveCache,所以改變了什么?嗯,首先,這是一個(gè)線程安全的實(shí)現(xiàn)。您可以安全地從多個(gè)線程一次調(diào)用它。

帶有逐出政策的IMemoryCache:

 

讓我們分析一下新增內(nèi)容:

  1. SizeLimit加入了MemoryCacheOptions,這會(huì)將基于大小的策略添加到緩存容器中。相反,我們需要在每個(gè)緩存條目上設(shè)置大小,在這種情況下,我們每次設(shè)置為1 SetSize(1),這意味著緩存限制為1024個(gè)項(xiàng)目。
  2. 當(dāng)我們達(dá)到大小限制時(shí),應(yīng)該刪除哪個(gè)緩存項(xiàng)?您實(shí)際上可以設(shè)置優(yōu)先級(jí).SetPriority(CacheItemPriority.High)。級(jí)別為L(zhǎng)ow,Normal,High和NeverRemove。
  3. SetSlidingExpiration(TimeSpan.FromSeconds(2))添加了,將滑動(dòng)到期時(shí)間設(shè)置為2秒,這意味著如果超過(guò)2秒內(nèi)未訪問(wèn)某個(gè)項(xiàng)目,它將被刪除。
  4. SetAbsoluteExpiration(TimeSpan.FromSeconds(10))添加了,它將絕對(duì)到期時(shí)間設(shè)置為10秒,這意味著如果物品尚未在10秒內(nèi)被驅(qū)逐。

除了示例中的選項(xiàng)之外,您還可以設(shè)置一個(gè)RegisterPostEvictionCallback委托,當(dāng)項(xiàng)目被驅(qū)逐時(shí)將調(diào)用該委托。

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

問(wèn)題和缺失的功能

這個(gè)實(shí)現(xiàn)中有幾個(gè)重要的缺失部分。

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

英文原文中有說(shuō)明,但是覺(jué)得不太好,再次沒(méi)有翻譯。

英文原文地址:

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

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

責(zé)任編輯:武曉燕 來(lái)源: 零度編程
相關(guān)推薦

2021-09-13 07:00:01

C# .NET 緩存

2024-12-05 08:31:10

2009-07-20 15:39:32

ASP.NET緩存

2024-10-15 16:01:19

SpringBoot緩存預(yù)熱

2024-07-01 12:42:58

2020-01-14 08:00:00

.NET緩存編程語(yǔ)言

2009-07-29 15:34:13

2009-07-29 11:44:30

ASP.NET緩存Cache

2009-07-31 10:23:44

緩存頁(yè)面ASP.NET緩存

2009-01-04 13:27:10

URL RewriteIISASP.NET

2009-08-04 14:44:40

callback實(shí)現(xiàn)機(jī)ASP.NET2.0

2024-05-31 13:07:29

.NET Core定時(shí)任務(wù)編程

2009-08-03 18:47:12

ASP.NET數(shù)據(jù)緩存

2009-11-09 08:53:21

ASP.NET緩存

2009-07-28 15:29:03

實(shí)現(xiàn)HTTP請(qǐng)求ASP.NET

2011-02-24 12:53:51

.NET異步傳統(tǒng)

2009-12-21 10:05:10

ASP.NET MVC

2025-02-17 00:00:55

NET開(kāi)發(fā)依賴注入

2009-03-13 09:48:33

ASP.NETAjaxJQuery

2009-07-29 10:35:51

ASP.NET緩存
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)