您的位置:首頁(yè) > 軟件教程 > 教程 > 緩存應(yīng)用和淘汰機(jī)制的原理和實(shí)現(xiàn)

緩存應(yīng)用和淘汰機(jī)制的原理和實(shí)現(xiàn)

來(lái)源:好特整理 | 時(shí)間:2024-06-20 11:56:46 | 閱讀:197 |  標(biāo)簽: 淘 S 應(yīng)用   | 分享到:

1、緩存應(yīng)用 一個(gè)系統(tǒng)中不同層面數(shù)據(jù)訪問(wèn)速度不一樣,以計(jì)算機(jī)為例,CPU、內(nèi)存和磁盤這三層的訪問(wèn)速度從幾十 ns 到 100ns,再到幾 ms,性能的差異很大,如果每次 CPU 處理數(shù)據(jù)時(shí)都要到磁盤讀取數(shù)據(jù),系統(tǒng)運(yùn)行速度會(huì)大大降低。 所以,計(jì)算機(jī)系統(tǒng)中,默認(rèn)有兩種緩存: (1)CPU 里面的末級(jí)緩存

緩存應(yīng)用

緩存系統(tǒng)在計(jì)算機(jī)中非常重要,因?yàn)椴煌瑢蛹?jí)的數(shù)據(jù)訪問(wèn)速度差異很大。CPU、內(nèi)存和磁盤的訪問(wèn)速度從幾十納秒到幾毫秒不等。為了避免每次CPU處理數(shù)據(jù)都需從磁盤讀取數(shù)據(jù),系統(tǒng)會(huì)大大降低運(yùn)行速度。為了解決這一問(wèn)題,計(jì)算機(jī)系統(tǒng)中默認(rèn)有兩種緩存:CPU中的末級(jí)緩存(LLC)用于緩存內(nèi)存中的數(shù)據(jù),避免每次從內(nèi)存中存取數(shù)據(jù),內(nèi)存中的高速頁(yè)緩存(page cache)用于緩存磁盤中的數(shù)據(jù),避免每次從磁盤中存取數(shù)據(jù)。

緩存應(yīng)用和淘汰機(jī)制的原理和實(shí)現(xiàn)

在層次化的系統(tǒng)中,緩存是一個(gè)快速子系統(tǒng),在數(shù)據(jù)存在緩存中時(shí),能夠避免每次從慢速子系統(tǒng)中存取數(shù)據(jù)。在互聯(lián)網(wǎng)應(yīng)用中,Redis被視為快速子系統(tǒng),而數(shù)據(jù)庫(kù)則是慢速子系統(tǒng)。Redis是一個(gè)獨(dú)立的系統(tǒng)軟件,如果應(yīng)用程序想使用Redis緩存,就需要增加相應(yīng)的代碼。因此,Redis也被稱為旁路緩存,即讀取緩存、讀取數(shù)據(jù)庫(kù)和更新緩存的操作都需要在應(yīng)用程序中完成。Redis緩存根據(jù)是否接受寫請(qǐng)求,分為只讀緩存和讀寫緩存兩種類型。只讀緩存能夠加速讀請(qǐng)求,而讀寫緩存可以同時(shí)加速讀寫請(qǐng)求。讀寫緩存又分為同步直寫和異步寫回,可以根據(jù)業(yè)務(wù)需求在保證性能和數(shù)據(jù)可靠性之間進(jìn)行選擇。

淘汰機(jī)制

緩存的容量是有限的,需要按一定規(guī)則淘汰數(shù)據(jù)以騰出空間,提高緩存命中率,提升應(yīng)用的訪問(wèn)性能。緩存容量的規(guī)劃通常需要綜合考慮應(yīng)用數(shù)據(jù)實(shí)際訪問(wèn)特征和成本開銷,建議把緩存容量設(shè)置為總數(shù)據(jù)量的15%到30%。對(duì)容量的設(shè)置可以通過(guò)命令CONFIG SET maxmemory 4gb來(lái)進(jìn)行設(shè)置。同時(shí),Redis提供8種淘汰策略:noeviction、volatile-random、volatile-ttl、volatile-lru、volatile-lfu、allkeys-lru、allkeys-random和allkeys-lfu。

緩存應(yīng)用和淘汰機(jī)制的原理和實(shí)現(xiàn)

