Redis面试宝典12道法
Redis 全稱 Remote Dictionary Server(即遠(yuǎn)程字典服務(wù)),它是一個(gè)基于內(nèi)存實(shí)現(xiàn)的鍵值型非關(guān)系(NoSQL)數(shù)據(jù)庫(kù)
1. 談下你對(duì) Redis 的了解?
三點(diǎn):
- 為什么要引入
一般用mysql,oracle,由于數(shù)據(jù)庫(kù)持久化數(shù)據(jù)主要是面向磁盤,而磁盤的讀寫比較慢,一般的管理系統(tǒng)上,由于不存在,因此沒有需要瞬間讀寫大量數(shù)據(jù)的要求,這時(shí)候傳統(tǒng)數(shù)據(jù)庫(kù)是沒有問題的。但是如果面對(duì)一個(gè)高并發(fā)的場(chǎng)景,比如搶票、發(fā)紅包等,或者是主頁(yè)訪問量瞬間比較大的時(shí)候,一瞬間會(huì)有成千上問的請(qǐng)求的到來高并發(fā),需要系統(tǒng)在極短的時(shí)間內(nèi)完成成千上萬次的讀寫操作。這時(shí)候數(shù)據(jù)庫(kù)根本承受不來,很容易造成數(shù)據(jù)庫(kù)系統(tǒng)的癱瘓,最終導(dǎo)致服務(wù)器宕機(jī)。
為了解決這個(gè)問題,我們可以引入nosql技術(shù)。nosql也是一種數(shù)據(jù)庫(kù),它是基于內(nèi)存的,并提供一定的持久化功能。redis和mongodb是當(dāng)前使用最廣泛的nosql技術(shù)。
- 是什么?
Redis 全稱 Remote Dictionary Server(即遠(yuǎn)程字典服務(wù)),它是一個(gè)基于內(nèi)存實(shí)現(xiàn)的鍵值型非關(guān)系(NoSQL)數(shù)據(jù)庫(kù),由意大利人用C語言所創(chuàng)
redis不僅可以將數(shù)據(jù)完全保存在內(nèi)存中,還可以通過磁盤實(shí)現(xiàn)數(shù)據(jù)的持久化支持
redis支持豐富的數(shù)據(jù)類型,包括string、list、set、zset、hash等多種數(shù)據(jù)結(jié)構(gòu),因此它也被稱為【數(shù)據(jù)結(jié)構(gòu)服務(wù)器
redis支持主從同步,即master-slave主從復(fù)制模式。數(shù)據(jù)可以從主服務(wù)器向任意數(shù)量的從服務(wù)器上同步,有效的保證數(shù)據(jù)的安全性
Redis 支持多種編程語言,包括 C、C++、Python、Java、PHP、Ruby、Lua 等語言。
與SQL型數(shù)據(jù)不同,redis沒有提供新建數(shù)據(jù)庫(kù)的操作,因?yàn)樗詭Я?6(0-15)個(gè)數(shù)據(jù)庫(kù)(默認(rèn)使用0庫(kù))。在同一個(gè)庫(kù)中,key是唯一存在的、不允許重復(fù)的,它就像一把“密鑰”,只能打開一把“鎖”。鍵值存儲(chǔ)的本質(zhì)就是使用key來標(biāo)識(shí)value,當(dāng)想要檢索value時(shí),必須使用與value對(duì)應(yīng)的key進(jìn)行查找
- redis架構(gòu)
客戶端和服務(wù)端可以位于同一臺(tái)計(jì)算機(jī)上,也可以位于不同的計(jì)算機(jī)上。服務(wù)端是整個(gè)架構(gòu)的“大腦”,能夠把數(shù)據(jù)存儲(chǔ)到內(nèi)存中,并且起到管理數(shù)據(jù)的作用 .Redis 基于內(nèi)存來實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ),因此其速度非???。但是我們知道,計(jì)算機(jī)的內(nèi)存是非常珍貴的資源,所以 Redis 不適合存儲(chǔ)較大的文件或者二進(jìn)制數(shù)據(jù),否則會(huì)出現(xiàn)錯(cuò)誤,Redis 適合存儲(chǔ)較小的文本信息。理論上 Redis 的每個(gè) key、value 的大小不超過 512 MB
2. Redis 一般都有哪些使用場(chǎng)景?
- 緩存—熱數(shù)據(jù)
- 計(jì)數(shù)器
- 隊(duì)列
- 分布式鎖與單線程機(jī)制
- 排行榜
- 最新列表
- 高并發(fā)讀寫
- 位操作大數(shù)據(jù)處理)redis中setbit(位操作)的實(shí)際應(yīng)用 - 云+社區(qū) - 騰訊云 (tencent.com)
3. Redis 有哪些常見的功能?
- 哨兵(sentinel)和復(fù)制(replication)
- 事務(wù)
- LUA腳本
- 持久化(Persistence)
- 集群(Cluster)
4. Redis 支持的數(shù)據(jù)類型有哪些?
- string(字符串)
- hash(哈希散列)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
- HyperLogLog 類型(來統(tǒng)計(jì)一個(gè)集合中不重復(fù)的元素個(gè)數(shù))
- Redis 5.0 提供的 Stream(支持消息隊(duì)列)
注意:這里指的數(shù)據(jù)類型是 Value(值) 的數(shù)據(jù)類型,而非 key。
5. Redis 為什么這么快??
- Redis 是一款純內(nèi)存結(jié)構(gòu),避免了磁盤 I/O 等耗時(shí)操作。
- Redis 命令處理的核心模塊為單線程,減少了鎖競(jìng)爭(zhēng),以及頻繁創(chuàng)建線程和銷毀線程的代價(jià),減少了線程上下文切換的消耗。
- 采用了 I/O 多路復(fù)用機(jī)制,大大提升了并發(fā)效率。
- 高效的數(shù)據(jù)結(jié)構(gòu)(簡(jiǎn)單動(dòng)態(tài)字符串、內(nèi)存重新分配、雙端鏈表等)
- 底層模型不同,Redis并沒有使用OS提供的Swap,而是自己實(shí)現(xiàn)構(gòu)建了VM的工作機(jī)制。
6. 什么是緩存穿透?怎么解決?
如果在請(qǐng)求數(shù)據(jù)時(shí),在緩存層和數(shù)據(jù)庫(kù)層都沒有找到符合條件的數(shù)據(jù),也就是說,在緩存層和數(shù)據(jù)庫(kù)層都沒有命中數(shù)據(jù),那么,這種情況就叫作緩存穿透。
解決方式:
- 把空對(duì)象緩存起來。當(dāng)?shù)谝淮螐臄?shù)據(jù)庫(kù)中查詢出來的結(jié)果為空時(shí),我們就將這個(gè)空對(duì)象加載到緩存,并設(shè)置合理的過期時(shí)間,這樣,就能夠在一定程度上保障后端數(shù)據(jù)庫(kù)的安全
- 第二種解決緩存穿透問題的解決方案:就是使用布隆過濾器
7. 什么是緩存雪崩?該如何解決?
如果在某一時(shí)刻緩存集中失效,或者緩存系統(tǒng)出現(xiàn)故障,所有的并發(fā)流量就會(huì)直接到達(dá)數(shù)據(jù)庫(kù)。
解決方式:
- 保證 Redis 的高可用。
- 使用限流降級(jí)的方式防止緩存雪崩。
- 通過數(shù)據(jù)預(yù)熱的方式將可能大量訪問的數(shù)據(jù)加載到緩存,在即將發(fā)生大并發(fā)訪問的時(shí)候,提前手動(dòng)觸發(fā)加載不同的數(shù)據(jù)到緩存中,并為數(shù)據(jù)設(shè)置不同的過期時(shí)間,讓緩存失效的時(shí)間點(diǎn)盡量均勻,不至于在同一時(shí)刻全部失效。
8. 怎么保證緩存和數(shù)據(jù)庫(kù)數(shù)據(jù)的一致性?CAP理論?
- 雙清延遲清理策略:數(shù)據(jù)變化前和后都進(jìn)行緩存清理,事務(wù)完成后再次清理。也可以最后監(jiān)聽binlog,再把數(shù)據(jù)刷入緩存中。
- 隊(duì)列清理,mq中間件接入redis,這樣做小型系統(tǒng)能支撐業(yè)務(wù)并發(fā),大型系統(tǒng)會(huì)產(chǎn)生較高延遲,影響使用。
9. Redis 持久化有幾種方式?
由于Redis的數(shù)據(jù)都存放在內(nèi)存中,如果沒有配置持久化,redis重啟后數(shù)據(jù)就全丟失了,于是需要開啟redis的持久化功能,將數(shù)據(jù)保存到磁盤上,當(dāng)redis重啟后,可以從磁盤中恢復(fù)數(shù)據(jù)。redis提供兩種方式進(jìn)行持久化:
- RDB快照持久化:
時(shí)間間隔內(nèi)將內(nèi)存的數(shù)據(jù)集快照寫到磁盤?;謴?fù)快,節(jié)省數(shù)據(jù)空間,但是當(dāng)redis故障,仍會(huì)丟失部分?jǐn)?shù)據(jù)
命令:
BGSAVE:Redis會(huì)調(diào)用fork來創(chuàng)建一個(gè)子進(jìn)程,然后子進(jìn)程負(fù)責(zé)將所有數(shù)據(jù)的快照寫入硬盤,而父進(jìn)程則繼續(xù)處理命令請(qǐng)求。
save 60 10000:Redis最近一次創(chuàng)建快照之后開始算起,當(dāng)“60秒之內(nèi)有10000次寫入”這個(gè)條件被滿足時(shí),Redis就會(huì)自動(dòng)觸發(fā)BGSAVE命令
- AOF(append only file)持久化
AOF持久化 的實(shí)時(shí)性更好,原理是將Redis的操作日志以追加的方式寫入文件,但是不加以控制的話,AOF文件的體積可能會(huì)比快照文件大好幾倍,恢復(fù)慢,可以通過冗余命令(BGREWRITEAOF)來重寫(rewrite)AOF文件來減小AOF文件的體積
參數(shù):
appendonly yes 開關(guān)
appendfsync always #每次有數(shù)據(jù)修改發(fā)生時(shí)都會(huì)寫入AOF文件,這樣會(huì)嚴(yán)重降低Redis的速度
appendfsync everysec #每秒鐘同步一次,顯示地將多個(gè)寫命令同步到硬盤
appendfsync no #讓操作系統(tǒng)決定何時(shí)進(jìn)行同步
10. Redis 怎么實(shí)現(xiàn)分布式鎖?
- 使用MySQL,基于唯一索引。
- 使用ZooKeeper,基于臨時(shí)有序節(jié)點(diǎn)。
- 使用Redis,基于setnx命令
加鎖:使用setnx key value命令,如果key不存在,設(shè)置value(加鎖成功)。如果已經(jīng)存在lock(也就是有客戶端持有鎖了),則設(shè)置失敗(加鎖失敗)。
解鎖:使用del命令,通過刪除鍵值釋放鎖。釋放鎖之后,其他客戶端可以通過setnx命令進(jìn)行加鎖
1.防止死鎖:要有個(gè)超時(shí)的機(jī)制,在設(shè)置key的值時(shí),需要加上有效時(shí)間,如果有效時(shí)間過期了,就會(huì)自動(dòng)失效,就不會(huì)出現(xiàn)死鎖。
2.支持可重入鎖:加鎖成功后使用hset命令value=1,使用hincrby自增,解鎖時(shí),先判斷可重復(fù)次數(shù)是否大于0,大于0則減一,否則刪除鍵值,釋放鎖資源
3.加鎖失敗后阻塞等待,等鎖釋放后再次嘗試加鎖
11. Redis 淘汰策略有哪些?
在Redis中,允許用戶設(shè)置最大使用內(nèi)存大小server.maxmemory,當(dāng)Redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時(shí)候,就會(huì)施行數(shù)據(jù)淘汰策略。
- volatile-lru:從已設(shè)置過期的數(shù)據(jù)集中挑選最近最少使用的淘汰
- volatile-ttr:從已設(shè)置過期的數(shù)據(jù)集中挑選將要過期的數(shù)據(jù)淘汰
- volatile-random:從已設(shè)置過期的數(shù)據(jù)集中任意挑選數(shù)據(jù)淘汰
- allkeys-lru:從數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰
- allkeys-random:從數(shù)據(jù)集中任意挑選數(shù)據(jù)淘汰
- noenviction:禁止淘汰數(shù)據(jù)
redis淘汰數(shù)據(jù)時(shí)還會(huì)同步到aof
12. Redis 常見性能問題和解決方案?
- Master最好不要做任何持久化工作,包括內(nèi)存快照和AOF日志文件,特別是不要啟用內(nèi)存快照做持久化。
- 如果數(shù)據(jù)比較重要,某個(gè)Slave開啟AOF備份數(shù)據(jù),策略設(shè)置為每秒同步一次
- 為了主從復(fù)制的速度和連接的穩(wěn)定性,Master和Slave最好在同一個(gè)局域網(wǎng)內(nèi),盡量避免在壓力很大的主庫(kù)上增加從庫(kù)
- Master調(diào)用BGREWRITEAOF重寫AOF文件,AOF在重寫的時(shí)候會(huì)占大量的CPU和內(nèi)存資源,導(dǎo)致服務(wù)load過高,出現(xiàn)短暫服務(wù)暫停現(xiàn)象。
- 為了Master的穩(wěn)定性,主從復(fù)制不要用圖狀結(jié)構(gòu),用單向鏈表結(jié)構(gòu)更穩(wěn)定,即主從關(guān)系為:Master
- redis并發(fā)問題可以使用分布式鎖
- redis持久化數(shù)據(jù)和緩存可以通過集群模式擴(kuò)容
番外篇
混合持久化方式
Redis 4.0 開始支持 RDB 和 AOF 的混合持久化(默認(rèn)關(guān)閉,可以通過配置項(xiàng) aof-use-rdb-preamble 開啟)。
redis和memcached比較
- memcached所有的值都是簡(jiǎn)單的字符串,redis支持更多的數(shù)據(jù)類型
- redis速度比memcached快很多
- redis可以持久化數(shù)據(jù)
- redis支持?jǐn)?shù)據(jù)備份,即master-slave模式的數(shù)據(jù)備份
QPS和TPS
- QPS:應(yīng)用系統(tǒng)每秒鐘最大能接受的用戶訪問量
- TPS:每秒鐘最大能處理的請(qǐng)求數(shù)
總結(jié)
以上是生活随笔為你收集整理的Redis面试宝典12道法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 球动画设计HTML5,html5 can
- 下一篇: Docker基础知识及安装部署