redis面試知識(shí)點(diǎn)和內(nèi)存算法了解
1 關(guān)于Redis 配置說(shuō)明
1.1 關(guān)于Redis持久化的說(shuō)明
redis默認(rèn)條件下支持?jǐn)?shù)據(jù)的持久化操作. 當(dāng)redis中有數(shù)據(jù)時(shí)會(huì)定期將數(shù)據(jù)保存到磁盤(pán)中.當(dāng)Redis服務(wù)器重啟時(shí) 會(huì)根據(jù)配置文件讀取指定的持久化文件.實(shí)現(xiàn)內(nèi)存數(shù)據(jù)的恢復(fù).
1.2 持久化方式介紹
1.2.1 RDB模式
特點(diǎn):
1.RDB模式是redis的默認(rèn)的持久化策略.
2.RDB模式記錄的是Redis 內(nèi)存數(shù)據(jù)的快照. 最新的快照會(huì)覆蓋之前的內(nèi)容 所有RDB持久化文件占用空間更小 持久化的效率更高.
3.RDB模式由于是定期持久化 所以可能導(dǎo)致數(shù)據(jù)的丟失.
命令:
save 要求立即馬上持久化 同步的操作 其他的redis操作會(huì)陷入阻塞的狀態(tài).
bgsave 開(kāi)啟后臺(tái)運(yùn)行 異步的操作 由于是異步操作,所以無(wú)法保證rdb文件一定是最新的需要等待.
配置:
1.持久化文件名稱(chēng):

2.持久化文件位置
dir ./ 相對(duì)路徑的寫(xiě)法
dir /usr/local/src/redis 絕對(duì)路徑寫(xiě)法

3.RDB模式持久化策略

1.2.2 AOF模式
特點(diǎn):
1.AOF模式默認(rèn)條件下是關(guān)閉的,需要用戶(hù)手動(dòng)的開(kāi)啟
在這里插入圖片描述
2. AOF模式是異步的操作 記錄的是用戶(hù)的操作的過(guò)程 可以防止用戶(hù)的數(shù)據(jù)丟失
3. 由于AOF模式記錄的是程序的運(yùn)行狀態(tài) 所以持久化文件相對(duì)較大,恢復(fù)數(shù)據(jù)的時(shí)間長(zhǎng).需要人為的優(yōu)化持久化文件
配置:

1.2.3 關(guān)于持久化操作的總結(jié)
1.如果不允許數(shù)據(jù)丟失 使用AOF方式
2.如果追求效率 運(yùn)行少量數(shù)據(jù)丟失 采用RDB模式
3.如果既要保證效率 又要保證數(shù)據(jù) 則應(yīng)該配置redis的集群 主機(jī)使用RDB 從機(jī)使用AOF
2 關(guān)于Redis內(nèi)存策略
2.1.1 關(guān)于內(nèi)存策略的說(shuō)明
說(shuō)明:Redis數(shù)據(jù)的存儲(chǔ)都在內(nèi)存中.如果一直向內(nèi)存中存儲(chǔ)數(shù)據(jù) 必然會(huì)導(dǎo)致內(nèi)存數(shù)據(jù)的溢出.
解決方式:
盡可能為保存在redis中的數(shù)據(jù)添加超時(shí)時(shí)間.
利用算法優(yōu)化舊的數(shù)據(jù).
2.1.2 LRU算法
特點(diǎn): 最好用的內(nèi)存優(yōu)化算法.
LRU是Least Recently Used的縮寫(xiě),即最近最少使用,是一種常用的頁(yè)面置換算法,選擇最近最久未使用的頁(yè)面予以淘汰。該算法賦予每個(gè)頁(yè)面一個(gè)訪問(wèn)字段,用來(lái)記錄一個(gè)頁(yè)面自上次被訪問(wèn)以來(lái)所經(jīng)歷的時(shí)間 t,當(dāng)需淘汰一個(gè)頁(yè)面時(shí),選擇現(xiàn)有頁(yè)面中其 t 值最大的,即最近最少使用的頁(yè)面予以淘汰。
維度: 時(shí)間 T
2.1.3 LFU算法
LFU(least frequently used (LFU) page-replacement algorithm)。即最不經(jīng)常使用頁(yè)置換算法,要求在頁(yè)置換時(shí)置換引用計(jì)數(shù)最小的頁(yè),因?yàn)榻?jīng)常使用的頁(yè)應(yīng)該有一個(gè)較大的引用次數(shù)。但是有些頁(yè)在開(kāi)始時(shí)使用次數(shù)很多,但以后就不再使用,這類(lèi)頁(yè)將會(huì)長(zhǎng)時(shí)間留在內(nèi)存中,因此可以將引用計(jì)數(shù)寄存器定時(shí)右移一位,形成指數(shù)衰減的平均使用次數(shù)。
維度: 使用次數(shù)
2.1.4 RANDOM算法
隨機(jī)刪除數(shù)據(jù)
2.1.5 TTL算法
把設(shè)定了超時(shí)時(shí)間的數(shù)據(jù)將要移除的提前刪除的算法.
2.1.6 Redis內(nèi)存數(shù)據(jù)優(yōu)化
volatile-lru 設(shè)定了超時(shí)時(shí)間的數(shù)據(jù)采用lru算法
2.allkeys-lru 所有的數(shù)據(jù)采用LRU算法
3.volatile-lfu 設(shè)定了超時(shí)時(shí)間的數(shù)據(jù)采用lfu算法刪除
4.allkeys-lfu 所有數(shù)據(jù)采用lfu算法刪除
5.volatile-random 設(shè)定超時(shí)時(shí)間的數(shù)據(jù)采用隨機(jī)算法
6.allkeys-random 所有數(shù)據(jù)的隨機(jī)算法
7.volatile-ttl 設(shè)定超時(shí)時(shí)間的數(shù)據(jù)的TTL算法
8.noeviction 如果內(nèi)存溢出了 則報(bào)錯(cuò)返回. 不做任何操作. 默認(rèn)值