這些策略大體可以分為兩類,其中noeviction(不淘汰數(shù)據(jù))表示當(dāng)緩存已經(jīng)被寫滿時(shí)再有寫請(qǐng)求時(shí)Redis不再提供服務(wù),直接返回錯(cuò)誤。另外7種策略按一定范圍對(duì)緩存數(shù)據(jù)進(jìn)行淘汰,針對(duì)設(shè)置過(guò)期時(shí)間的數(shù)據(jù)進(jìn)行淘汰以及對(duì)所有數(shù)據(jù)進(jìn)行淘汰。具體包括volatile-ttl,volatile-rando,volatile-lru,volatile-lfu,allkeys-random,allkeys-lru和allkeys-lfu。LRU算法

LRU算法

LRU算法全稱Least Recently Used,按照最近最少使用的原則來(lái)篩選數(shù)據(jù),把最不常用的數(shù)據(jù)淘汰出去,而最近頻繁使用的數(shù)據(jù)會(huì)留在緩存中。LRU會(huì)把所有的數(shù)據(jù)組織成一個(gè)鏈表,鏈表的頭和尾分別表示MRU端和LRU端,分別代表最近最常使用的數(shù)據(jù)和最近最不常用的數(shù)據(jù)。LRU算法在實(shí)際實(shí)現(xiàn)時(shí),需要用鏈表管理所有的緩存數(shù)據(jù),并對(duì)被訪問(wèn)的數(shù)據(jù)進(jìn)行鏈表移動(dòng)操作。為了減輕數(shù)據(jù)淘汰對(duì)緩存性能的影響,Redis默認(rèn)會(huì)記錄每個(gè)數(shù)據(jù)的最近一次訪問(wèn)的時(shí)間戳(由鍵值對(duì)數(shù)據(jù)結(jié)構(gòu)RedisObject中的lru字段記錄)。 Redis在需要選擇淘汰的數(shù)據(jù)時(shí),首先會(huì)隨機(jī)選擇N個(gè)數(shù)據(jù)將它們作為一個(gè)候選集合,并比較它們的lru字段,最后淘汰lru字段最小的數(shù)據(jù)。淘汰數(shù)據(jù)時(shí),Redis也會(huì)再隨機(jī)選擇一些lru字段比候選集合中最小lru字段還要小的數(shù)據(jù),將它們放入候選集,如果候選集的數(shù)據(jù)個(gè)數(shù)達(dá)到了maxmemory-sample配置的個(gè)數(shù),Redis就開始將lru字段值最小的數(shù)據(jù)淘汰。

LFU算法

LFU策略增加了一個(gè)計(jì)數(shù)器用以統(tǒng)計(jì)訪問(wèn)次數(shù)。淘汰數(shù)據(jù)時(shí),首先會(huì)根據(jù)數(shù)據(jù)的訪問(wèn)次數(shù)進(jìn)行篩選,把訪問(wèn)次數(shù)最低的數(shù)據(jù)淘汰出緩存。如果兩個(gè)數(shù)據(jù)的訪問(wèn)次數(shù)相同,則再比較這兩個(gè)數(shù)據(jù)的訪問(wèn)時(shí)效性,把距離上一次訪問(wèn)時(shí)間更久的數(shù)據(jù)淘汰出緩存。在實(shí)現(xiàn)LFU策略時(shí),Redis把原來(lái)24bit大小的lru字段拆分成了兩部分:ldt值和counter值。counter只有8bit,記錄的最大值是255。因此,LFU策略采用了一個(gè)非線性遞增的計(jì)數(shù)規(guī)則,通過(guò)配置不同的lfu_log_factor控制計(jì)數(shù)器值的增加速度。此外,Redis還設(shè)計(jì)了一個(gè)counter值的衰減機(jī)制,通過(guò)配置衰減因子lfu_decay_time來(lái)控制訪問(wèn)次數(shù)的衰減。具體操作是計(jì)算當(dāng)前時(shí)間和數(shù)據(jù)最近一次訪問(wèn)時(shí)間的差值,再換算成分鐘單位,再除以lfu_decay_time值,就是數(shù)據(jù)counter要衰減的值。

緩存應(yīng)用和淘汰機(jī)制的原理和實(shí)現(xiàn)

小編推薦閱讀

好特網(wǎng)發(fā)布此文僅為傳遞信息,不代表好特網(wǎng)認(rèn)同期限觀點(diǎn)或證實(shí)其描述。

相關(guān)視頻攻略

更多

掃二維碼進(jìn)入好特網(wǎng)手機(jī)版本!

掃二維碼進(jìn)入好特網(wǎng)微信公眾號(hào)!

本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]

湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)