有關快取的一些內容

2021-09-12 09:37:09 字數 1648 閱讀 3649

快取的過期時間問題:設計快取的過期時間需要非常的有技巧,且必須與業務實際情況相結合。因為如果設計的過期時間太短了,那會導致快取效果不佳,且還會造成頻繁的從資料庫中往快取裡寫資料。如果快取設計的過期時間太長了,又會導致記憶體的浪費。

快取的命中率問題:這也是設計快取中需要存放哪些資料的很重要一點,如果設計的不好,可能會導致快取命中率過低,失去快取效果。一般對於熱點資料而言,要保證命中率達到70%以上效果最佳。

快取的穿透/雪崩問題:是指如果快取服務一旦宕機或全部丟失,那麼有可能一瞬間所有的流量都直接打到了後端資料庫上,可能會造成連鎖反應,瞬間的請求高峰極有可能導致資料庫無法承載。

典型的快取模式,一般有如下幾種:

cache aside

read/write through

write behind

應用在查詢資料的時候,先從快取cache中讀取資料,如果快取中沒有,則再從資料庫中讀取資料,得到資料庫的資料之後,將這個資料也放到快取cache中。

如果應用要更新某個資料,也是先去更新資料庫中的資料,更新完成之後,則通過指令讓快取cache中的資料失效。

這裡為什麼不讓更新操作在寫完資料庫之後,緊接著去把快取cache中的資料也修改了呢?

主要是因為這樣做的話,就有2個寫操作的事件了,擔心在併發的情況下會導致髒資料,舉個例子:假如同時有2個請求,請求a和請求b,併發的執行。請求a是要去讀資料,請求b是要去更新資料。初始狀態快取中是沒有資料的,當請求a讀到資料之後,準備往回寫的時候,此刻,請求b正好要更新資料,更新完了資料庫之後,又去把快取更新了,那請求a再往快取中寫的就是舊資料了,屬於髒資料。

那麼 cache aside 模式就沒有髒資料問題了嗎?不是的,在極端情況下也可能會產生髒資料,比如:

假如同時有2個請求,請求a和請求b,併發的執行。請求a是要去讀資料,請求b是要去寫資料。假如初始狀態快取中沒有這個資料,那請求a發現快取中沒有資料,就會去資料庫中讀資料,讀到了資料準備寫回快取中,就在這個時候,請求b是要去寫資料的,請求b在寫完資料庫的資料之後,又去設定了快取失效。這個時候,請求a由於在資料庫中讀到了之前的舊資料,開始往快取中寫資料了,此時寫進入的就也是舊資料。那麼最終就會導致,快取中的資料與資料庫的資料不一致,造成了髒資料。

不過這種概率比上面一種概率要小很多。所以整體而言 cache aside 模式 還是一種比較簡單實用的方式。

這個模式其實就是將 快取服務 作為主要的儲存,應用的所有讀寫請求都是直接與快取服務打交道,而不管最後端的資料庫了,資料庫的資料由快取服務來維護和更新。不過快取中資料變更的時候是同步去更新資料庫的,在應用的眼中只有快取服務。

流程就相當簡單了:

應用要讀資料和更新資料都直接訪問快取服務

快取服務同步的將資料更新到資料庫

這個模式出現髒資料的概率就比較低,但是就強依賴快取了,對快取服務的穩定性有較大要求,另外,增加新快取節點時還會有初始狀態空資料問題。

這個模式就是 read/write through 模式 的乙個變種。區別就是 read/write through 模式的快取寫資料庫的時候是同步的,而 write behind 模式 的快取運算元據庫是非同步的。

流程如下:

應用要讀資料和更新資料都直接訪問快取服務

快取服務非同步的將資料更新到資料庫(通過非同步任務)

這個模式的特點就是速度很快,效率會非常高,但是資料的一致性比較差,還可能會有資料的丟失情況,實現邏輯也較為複雜。

一些有關PAT乙級考試的內容

1.判斷素數 bool isprime int n 2.解決執行超時問題 1 把cin換為scanf 把cout換為printf 2 在輸入之前加上std ios sync with stdio false 語句 方法 1 和方法 2 不能同時使用。3.大寫字母轉化為小寫字母 string func...

有關鉤子的一些東西

前段時間開始轉型用vc7寫東西,做了些東西,感覺vc7的智慧型感應確實比vc6要好用很多,某天,打算用vc7做個鉤子程式,於是先把以前用vc6做的乙個程式在vc7裡重寫一遍,結果一呼叫就提示嚴重錯誤.很奇怪,看了看鉤子的那個類,似乎沒什麼錯,在裝鉤子的函式裡加了個messagebox,再呼叫,發現可...

有關前端的一些看法

前端難道就是js嗎?最後我的答案 是的,如果你想成為純粹意義上的前端,js很大部分上代表了前端。如果你確定你想做乙個優秀的前端,我的個人建議 首先,了解http協議 http 1.1 玩弄各大瀏覽器於鼓掌之中,你是前端工程師不要跟我說你只知道ie核心的瀏覽器。ie系列,firefox,chrome,...