<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>

          Redis面試題!

          共 4704字,需瀏覽 10分鐘

           ·

          2020-09-29 01:30


          1,什么是Redis?
          Redis是一款開源的、高性能的鍵-值(key-value)數(shù)據(jù)庫。Redis是Remote Dictionary Server的簡稱。

          2,Redis有哪些數(shù)據(jù)類型?
          字符串、集合、有序集合、列表、哈希
          如果對redis有更深入了解,加上 HyperLogLog , Geo , Pub/Sub
          另外, 可以加上 Redis 的 BloomFilter(布隆過濾器) ,Bit操作,Lua腳本等等。
          提示除了5種基本類型,剩下的類型當(dāng)然是說的越多越好,但是注意,前提是你真的用過,因?yàn)槊嬖嚬倏赡苎矍耙涣粒缓笸盍藛?。這時候如果答不上來就GG了

          3,Redis有什么特點(diǎn)?
          Redis本質(zhì)上是一個Key-Value類型的內(nèi)存數(shù)據(jù)庫,很像memcached,整個數(shù)據(jù)庫統(tǒng)統(tǒng)加載在內(nèi)存當(dāng)中進(jìn)行操作,定期通過異步操作把數(shù)據(jù)庫數(shù)據(jù)flush到硬盤上進(jìn)行保存。因?yàn)槭羌儍?nèi)存操作,Redis的性能非常出色,每秒可以處理超過 10萬次讀寫操作,是已知性能最快的Key-Value DB。
          Redis的出色之處不僅僅是性能,Redis最大的魅力是支持保存多種數(shù)據(jù)結(jié)構(gòu),此外單個value的最大限制是1GB,不像 memcached只能保存1MB的數(shù)據(jù),因此Redis可以用來實(shí)現(xiàn)很多有用的功能,比方說用他的List來做FIFO雙向鏈表,實(shí)現(xiàn)一個輕量級的高性 能消息隊(duì)列服務(wù),用他的Set可以做高性能的tag系統(tǒng)等等。
          另外Redis也可以對存入的Key-Value設(shè)置expire時間,因此也可以被當(dāng)作一 個功能加強(qiáng)版的memcached來用。

          4,Redis有什么缺點(diǎn)?
          Redis的主要缺點(diǎn)是數(shù)據(jù)庫容量受到物理內(nèi)存的限制,不能用作海量數(shù)據(jù)的高性能讀寫,因此Redis適合的場景主要局限在較小數(shù)據(jù)量的高性能操作和運(yùn)算上。

          5,什么叫緩存雪崩?
          第一種情況:如果緩存數(shù)據(jù)設(shè)置的過期時間是相同的,并且Redis恰好將這部分?jǐn)?shù)據(jù)全部刪掉,這就會導(dǎo)致這段時間之內(nèi),這些緩存數(shù)據(jù)失效,那么所有請求全部走數(shù)據(jù)庫。
          第二種情況:Redis全部掛掉,所有的請求也是走數(shù)據(jù)庫的。

          6,怎么解決緩存雪崩?
          由于緩存雪崩會導(dǎo)致所有請求直接走數(shù)據(jù)庫,這樣數(shù)據(jù)庫壓力會很大,甚至拖垮數(shù)據(jù)庫,怎么辦呢?
          這個沒有完美解決辦法,但可以分析用戶行為,盡量讓失效時間點(diǎn)均勻分布。大多數(shù)系統(tǒng)設(shè)計(jì)者考慮用加鎖或者隊(duì)列的方式保證緩存的單線程(進(jìn)程)寫,從而避免失效時大量的并發(fā)請求落到底層存儲系統(tǒng)上。
          常用解決方法:
          加鎖排隊(duì). 限流-- 限流算法
          1.計(jì)數(shù) 2.滑動窗口 3.? 令牌桶Token Bucket 4.漏桶 leaky bucket [1]
          在緩存失效后,通過加鎖或者隊(duì)列來控制讀數(shù)據(jù)庫寫緩存的線程數(shù)量。
          比如對某個key只允許一個線程查詢數(shù)據(jù)和寫緩存,其他線程等待。
          業(yè)界比較常用的做法,是使用mutex。簡單地來說,就是在緩存失效的時候(判斷拿出來的值為空),不是立即去load db,而是先使用緩存工具的某些帶成功操作返回值的操作(比如Redis的SETNX或者M(jìn)emcache的ADD)去set一個mutex key,當(dāng)操作返回成功時,再進(jìn)行l(wèi)oad db的操作并回設(shè)緩存;否則,就重試整個get緩存的方法。

          SETNX,是「SET if Not eXists」的縮寫,也就是只有不存在的時候才設(shè)置,可以利用它來實(shí)現(xiàn)鎖的效果。
          數(shù)據(jù)預(yù)熱
          ? 可以通過緩存reload機(jī)制,預(yù)先去更新緩存,再即將發(fā)生大并發(fā)訪問前手動觸發(fā)加載緩存不同的key,設(shè)置不同的過期時間,讓緩存失效的時間點(diǎn)盡量均勻
          做二級緩存,或者雙緩存策略。
          ? ? ?A1為原始緩存,A2為拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設(shè)置為短期,A2設(shè)置為長期。
          緩存永遠(yuǎn)不過期
          ?這里的“永遠(yuǎn)不過期”包含兩層意思:
          ? ? (1) 從緩存上看,確實(shí)沒有設(shè)置過期時間,這就保證了,不會出現(xiàn)熱點(diǎn)key過期問題,也就是“物理”不過期。
          ? ? ?(2) 從功能上看,如果不過期,那不就成靜態(tài)的了嗎?所以我們把過期時間存在key對應(yīng)的value里,如果發(fā)現(xiàn)要過期了,通過一個后臺的異步線程進(jìn)行緩存的構(gòu)建,也就是“邏輯”過期。從實(shí)戰(zhàn)看,這種方法對于性能非常友好,唯一不足的就是構(gòu)建緩存時候,其余線程(非構(gòu)建緩存的線程)可能訪問的是老數(shù)據(jù),但是對于一般的互聯(lián)網(wǎng)功能來說這個還是可以忍受。
          對于“掛機(jī)”的這種雪崩
          • 事發(fā)前:實(shí)現(xiàn)Redis的高可用(主從架構(gòu)+Sentinel 或者Redis Cluster),盡量避免Redis掛掉這種情況發(fā)生。
          • 事發(fā)中:萬一Redis真的掛了,我們可以設(shè)置本地緩存(ehcache)+限流(hystrix),盡量避免我們的數(shù)據(jù)庫被干掉(起碼能保證我們的服務(wù)還是能正常工作的)
          • 事發(fā)后:redis持久化,重啟后自動從磁盤上加載數(shù)據(jù),快速恢復(fù)緩存數(shù)據(jù)。

          7,Redis數(shù)據(jù)淘汰策略有幾種?
          1. noeviction:返回錯誤當(dāng)內(nèi)存限制達(dá)到,并且客戶端嘗試執(zhí)行會讓更多內(nèi)存被使用的命令。
          2. allkeys-lru: 嘗試回收最少使用的鍵(LRU),使得新添加的數(shù)據(jù)有空間存放。
          3. volatile-lru: 嘗試回收最少使用的鍵(LRU),但僅限于在過期集合的鍵,使得新添加的數(shù)據(jù)有空間存放。
          4. allkeys-random: 回收隨機(jī)的鍵使得新添加的數(shù)據(jù)有空間存放。
          5. volatile-random: 回收隨機(jī)的鍵使得新添加的數(shù)據(jù)有空間存放,但僅限于在過期集合的鍵。
          6. volatile-ttl: 回收在過期集合的鍵,并且優(yōu)先回收存活時間(TTL)較短的鍵,使得新添加的數(shù)據(jù)有空間存放。

          8,Redis有哪些使用場景?
          會話緩存
          最常用的一種使用Redis的情景是會話緩存(session cache),用Redis緩存會話比其他存儲(如Memcached)的優(yōu)勢在于:Redis提供持久化。當(dāng)維護(hù)一個不是嚴(yán)格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現(xiàn)在,他們還會這樣嗎?
          幸運(yùn)的是,隨著 Redis 這些年的改進(jìn),很容易找到怎么恰當(dāng)?shù)氖褂肦edis來緩存會話的文檔。甚至廣為人知的商業(yè)平臺Magento也提供Redis的插件。
          全頁緩存
          除基本的會話token之外,Redis還提供很簡便的FPC平臺?;氐揭恢滦詥栴},即使重啟了Redis實(shí)例,因?yàn)橛写疟P的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進(jìn),類似PHP本地FPC。
          再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存后端。
          此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。
          隊(duì)列
          Reids在內(nèi)存存儲引擎領(lǐng)域的一大優(yōu)點(diǎn)是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊(duì)列平臺來使用。Redis作為隊(duì)列使用的操作,就類似于本地程序語言(如Python)對 list 的 push/pop 操作。
          如果你快速的在Google中搜索“Redis queues”,你馬上就能找到大量的開源項(xiàng)目,這些項(xiàng)目的目的就是利用Redis創(chuàng)建非常好的后端工具,以滿足各種隊(duì)列需求。例如,Celery有一個后臺就是使用Redis作為broker,你可以從這里去查看。
          排行榜/計(jì)數(shù)器
          Redis在內(nèi)存中對數(shù)字進(jìn)行遞增或遞減的操作實(shí)現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執(zhí)行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數(shù)據(jù)結(jié)構(gòu)。
          所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執(zhí)行即可:
          當(dāng)然,這是假定你是根據(jù)你用戶的分?jǐn)?shù)做遞增的排序。如果你想返回用戶及用戶的分?jǐn)?shù),你需要這樣執(zhí)行:
          ZRANGE user_scores 0 10 WITHSCORES
          Agora Games就是一個很好的例子,用Ruby實(shí)現(xiàn)的,它的排行榜就是使用Redis來存儲數(shù)據(jù)的,你可以在這里看到。
          發(fā)布/訂閱
          最后(但肯定不是最不重要的)是Redis的發(fā)布/訂閱功能。發(fā)布/訂閱的使用場景確實(shí)非常多。我已看見人們在社交網(wǎng)絡(luò)連接中使用,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器,甚至用Redis的發(fā)布/訂閱功能來建立聊天系統(tǒng)!

          9,Redis相比memcached的優(yōu)勢有哪些?
          (1) memcached所有的值均是簡單的字符串,redis作為其替代者,支持更為豐富的數(shù)據(jù)類型
          (2) redis的速度比memcached快很多
          (3) redis可以持久化其數(shù)據(jù)

          10,Redis為什么快?
          1. Redis是純內(nèi)存數(shù)據(jù)庫,一般都是簡單的存取操作,線程占用的時間很多,時間的花費(fèi)主要集中在IO上,所以讀取速度快。
          2. Redis使用的是非阻塞IO,IO多路復(fù)用,使用了單線程來輪詢描述符,將數(shù)據(jù)庫的開、關(guān)、讀、寫都轉(zhuǎn)換成了事件,減少了線程切換時上下文的切換和競爭?! ?br>
          3. ?Redis采用了單線程的模型,保證了每個操作的原子性,也減少了線程的上下文切換和競爭。
          4. ?數(shù)據(jù)結(jié)構(gòu)也幫了不少忙,Redis全程使用hash結(jié)構(gòu),讀取速度快,還有一些特殊的數(shù)據(jù)結(jié)構(gòu),對數(shù)據(jù)存儲進(jìn)行了優(yōu)化,如壓縮表,對短數(shù)據(jù)進(jìn)行壓縮存儲,再如,跳表,使用有序的數(shù)據(jù)結(jié)構(gòu)加快讀取的速度。
          5. Redis采用自己實(shí)現(xiàn)的事件分離器,效率比較高,內(nèi)部采用非阻塞的執(zhí)行方式,吞吐能力比較大。

          11,Redis的java實(shí)現(xiàn)客戶端有哪些?
          Redisson,Jedis,lettuce等等,官方推薦使用Redisson。

          12,Redis的持久化有幾種方式?各有什么不同?
          持久化就是把內(nèi)存的數(shù)據(jù)寫到磁盤中去,防止服務(wù)宕機(jī)了內(nèi)存數(shù)據(jù)丟失。
          Redis 提供了兩種持久化方式:
          • RDB(默認(rèn))?
          • AOF?
          RDB:
          rdb是Redis DataBase縮寫
          功能核心函數(shù)rdbSave(生成RDB文件)和rdbLoad(從文件加載內(nèi)存)兩個函數(shù)
          AOF:
          Aof是Append-only file縮寫
          每當(dāng)執(zhí)行服務(wù)器(定時)任務(wù)或者函數(shù)時flushAppendOnlyFile 函數(shù)都會被調(diào)用, 這個函數(shù)執(zhí)行以下兩個工作
          aof寫入保存:
          WRITE:根據(jù)條件,將 aof_buf 中的緩存寫入到 AOF 文件
          SAVE:根據(jù)條件,調(diào)用 fsync 或 fdatasync 函數(shù),將 AOF 文件保存到磁盤中。
          存儲結(jié)構(gòu):
          ? 內(nèi)容是redis通訊協(xié)議(RESP )格式的命令文本存儲。
          比較:
          1、aof文件比rdb更新頻率高,優(yōu)先使用aof還原數(shù)據(jù)。
          2、aof比rdb更安全也更大
          3、rdb性能比aof好
          4、如果兩個都配了優(yōu)先加載AOF

          13,什么是緩存穿透?如何避免?
          一般的緩存系統(tǒng),都是按照key去緩存查詢,如果不存在對應(yīng)的value,就應(yīng)該去后端系統(tǒng)查找(比如DB)。一些惡意的請求會故意查詢不存在的key,請求量很大,就會對后端系統(tǒng)造成很大的壓力。這就叫做緩存穿透。
          如何避免?
          1:對查詢結(jié)果為空的情況也進(jìn)行緩存,緩存時間設(shè)置短一點(diǎn),或者該key對應(yīng)的數(shù)據(jù)insert了之后清理緩存。
          2:對一定不存在的key進(jìn)行過濾??梢园阉械目赡艽嬖诘膋ey放到一個大的Bitmap中,查詢時通過該bitmap過濾。


          瀏覽 77
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <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>
                  黄 色 视 频 | 免费成人视频久久 | 亚洲专区在线播放 | 天天干天天日天天草 | 成人欧美在线 |