3 關(guān)于Redis 緩存面試題
問(wèn)題描述: 由于海量的用戶(hù)的請(qǐng)求 如果這時(shí)redis服務(wù)器出現(xiàn)問(wèn)題 則可能導(dǎo)致整個(gè)系統(tǒng)崩潰.
運(yùn)行速度:
tomcat服務(wù)器 150-250 之間 JVM調(diào)優(yōu) 1000/秒
NGINX 3-5萬(wàn)/秒
REDIS 讀 11.2萬(wàn)/秒 寫(xiě) 8.6萬(wàn)/秒 平均 10萬(wàn)/秒
3.1 緩存穿透
問(wèn)題描述: 由于用戶(hù)高并發(fā)環(huán)境下訪問(wèn) 數(shù)據(jù)庫(kù)中不存在的數(shù)據(jù)時(shí) ,容易導(dǎo)致緩存穿透.
如何解決: 設(shè)定IP限流的操作 nginx中 或者微軟服務(wù)機(jī)制 API網(wǎng)關(guān)實(shí)現(xiàn).
3.2 緩存擊穿
問(wèn)題描述: 由于用戶(hù)高并發(fā)環(huán)境下, 由于某個(gè)數(shù)據(jù)之前存在于內(nèi)存中,但是由于特殊原因(數(shù)據(jù)超時(shí)/數(shù)據(jù)意外刪除)導(dǎo)致redis緩存失效. 而使大量的用戶(hù)的請(qǐng)求直接訪問(wèn)數(shù)據(jù)庫(kù).
俗語(yǔ): 趁他病 要他命
如何解決:
1.設(shè)定超時(shí)時(shí)間時(shí) 不要設(shè)定相同的時(shí)間.
2.設(shè)定多級(jí)緩存

3.3 緩存雪崩
說(shuō)明: 由于高并發(fā)條件下 有大量的數(shù)據(jù)失效.導(dǎo)致redis的命中率太低.而使得用戶(hù)直接訪問(wèn)數(shù)據(jù)庫(kù)(服務(wù)器)導(dǎo)致崩潰,稱(chēng)之為緩存雪崩.
解決方案:
1.不要設(shè)定相同的超時(shí)時(shí)間 隨機(jī)數(shù)
2.設(shè)定多級(jí)緩存.
3.提高redis緩存的命中率 調(diào)整redis內(nèi)存優(yōu)化策略 采用LRU等算法.

