<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數(shù)據(jù)類型經(jīng)典面試題匯總

          共 2735字,需瀏覽 6分鐘

           ·

          2022-06-11 19:22

          Redis常見1000道面試題匯總,點(diǎn)擊查看更多Redis面試題。

          你是怎么用Redis做異步隊(duì)列的?

          1. 一般使用list結(jié)構(gòu)作為隊(duì)列,rpush生產(chǎn)消息,lpop消費(fèi)消息。當(dāng)lpop沒有消息的時(shí)候,要適當(dāng)sleep一會(huì)再重試。

          2. 如果對(duì)方追問可不可以不用sleep呢?list還有個(gè)指令叫blpop,在沒有消息的時(shí)候,它會(huì)阻塞住直到消息到來(lái)。

          3. 如果對(duì)方追問能不能生產(chǎn)一次消費(fèi)多次呢?使用pub/sub主題訂閱者模式,可以實(shí)現(xiàn)1:N的消息隊(duì)列。

          4. 如果對(duì)方追問pub/sub有什么缺點(diǎn)?在消費(fèi)者下線的情況下,「生產(chǎn)的消息會(huì)丟失」,可以使用Redis6增加的「stream數(shù)據(jù)類型」,也可以使用專業(yè)的「消息隊(duì)列如rabbitmq等」

          5. 如果對(duì)方追問redis如何實(shí)現(xiàn)延時(shí)隊(duì)列?「使用sortedset,拿時(shí)間戳作為score」,消息內(nèi)容作為key調(diào)用zadd來(lái)生產(chǎn)消息,消費(fèi)者用zrangebyscore指令獲取N秒之前的數(shù)據(jù)輪詢進(jìn)行處理。

          Redis使用場(chǎng)景

          1.數(shù)據(jù)緩存(用戶信息、商品數(shù)量、文章閱讀數(shù)量)

          2.消息推送(站點(diǎn)的訂閱)

          3.隊(duì)列(削峰、解耦、異步)

          4.排行榜(積分排行)

          5.社交網(wǎng)絡(luò)(共同好友、互踩、下拉刷新)

          6.計(jì)數(shù)器(商品庫(kù)存,站點(diǎn)在線人數(shù)、文章閱讀、點(diǎn)贊)

          7.基數(shù)計(jì)算

          8.GEO計(jì)算

          Redis功能特點(diǎn)

          1. 持久化
          2. 豐富的數(shù)據(jù)類型(string、list、hash、set、zset、發(fā)布訂閱等)
          3. 高可用方案(哨兵、集群、主從)
          4. 事務(wù)
          5. 豐富的客戶端
          6. 提供事務(wù)
          7. 消息發(fā)布訂閱
          8. Geo
          9. HyperLogLog
          10. 事務(wù)

          說說Redis各種數(shù)據(jù)類型的底層數(shù)據(jù)結(jié)構(gòu)?

          1. string底層數(shù)據(jù)結(jié)構(gòu)為簡(jiǎn)單字符串。

          2. list底層數(shù)據(jù)結(jié)構(gòu)為ziplist和linkedlist。

          3. hash底層數(shù)據(jù)結(jié)構(gòu)為ziplist和hashtable。

          4. set底層數(shù)據(jù)結(jié)構(gòu)為intset和hashtable。

          5. sorted set底層數(shù)據(jù)結(jié)構(gòu)為ziplist和skiplist。

          如何使用Redis實(shí)現(xiàn)隊(duì)列功能?

          1. 可以使用list實(shí)現(xiàn)普通隊(duì)列,lpush添加到嘟列,lpop從隊(duì)列中讀取數(shù)據(jù)。

          2. 可以使用zset定期輪詢數(shù)據(jù),實(shí)現(xiàn)延遲隊(duì)列。

          3. 可以使用發(fā)布訂閱實(shí)現(xiàn)多個(gè)消費(fèi)者隊(duì)列。

          4. 可以使用stream實(shí)現(xiàn)隊(duì)列。(推薦使用該方式實(shí)現(xiàn))。

          能談?wù)勈褂肦edis Stream做隊(duì)列,比list,zset和發(fā)布訂閱有什么區(qū)別嗎?

          1. list可以使用lpush向隊(duì)列中添加數(shù)據(jù),lpop可以向隊(duì)列中讀取數(shù)據(jù)。list作為消息隊(duì)列無(wú)法實(shí)現(xiàn)一個(gè)消息多個(gè)消費(fèi)者。如果出現(xiàn)消息處理失敗,需要手動(dòng)回滾消息。

          2. zset在添加數(shù)據(jù)時(shí),需要添加一個(gè)分值,可以根據(jù)該分值對(duì)數(shù)據(jù)進(jìn)行排序,實(shí)現(xiàn)延遲消息隊(duì)列的功能。消息是否消費(fèi)需要額外的處理。

          3. 發(fā)布訂閱可以實(shí)現(xiàn)多個(gè)消費(fèi)者功能,但是發(fā)布訂閱無(wú)法實(shí)現(xiàn)數(shù)據(jù)持久化,容易導(dǎo)致數(shù)據(jù)丟失。并且開啟一個(gè)訂閱者無(wú)法獲取到之前的數(shù)據(jù)。

          4. stream借鑒了常用的MQ服務(wù),添加一個(gè)消息就會(huì)產(chǎn)生一個(gè)消息ID,每一個(gè)消息ID下可以對(duì)應(yīng)多個(gè)消費(fèi)組,每一個(gè)消費(fèi)組下可以對(duì)應(yīng)多個(gè)消費(fèi)者??梢詫?shí)現(xiàn)多個(gè)消費(fèi)者功能,同時(shí)支持ack機(jī)制,減少數(shù)據(jù)的丟失情況。也是支持?jǐn)?shù)據(jù)值持久化和主從復(fù)制功能。

          設(shè)計(jì)一個(gè)網(wǎng)站每日、每月和每天的PV、UV你該怎么設(shè)計(jì)?

          實(shí)現(xiàn)這樣的功能,如果只是統(tǒng)計(jì)一個(gè)匯總數(shù)據(jù),推薦使用HyperLogLog數(shù)據(jù)類型。Redis HyperLogLog 是用來(lái)做基數(shù)統(tǒng)計(jì)的算法,HyperLogLog 的優(yōu)點(diǎn)是,在輸入元素的數(shù)量或者體積非常非常大時(shí),計(jì)算基數(shù)所需的空間總是固定 的、并且是很小的。在 Redis 里面,每個(gè) HyperLogLog 鍵只需要花費(fèi) 12 KB 內(nèi)存,就可以計(jì)算接近 2^64 個(gè)不同元素的基 數(shù)。這和計(jì)算基數(shù)時(shí),元素越多耗費(fèi)內(nèi)存就越多的集合形成鮮明對(duì)比。

          如何使用Redis實(shí)現(xiàn)附近距離檢索功能?

          實(shí)現(xiàn)距離檢索,可以使用Redis中的GEO數(shù)據(jù)類型。GEO 主要用于存儲(chǔ)地理位置信息,并對(duì)存儲(chǔ)的信息進(jìn)行操作,該功能在 Redis 3.2 版本新增。但是GEO適合精度不是很高的場(chǎng)景。由于GEO是在內(nèi)存中進(jìn)行計(jì)算,具備計(jì)算速度快的特點(diǎn)。

          結(jié)合Redis中的list,發(fā)布訂閱,說說用他們實(shí)現(xiàn)的隊(duì)列存在哪些弊端?

          1. list可以使用lpush向隊(duì)列中添加數(shù)據(jù),lpop可以向隊(duì)列中讀取數(shù)據(jù)。list作為消息隊(duì)列無(wú)法實(shí)現(xiàn)一個(gè)消息多個(gè)消費(fèi)者。如果出現(xiàn)消息處理失敗,需要手動(dòng)回滾消息。

          2. 發(fā)布訂閱可以實(shí)現(xiàn)多個(gè)消費(fèi)者功能,但是發(fā)布訂閱無(wú)法實(shí)現(xiàn)數(shù)據(jù)持久化,容易導(dǎo)致數(shù)據(jù)丟失。并且開啟一個(gè)訂閱者無(wú)法獲取到之前的數(shù)據(jù)。

          如何使用Redis實(shí)現(xiàn)一個(gè)分布式鎖功能?

          使用Redis實(shí)現(xiàn)分布式鎖,可以使用set key value + expire ttl實(shí)現(xiàn),但是這兩個(gè)命令分開執(zhí)行不是一個(gè)原子操作,因此推薦使用set key vale nx ttl,該命令屬于原子操作。

          使用Redis解決秒殺超賣,該選擇什么數(shù)據(jù)類型?為什么選擇該數(shù)據(jù)類型?

          1. 在秒殺場(chǎng)景下,超賣是一個(gè)非常嚴(yán)重的問題。常規(guī)的邏輯是先查詢庫(kù)存在減少庫(kù)存。但在秒殺場(chǎng)景中,無(wú)法保證減少庫(kù)存的過程中有其他的請(qǐng)求讀取了未減少的庫(kù)存數(shù)據(jù)。

          2. 由于Redis是單線程的執(zhí)行,同一時(shí)刻只有一個(gè)線程進(jìn)行操作。因此可以使用Redis來(lái)實(shí)現(xiàn)秒殺減少庫(kù)存。

          3. 在Redis的數(shù)據(jù)類型中,可以使用lpush,decr命令實(shí)現(xiàn)秒殺減少庫(kù)存。該命令屬于原子操作。

          如何使用Redis實(shí)現(xiàn)系統(tǒng)用戶簽到功能?

          1. 使用Redis實(shí)現(xiàn)用戶簽到可以使用bitmap實(shí)現(xiàn)。bitmap底層數(shù)據(jù)存儲(chǔ)的是1否者0,占用內(nèi)存小。

          2. Redis提供的數(shù)據(jù)類型BitMap(位圖),每個(gè)bit位對(duì)應(yīng)0和1兩個(gè)狀態(tài)。雖然內(nèi)部還是采用String類型存儲(chǔ),但Redis提供了一些指令用于直接操作BitMap,可以把它看作一個(gè)bit數(shù)組,數(shù)組的下標(biāo)就是偏移量。

          3. 它的優(yōu)點(diǎn)是內(nèi)存開銷小,效率高且操作簡(jiǎn)單,很適合用于簽到這類場(chǎng)景。

          4. 缺點(diǎn)在于位計(jì)算和位表示數(shù)值的局限。如果要用位來(lái)做業(yè)務(wù)數(shù)據(jù)記錄,就不要在意value的值。

          使用Redis實(shí)現(xiàn)延遲隊(duì)列,該如何實(shí)現(xiàn)?

          1. 使用Redis實(shí)現(xiàn)延遲隊(duì)列,可以使用zset數(shù)據(jù)類型。

          2. zset在添加數(shù)據(jù)時(shí),需要添加一個(gè)分值,將時(shí)間作為分值,根據(jù)該分值對(duì)數(shù)據(jù)進(jìn)行排序。

          3. 單獨(dú)開啟線程,根據(jù)分值大小定期實(shí)行數(shù)據(jù)。

          如何使用Redis實(shí)現(xiàn)一個(gè)積分排行功能?

          1. 使用Redis實(shí)現(xiàn)積分排行,可以使用zset數(shù)據(jù)類型。

          2. zset在添加數(shù)據(jù)時(shí),需要添加一個(gè)分值,將積分作為分值,值作為用戶ID,根據(jù)該分值對(duì)數(shù)據(jù)進(jìn)行排序。

          一個(gè)字符串類型的值能存儲(chǔ)最大容量是多少?

          一個(gè)字符串最大可存儲(chǔ)512M。

          Redis數(shù)據(jù)類型都有哪些,這些數(shù)據(jù)類型都有哪些使用場(chǎng)景?


          瀏覽 89
          點(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>
                  男女h网站 | avtt资源搜索 | 国产高清乱伦片 | 抽插.com | 黄色录像大片 |