首頁技術(shù)文章正文

redis緩存原理與實現(xiàn):為什么redis可以做緩存?【python面試題】

更新時間:2020-11-30 來源:黑馬程序員 瀏覽量:

1577370495235_學(xué)IT就到黑馬程序員.gif

為什么redis可以做緩存?

(1)問題分析

這個題目考得是你對redis的理解,他能做緩存的原因是什么,回答時主要回答redis的優(yōu)點。

(2)核心問題講解

1)Redis將其數(shù)據(jù)完全保存在內(nèi)存中,僅使用磁盤進(jìn)行持久化。與其它鍵值數(shù)據(jù)存儲相比,Redis有一組相對豐富的數(shù)據(jù)類型。Redis可以將數(shù)據(jù)復(fù)制到任意數(shù)量的從機中。

2)異???- Redis非常快,每秒可執(zhí)行大約110000次的設(shè)置(SET)操作,每秒大約可執(zhí)行81000次的讀取/獲取(GET)操作。支持豐富的數(shù)據(jù)類型 - Redis支持開發(fā)人員常用的大多數(shù)數(shù)據(jù)類型 ,例如列表,集合,排序集和散列等等。這使得Redis很容易被用來解決各種問題,因為我們知道哪些問題可以更好使用地哪些數(shù)據(jù)類型來處理解決。

3)操作具有原子性 - 所有Redis操作都是原子操作,這確保如果兩個客戶端并發(fā)訪問,Redis服務(wù)器能接收更新的值。

4)Redis是一個內(nèi)存數(shù)據(jù)庫,但在磁盤數(shù)據(jù)庫上是持久的,因此它代表了一個不同的權(quán)衡,在這種情況下,在不能大于存儲器(內(nèi)存)的數(shù)據(jù)集的限制下實現(xiàn)非常高的寫和讀速度

5)redis支持多種數(shù)據(jù)結(jié)構(gòu),Redis不僅僅支持簡單的k/v類型的數(shù)據(jù),同時還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲

6)Redis支持master-slave(主-從)模式應(yīng)用

7)Redis單個value的最大限制是1GB,memcached只能保存1MB的數(shù)據(jù)。

(3)問題拓展

1)Redis和memcached的比較

Redis的優(yōu)勢是

Redis支持的數(shù)據(jù)類型比memcached豐富,memcached只有一種(字符串)

Redis可以持久化數(shù)據(jù)

redis中能存儲的數(shù)據(jù)量大

2)redis提供了三種緩存數(shù)據(jù)淘汰機制,LFU,LRU,TTL

LFU,least frequently used,即最小使用頻率淘汰,每個對象使用共計24bit空間用來實施這個算法,24bit分成2個部分,前16bit用來記錄上次減少時間(減少的是后面8bit計數(shù)器),后面8個bit是一個對數(shù)計數(shù)器,用來記錄這個對象的訪問次數(shù)。需要注意的是,這個字段不是一直增加的,也需要減少,否則會出現(xiàn)一個情況,一個對象很久之前被頻繁的使用,但是最近沒有被使用,若這個值不減少的話,那么這個對象會一直處在一個不會被淘汰的位置。前面16bit的作用就是,記錄一個“減量時間”,這是一個降低精度的Unix時間,將16bit的時間轉(zhuǎn)換成分鐘,不關(guān)心回繞問題。若這個時間很大,那么8bit計數(shù)器的值減半,否則只是簡單的每次遞減1

LRU,last recently used,即最近最少使用淘汰,一般做法是,將hash表的value做成一個指針,指向一個雙鏈表節(jié)點,節(jié)點中保存實際的value,雙鏈表按照上次訪問時間降序排列,當(dāng)訪問到一個對象之后,更新訪問時間,并將這個節(jié)點移動到表頭,若節(jié)點不存在就直接插入到表頭。當(dāng)內(nèi)存門限達(dá)到的時候,從鏈表尾開始刪除若干entry。redis為了減少內(nèi)存使用,不使用雙鏈表或其他結(jié)構(gòu)管理對象,采用隨機算法,每次從hash表中隨機選擇一些key,一般是5個,將這些key存入一個全局的池,池大小一般是16,池中entry按照上次訪問時間降序排列,每次從池中選擇尾部的entry,就是最差的對象,將這個對象淘汰

TTL,即生存時間,按照生存時間設(shè)置一個對象的生命周期,一個對象生命周期結(jié)束之后將其銷毀

(4)在項目中的使用

我們在廣告數(shù)據(jù)、solr中搜索的品牌、規(guī)格數(shù)據(jù)以及購物車?yán)锩娑际怯眠^redis,結(jié)合spring來使用,springDataRedis。


猜你喜歡

Python if判斷語句的用法詳細(xì)介紹

緩存穿透及解決方案 

Paginator進(jìn)行大數(shù)據(jù)集分頁:如何提升性能? 

Django如何進(jìn)行單元測試?

黑馬程序員Python+數(shù)據(jù)分析課程



分享到:
在線咨詢 我要報名
和我們在線交談!