<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          10道不得不會(huì)的 Redis 面試題

          共 3461字,需瀏覽 7分鐘

           ·

          2022-06-24 17:43

          以下是 Redis 面試題,相信大家都會(huì)有種既眼熟又陌生的感覺(jué)、看過(guò)可能在短暫的面試后又馬上忘記了。JavaPub在這里整理這些容易忘記的重點(diǎn)知識(shí)及解答建議收藏,經(jīng)常溫習(xí)查閱

          評(píng)論區(qū)見(jiàn)

          @

          • 1. Redis是什么?

          • 2. 你在哪些場(chǎng)景使用redis

          • 3. 為什么Redis是單線程的?

          • 4. Redis持久化有幾種方式?

          • 5. 什么是緩存穿透?怎么解決?

          • 6. 什么是緩存雪崩?

          • 7. Redis使用上如何做內(nèi)存優(yōu)化?

          • 8. 你們r(jià)edis使用哪種部署方式?

          • 9. redis實(shí)現(xiàn)分布式鎖要注意什么?

          1. Redis是什么?

          一般問(wèn)這個(gè)問(wèn)題你最少要答出以下幾點(diǎn),如果對(duì)基礎(chǔ)不了解,推薦閱讀《 rodert單排學(xué)習(xí)redis

          Redis 是一個(gè)基于內(nèi)存的 key-value 存儲(chǔ)系統(tǒng),數(shù)據(jù)結(jié)構(gòu)包括字符串、list、set、zset(sorted set --有序集合)和hash,bitmap,GeoHash(坐標(biāo)),HyperLogLog,Streams(5.x版本以后)

          2. 你在哪些場(chǎng)景使用redis

          你有實(shí)戰(zhàn)經(jīng)驗(yàn),那就直接表演。如果沒(méi)有,選幾個(gè)下面的經(jīng)典場(chǎng)景

          1. 作為隊(duì)列使用,(因?yàn)槭腔趦?nèi)存、一般不會(huì)作為消費(fèi)隊(duì)列、作為循環(huán)隊(duì)列必要適用);
          2. 模擬類(lèi)似于token這種需要設(shè)置過(guò)期時(shí)間的場(chǎng)景,登錄失效;
          3. 分布式緩存,避免大量請(qǐng)求底層關(guān)系型數(shù)據(jù)庫(kù),大大降低數(shù)據(jù)庫(kù)壓力;
          4. 分布式鎖;
          5. 基于 bitmap 實(shí)現(xiàn)布隆過(guò)濾器;
          6. 排行榜-基于zset(有序集合數(shù)據(jù)類(lèi)型);
          7. 計(jì)數(shù)器-對(duì)于瀏覽量、播放量等并發(fā)較高,使用 redis incr 實(shí)現(xiàn)計(jì)數(shù)器功能;
          8. 分布式會(huì)話;
          9. 消息系統(tǒng);

          3. 為什么Redis是單線程的?

          這個(gè)問(wèn)題給一個(gè)官方答案

          因?yàn)镽edis是基于內(nèi)存的操作,CPU不是Redis的瓶頸,Redis的瓶頸最有可能是機(jī)器內(nèi)存的大小或者網(wǎng)絡(luò)帶寬。既然單線程容易實(shí)現(xiàn),而且CPU不會(huì)成為瓶頸,那就順理成章地采用單線程的方案了。

          4. Redis持久化有幾種方式?

          redis 提供了兩種持久化的方式,分別是快照方式(RDB Redis DataBase)和文件追加(AOF Append Only File)

          顯而易見(jiàn),快照方式重啟恢復(fù)快、但是數(shù)據(jù)更容易丟失,文件追加數(shù)據(jù)更完整、重啟恢復(fù)慢。

          混合持久化方式,Redis 4.0之后新增的方式,混合持久化是結(jié)合RDB和AOF的優(yōu)點(diǎn),在寫(xiě)入的時(shí)候先把當(dāng)前的數(shù)據(jù)以RDB的形式寫(xiě)入到文件的開(kāi)頭,再將后續(xù)的操作以AOF的格式存入文件當(dāng)中,這樣既能保證重啟時(shí)的速度,又能降低數(shù)據(jù)丟失的風(fēng)險(xiǎn)。

          在恢復(fù)時(shí),先恢復(fù)快照方式保存的文件,然后再恢復(fù)追加文件中的增量數(shù)據(jù)。

          5. 什么是緩存穿透?怎么解決?

          緩存穿透是指用戶(hù)請(qǐng)求的數(shù)據(jù)在緩存中不存在即沒(méi)有命中,同時(shí)在數(shù)據(jù)庫(kù)中也不存在,導(dǎo)致用戶(hù)每次請(qǐng)求該數(shù)據(jù)都要去數(shù)據(jù)庫(kù)中查詢(xún)一遍,然后返回空。

          如果有惡意攻擊者不斷請(qǐng)求系統(tǒng)中不存在的數(shù)據(jù),會(huì)導(dǎo)致短時(shí)間大量請(qǐng)求落在數(shù)據(jù)庫(kù)上,造成數(shù)據(jù)庫(kù)壓力過(guò)大,甚至擊垮數(shù)據(jù)庫(kù)系統(tǒng)。

          這就叫做緩存穿透。

          怎么解決?

          • 對(duì)查詢(xún)結(jié)果為空的情況也進(jìn)行緩存,緩存時(shí)間設(shè)置短一點(diǎn),或者該key對(duì)應(yīng)的數(shù)據(jù)insert之后清理緩存。

          • 對(duì)一定不存在的key進(jìn)行過(guò)濾。可以把所有的可能存在的key放到一個(gè)大的Bitmap中,查詢(xún)時(shí)通過(guò)該Bitmap過(guò)濾。(也就是布隆過(guò)濾器的原理:大白話講解布隆過(guò)濾器)

          6. 什么是緩存雪崩?

          緩存雪崩是指緩存中數(shù)據(jù)大批量到過(guò)期時(shí)間,而查詢(xún)數(shù)據(jù)量巨大,請(qǐng)求直接落到數(shù)據(jù)庫(kù)上,引起數(shù)據(jù)庫(kù)壓力過(guò)大甚至宕機(jī)。和緩存擊穿不同的是,緩存擊穿指并發(fā)查同一條數(shù)據(jù),緩存雪崩是不同數(shù)據(jù)都過(guò)期了,很多數(shù)據(jù)都查不到從而查數(shù)據(jù)庫(kù)。

          怎么解決?

          常用的解決方案有:

          • 均勻過(guò)期
          • 加互斥鎖
          • 緩存永不過(guò)期
          • 雙層緩存策略

          均勻過(guò)期:設(shè)置不同的過(guò)期時(shí)間,讓緩存失效的時(shí)間點(diǎn)盡量均勻。通常可以為有效期增加隨機(jī)值或者統(tǒng)一規(guī)劃有效期。

          加互斥鎖:跟緩存擊穿解決思路一致,同一時(shí)間只讓一個(gè)線程構(gòu)建緩存,其他線程阻塞排隊(duì)。

          緩存永不過(guò)期:跟緩存擊穿解決思路一致,緩存在物理上永遠(yuǎn)不過(guò)期,用一個(gè)異步的線程更新緩存。

          雙層緩存策略:使用主備兩層緩存:

          主緩存:有效期按照經(jīng)驗(yàn)值設(shè)置,設(shè)置為主讀取的緩存,主緩存失效后從數(shù)據(jù)庫(kù)加載最新值。

          備份緩存:有效期長(zhǎng),獲取鎖失敗時(shí)讀取的緩存,主緩存更新時(shí)需要同步更新備份緩存。

          7. Redis使用上如何做內(nèi)存優(yōu)化?

          1. 縮短鍵值的長(zhǎng)度
          • 縮短值的長(zhǎng)度才是關(guān)鍵,如果值是一個(gè)大的業(yè)務(wù)對(duì)象,可以將對(duì)象序列化成二進(jìn)制數(shù)組;
          • 首先應(yīng)該在業(yè)務(wù)上進(jìn)行精簡(jiǎn),去掉不必要的屬性,避免存儲(chǔ)一些沒(méi)用的數(shù)據(jù);
          • 其次是序列化的工具選擇上,應(yīng)該選擇更高效的序列化工具來(lái)降低字節(jié)數(shù)組大小;
          • 以JAVA為例,內(nèi)置的序列化方式無(wú)論從速度還是壓縮比都不盡如人意,這時(shí)可以選擇更高效的序列化工具,如: protostuff,kryo等
          1. 共享對(duì)象池

          對(duì)象共享池指Redis內(nèi)部維護(hù)[0-9999]的整數(shù)對(duì)象池。創(chuàng)建大量的整數(shù)類(lèi)型redisObject存在內(nèi)存開(kāi)銷(xiāo),每個(gè)redisObject內(nèi)部結(jié)構(gòu)至少占16字節(jié),甚至超過(guò)了整數(shù)自身空間消耗。所以Redis內(nèi)存維護(hù)一個(gè)[0-9999]的整數(shù)對(duì)象池,用于節(jié)約內(nèi)存。除了整數(shù)值對(duì)象,其他類(lèi)型如list,hash,set,zset內(nèi)部元素也可以使用整數(shù)對(duì)象池。因此開(kāi)發(fā)中在滿(mǎn)足需求的前提下,盡量使用整數(shù)對(duì)象以節(jié)省內(nèi)存。

          1. 字符串優(yōu)化

          因?yàn)閞edis的惰性刪除機(jī)制,字符串縮減后的空間不釋放,作為預(yù)分配空間保留。盡量做新增不做更新。

          1. 編碼優(yōu)化

          所謂編碼就是具體使用哪種底層數(shù)據(jù)結(jié)構(gòu)來(lái)實(shí)現(xiàn)。編碼不同將直接影響數(shù)據(jù)的內(nèi)存占用和讀寫(xiě)效率。

          這個(gè)需要掌握redis底層的數(shù)據(jù)結(jié)構(gòu)。下圖作為參考:

          image
          1. 控制key的數(shù)量

          8. 你們r(jià)edis使用哪種部署方式?

          redis部署分為單節(jié)點(diǎn)、主從部署(master-slave)、哨兵部署(Sentinel)、集群部署(cluster)。

          單節(jié)點(diǎn):也就是單機(jī)部署;

          主從部署:分為一主一從或一主多從,主從之間同步分為全量或增量。量同步:master 節(jié)點(diǎn)通過(guò) BGSAVE 生成對(duì)應(yīng)的RDB文件,然后發(fā)送給slave節(jié)點(diǎn),slave節(jié)點(diǎn)接收到寫(xiě)入命令后將master發(fā)送過(guò)來(lái)的文件加載并寫(xiě)入;增量同步:即在 master-slave 關(guān)系建立開(kāi)始,master每執(zhí)行一次數(shù)據(jù)變更的命令就會(huì)同步至slave節(jié)點(diǎn)。一般會(huì)將寫(xiě)請(qǐng)求轉(zhuǎn)發(fā)到master,讀請(qǐng)求轉(zhuǎn)發(fā)到slave。提高了redis的性能。

          哨兵部署:分別有哨兵集群與Redis的主從集群,哨兵作為操作系統(tǒng)中的一個(gè)監(jiān)控進(jìn)程,對(duì)應(yīng)監(jiān)控每一個(gè)Redis實(shí)例,如果master服務(wù)異常(ping pong其中節(jié)點(diǎn)沒(méi)有回復(fù)且超過(guò)了一定時(shí)間),就會(huì)多個(gè)哨兵之間進(jìn)行確認(rèn),如果超過(guò)一半確認(rèn)服務(wù)異常,則對(duì)master服務(wù)進(jìn)行下線處理,并且選舉出當(dāng)前一個(gè)slave節(jié)點(diǎn)來(lái)轉(zhuǎn)換成master節(jié)點(diǎn);如果slave節(jié)點(diǎn)服務(wù)異常,也是經(jīng)過(guò)多個(gè)哨兵確認(rèn)后,進(jìn)行下線處理。提高了redis集群高可用的特性,及橫向擴(kuò)展能力的增強(qiáng)。

          image

          集群部署:屬于“去中心化”的一種方式,多個(gè) master 節(jié)點(diǎn)保存整個(gè)集群中的全部數(shù)據(jù),而數(shù)據(jù)根據(jù) key 進(jìn)行 crc-16 校驗(yàn)算法進(jìn)行散列,將 key 散列成對(duì)應(yīng) 16383 個(gè) slot,而 Redis cluster 集群中每個(gè) master 節(jié)點(diǎn)負(fù)責(zé)不同的slot范圍。每個(gè) master 節(jié)點(diǎn)下還可以配置多個(gè) slave 節(jié)點(diǎn),同時(shí)也可以在集群中再使用 sentinel 哨兵提升整個(gè)集群的高可用性。

          image

          9. redis實(shí)現(xiàn)分布式鎖要注意什么?

          1. 加鎖過(guò)程要保證原子性;
          2. 保證誰(shuí)加的鎖只能被誰(shuí)解鎖,即Redis加鎖的value,解鎖時(shí)需要傳入相同的value才能成功,保證value唯一性;
          3. 設(shè)置鎖超時(shí)時(shí)間,防止加鎖方異常無(wú)法釋放鎖時(shí)其他客戶(hù)端無(wú)法獲取鎖,同時(shí),超時(shí)時(shí)間要大于業(yè)務(wù)處理時(shí)間;

          使用Redis命令 SET lock_key unique_value NX EX seconds 進(jìn)行加鎖,單命令操作,Redis是串行執(zhí)行命令,所以能保證只有一個(gè)能加鎖成功。


          低谷蓄力

          推薦開(kāi)源 SpringBoot+VUE 系統(tǒng)倆萬(wàn)、附視頻教程:https://gitee.com/rodert/liawan-vue


          開(kāi)放一下個(gè)人微信,小伙伴可以加我大號(hào)了,名額有限,先到先得,再滿(mǎn)就真沒(méi)了

          掃描下方二維碼即可加我微信啦,2022,抱團(tuán)取暖,一起牛逼。


          瀏覽 51
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  avav手机在线 | 蜜桃在线无码精品秘 入口欧 | 麻豆成人无码精品视频 | 自拍偷拍首页 | 亚洲av性爱 |