互聯(lián)網(wǎng)公司面試必問(wèn)的Redis題目

      網(wǎng)友投稿 714 2022-05-29

      https://juejin.im/post/5b99d4bce51d450e7a24b66e#heading-0

      Redis是一個(gè)非常火的非關(guān)系型數(shù)據(jù)庫(kù),火到什么程度呢?只要是一個(gè)互聯(lián)網(wǎng)公司都會(huì)使用到。Redis相關(guān)的問(wèn)題可以說(shuō)是面試必問(wèn)的,下面我從個(gè)人當(dāng)面試官的經(jīng)驗(yàn),總結(jié)幾個(gè)必須要掌握的知識(shí)點(diǎn)。 介紹:Redis 是一個(gè)開(kāi)源的使用 ANSI C 語(yǔ)言編寫(xiě)、遵守 BSD 協(xié)議、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value 數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的 API的非關(guān)系型數(shù)據(jù)庫(kù)。 傳統(tǒng)數(shù)據(jù)庫(kù)遵循 ACID 規(guī)則。而 Nosql(Not Only SQL 的縮寫(xiě),是對(duì)不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)管理系統(tǒng)的統(tǒng)稱) 一般為分布式而分布式一般遵循 CAP 定理。 Github 源碼:github.com/antirez/red… Redis 官網(wǎng):redis.io/

      Redis支持的數(shù)據(jù)類(lèi)型?

      String字符串: 格式: set key value string類(lèi)型是二進(jìn)制安全的。意思是redis的string可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對(duì)象 。 string類(lèi)型是Redis最基本的數(shù)據(jù)類(lèi)型,一個(gè)鍵最大能存儲(chǔ)512MB。 Hash(哈希) 格式: hmset name key1 value1 key2 value2 Redis hash 是一個(gè)鍵值(key=>value)對(duì)集合。 Redis hash是一個(gè)string類(lèi)型的field和value的映射表,hash特別適合用于存儲(chǔ)對(duì)象。

      List(列表) Redis 列表是簡(jiǎn)單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊) 格式: lpush name value 在 key 對(duì)應(yīng) list 的頭部添加字符串元素 格式: rpush name value 在 key 對(duì)應(yīng) list 的尾部添加字符串元素 格式: lrem name index key 對(duì)應(yīng) list 中刪除 count 個(gè)和 value 相同的元素 格式: llen name

      返回 key 對(duì)應(yīng) list 的長(zhǎng)度

      Set(集合) 格式: sadd name value Redis的Set是string類(lèi)型的無(wú)序集合。 集合是通過(guò)哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。

      zset(sorted set:有序集合) 格式: zadd name score value Redis zset 和 set 一樣也是string類(lèi)型元素的集合,且不允許重復(fù)的成員。 不同的是每個(gè)元素都會(huì)關(guān)聯(lián)一個(gè)double類(lèi)型的分?jǐn)?shù)。redis正是通過(guò)分?jǐn)?shù)來(lái)為集合中的成員進(jìn)行從小到大的排序。 zset的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。

      什么是Redis持久化?Redis有哪幾種持久化方式??jī)?yōu)缺點(diǎn)是什么?

      持久化就是把內(nèi)存的數(shù)據(jù)寫(xiě)到磁盤(pán)中去,防止服務(wù)宕機(jī)了內(nèi)存數(shù)據(jù)丟失。 Redis 提供了兩種持久化方式:RDB(默認(rèn)) 和AOF RDB:

      rdb是Redis DataBase縮寫(xiě) 功能核心函數(shù)rdbSave(生成RDB文件)和rdbLoad(從文件加載內(nèi)存)兩個(gè)函數(shù) AOF: Aof是Append-only file縮寫(xiě) 每當(dāng)執(zhí)行服務(wù)器(定時(shí))任務(wù)或者函數(shù)時(shí)flushAppendOnlyFile 函數(shù)都會(huì)被調(diào)用, 這個(gè)函數(shù)執(zhí)行以下兩個(gè)工作 aof寫(xiě)入保存: WRITE:根據(jù)條件,將 aof_buf 中的緩存寫(xiě)入到 AOF 文件 SAVE:根據(jù)條件,調(diào)用 fsync 或 fdatasync 函數(shù),將 AOF 文件保存到磁盤(pán)中。 存儲(chǔ)結(jié)構(gòu): 內(nèi)容是redis通訊協(xié)議(RESP )格式的命令文本存儲(chǔ)。 比較:

      aof文件比rdb更新頻率高,優(yōu)先使用aof還原數(shù)據(jù)。

      aof比rdb更安全也更大

      rdb性能比aof好

      如果兩個(gè)都配了優(yōu)先加載AOF

      剛剛上面你有提到redis通訊協(xié)議(RESP ),能解釋下什么是RESP?有什么特點(diǎn)?

      (可以看到很多面試其實(shí)都是連環(huán)炮,面試官其實(shí)在等著你回答到這個(gè)點(diǎn),如果你答上了對(duì)你的評(píng)價(jià)就又加了一分)

      RESP 是redis客戶端和服務(wù)端之前使用的一種通訊協(xié)議; RESP 的特點(diǎn): 實(shí)現(xiàn)簡(jiǎn)單、快速解析、可讀性好

      For Simple Strings the first byte of the reply is "+" 回復(fù)

      For Errors the first byte of the reply is "-" 錯(cuò)誤

      For Integers the first byte of the reply is ":" 整數(shù)

      For Bulk Strings the first byte of the reply is "$" 字符串

      For Arrays the first byte of the reply is "*" 數(shù)組

      Redis 有哪些架構(gòu)模式?講講各自的特點(diǎn)

      單機(jī)版

      特點(diǎn):簡(jiǎn)單 問(wèn)題: 1、內(nèi)存容量有限 2、處理能力有限 3、無(wú)法高可用。

      主從復(fù)制

      Redis 的復(fù)制(replication)功能允許用戶根據(jù)一個(gè) Redis 服務(wù)器來(lái)創(chuàng)建任意多個(gè)該服務(wù)器的復(fù)制品,其中被復(fù)制的服務(wù)器為主服務(wù)器(master),而通過(guò)復(fù)制創(chuàng)建出來(lái)的服務(wù)器復(fù)制品則為從服務(wù)器(slave)。 只要主從服務(wù)器之間的網(wǎng)絡(luò)連接正常,主從服務(wù)器兩者會(huì)具有相同的數(shù)據(jù),主服務(wù)器就會(huì)一直將發(fā)生在自己身上的數(shù)據(jù)更新同步 給從服務(wù)器,從而一直保證主從服務(wù)器的數(shù)據(jù)相同。 特點(diǎn):

      master/slave 角色

      master/slave 數(shù)據(jù)相同

      降低 master 讀壓力在轉(zhuǎn)交從庫(kù)

      問(wèn)題:

      無(wú)法保證高可用

      沒(méi)有解決 master 寫(xiě)的壓力

      哨兵

      Redis sentinel 是一個(gè)分布式系統(tǒng)中監(jiān)控 redis 主從服務(wù)器,并在主服務(wù)器下線時(shí)自動(dòng)進(jìn)行故障轉(zhuǎn)移。其中三個(gè)特性:

      監(jiān)控(Monitoring): Sentinel 會(huì)不斷地檢查你的主服務(wù)器和從服務(wù)器是否運(yùn)作正常。

      提醒(Notification): 當(dāng)被監(jiān)控的某個(gè) Redis 服務(wù)器出現(xiàn)問(wèn)題時(shí), Sentinel 可以通過(guò) API 向管理員或者其他應(yīng)用程序發(fā)送通知。

      自動(dòng)故障遷移(Automatic failover): 當(dāng)一個(gè)主服務(wù)器不能正常工作時(shí), Sentinel 會(huì)開(kāi)始一次自動(dòng)故障遷移操作。

      特點(diǎn):

      保證高可用

      監(jiān)控各個(gè)節(jié)點(diǎn)

      互聯(lián)網(wǎng)公司面試必問(wèn)的Redis題目

      自動(dòng)故障遷移

      缺點(diǎn):主從模式,切換需要時(shí)間丟數(shù)據(jù)

      沒(méi)有解決 master 寫(xiě)的壓力

      集群(proxy 型):

      Twemproxy 是一個(gè) Twitter 開(kāi)源的一個(gè) redis 和 memcache 快速/輕量級(jí)代理服務(wù)器; Twemproxy 是一個(gè)快速的單線程代理程序,支持 Memcached ASCII 協(xié)議和 redis 協(xié)議。

      特點(diǎn):

      多種 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins

      支持失敗節(jié)點(diǎn)自動(dòng)刪除

      后端 Sharding 分片邏輯對(duì)業(yè)務(wù)透明,業(yè)務(wù)方的讀寫(xiě)方式和操作單個(gè) Redis 一致

      缺點(diǎn):

      增加了新的 proxy,需要維護(hù)其高可用。

      failover 邏輯需要自己實(shí)現(xiàn),其本身不能支持故障的自動(dòng)轉(zhuǎn)移可擴(kuò)展性差,進(jìn)行擴(kuò)縮容都需要手動(dòng)干預(yù)

      集群(直連型):

      從redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用無(wú)中心結(jié)構(gòu),每個(gè)節(jié)點(diǎn)保存數(shù)據(jù)和整個(gè)集群狀態(tài),每個(gè)節(jié)點(diǎn)都和其他所有節(jié)點(diǎn)連接。

      特點(diǎn):

      無(wú)中心架構(gòu)(不存在哪個(gè)節(jié)點(diǎn)影響性能瓶頸),少了 proxy 層。

      數(shù)據(jù)按照 slot 存儲(chǔ)分布在多個(gè)節(jié)點(diǎn),節(jié)點(diǎn)間數(shù)據(jù)共享,可動(dòng)態(tài)調(diào)整數(shù)據(jù)分布。

      可擴(kuò)展性,可線性擴(kuò)展到 1000 個(gè)節(jié)點(diǎn),節(jié)點(diǎn)可動(dòng)態(tài)添加或刪除。

      高可用性,部分節(jié)點(diǎn)不可用時(shí),集群仍可用。通過(guò)增加 Slave 做備份數(shù)據(jù)副本

      實(shí)現(xiàn)故障自動(dòng) failover,節(jié)點(diǎn)之間通過(guò) gossip 協(xié)議交換狀態(tài)信息,用投票機(jī)制完成 Slave到 Master的角色提升。

      缺點(diǎn):

      資源隔離性較差,容易出現(xiàn)相互影響的情況。

      數(shù)據(jù)通過(guò)異步復(fù)制,不保證數(shù)據(jù)的強(qiáng)一致性

      什么是一致性哈希算法?什么是哈希槽?

      這兩個(gè)問(wèn)題篇幅過(guò)長(zhǎng) 網(wǎng)上找了兩個(gè)解鎖的不錯(cuò)的文章

      www.cnblogs.com/lpfuture/p/…

      blog.csdn.net/z1573262158…

      Redis是基于CAP理論的,什么是CAP理論?

      可以參考我的上一篇文章。

      如果有人問(wèn)你CAP理論是什么,就把這篇文章發(fā)給他。

      Redis常用命令?

      Keys pattern 表示區(qū)配所有 以bit開(kāi)頭的 查看Exists key是否存在

      Set 設(shè)置 key 對(duì)應(yīng)的值為 string 類(lèi)型的 value。

      setnx 設(shè)置 key 對(duì)應(yīng)的值為 string 類(lèi)型的 value。如果 key 已經(jīng)存在,返回 0,nx 是 not exist 的意思。 刪除某個(gè)key 第一次返回1 刪除了 第二次返回0

      Expire 設(shè)置過(guò)期時(shí)間(單位秒)

      TTL 查看剩下多少時(shí)間

      Setex 設(shè)置 key 對(duì)應(yīng)的值為 string 類(lèi)型的 value,并指定此鍵值對(duì)應(yīng)的有效期。

      Mset 一次設(shè)置多個(gè) key 的值,成功返回 ok 表示所有的值都設(shè)置了,失敗返回 0 表示沒(méi)有任何值被設(shè)置。

      Getset 設(shè)置 key 的值,并返回 key 的舊值。

      Mget 一次獲取多個(gè) key 的值,如果對(duì)應(yīng) key 不存在,則對(duì)應(yīng)返回 nil。

      Incr 對(duì) key 的值做加加操作,并返回新的值。注意 incr 一個(gè)不是 int 的 value 會(huì)返回錯(cuò)誤,incr 一個(gè)不存在的 key,則設(shè)置 key 為 1

      incrby 同 incr 類(lèi)似,加指定值 ,key 不存在時(shí)候會(huì)設(shè)置 key,并認(rèn)為原來(lái)的 value 是 0

      Decr 對(duì) key 的值做的是減減操作,decr 一個(gè)不存在 key,則設(shè)置 key 為-1

      Decrby 同 decr,減指定值。

      Append 給指定 key 的字符串值追加 value,返回新字符串值的長(zhǎng)度。

      Strlen 取指定 key 的 value 值的長(zhǎng)度。

      persist 取消過(guò)期時(shí)間

      Select 選擇數(shù)據(jù)庫(kù)

      Randomkey 隨機(jī)返回一個(gè)key

      Rename 重命名

      Type 返回?cái)?shù)據(jù)類(lèi)型

      使用過(guò)Redis分布式鎖么,它是怎么實(shí)現(xiàn)的?

      先拿setnx來(lái)爭(zhēng)搶鎖,搶到之后,再用expire給鎖加一個(gè)過(guò)期時(shí)間防止鎖忘記了釋放。 如果在setnx之后執(zhí)行expire之前進(jìn)程意外crash或者要重啟維護(hù)了,那會(huì)怎么樣? set指令有非常復(fù)雜的參數(shù),這個(gè)應(yīng)該是可以同時(shí)把setnx和expire合成一條指令來(lái)用的!

      使用過(guò)Redis做異步隊(duì)列么,你是怎么用的?有什么缺點(diǎn)?

      一般使用list結(jié)構(gòu)作為隊(duì)列,rpush生產(chǎn)消息,lpop消費(fèi)消息。當(dāng)lpop沒(méi)有消息的時(shí)候,要適當(dāng)sleep一會(huì)再重試。 缺點(diǎn): 在消費(fèi)者下線的情況下,生產(chǎn)的消息會(huì)丟失,得使用專業(yè)的消息隊(duì)列如rabbitmq等。 能不能生產(chǎn)一次消費(fèi)多次呢? 使用pub/sub主題訂閱者模式,可以實(shí)現(xiàn)1:N的消息隊(duì)列。

      什么是緩存穿透?如何避免?什么是緩存雪崩?何如避免?

      緩存穿透 一般的緩存系統(tǒng),都是按照key去緩存查詢,如果不存在對(duì)應(yīng)的value,就應(yīng)該去后端系統(tǒng)查找(比如DB)。一些惡意的請(qǐng)求會(huì)故意查詢不存在的key,請(qǐng)求量很大,就會(huì)對(duì)后端系統(tǒng)造成很大的壓力。這就叫做緩存穿透。 如何避免? 1:對(duì)查詢結(jié)果為空的情況也進(jìn)行緩存,緩存時(shí)間設(shè)置短一點(diǎn),或者該key對(duì)應(yīng)的數(shù)據(jù)insert了之后清理緩存。 2:對(duì)一定不存在的key進(jìn)行過(guò)濾。可以把所有的可能存在的key放到一個(gè)大的Bitmap中,查詢時(shí)通過(guò)該bitmap過(guò)濾。 緩存雪崩 當(dāng)緩存服務(wù)器重啟或者大量緩存集中在某一個(gè)時(shí)間段失效,這樣在失效的時(shí)候,會(huì)給后端系統(tǒng)帶來(lái)很大壓力。導(dǎo)致系統(tǒng)崩潰。 如何避免?

      1:在緩存失效后,通過(guò)加鎖或者隊(duì)列來(lái)控制讀數(shù)據(jù)庫(kù)寫(xiě)緩存的線程數(shù)量。比如對(duì)某個(gè)key只允許一個(gè)線程查詢數(shù)據(jù)和寫(xiě)緩存,其他線程等待。 2:做二級(jí)緩存,A1為原始緩存,A2為拷貝緩存,A1失效時(shí),可以訪問(wèn)A2,A1緩存失效時(shí)間設(shè)置為短期,A2設(shè)置為長(zhǎng)期 3:不同的key,設(shè)置不同的過(guò)期時(shí)間,讓緩存失效的時(shí)間點(diǎn)盡量均勻

      內(nèi)容比較多整理一個(gè)腦圖,方便大家記憶。

      好了,祝大家面試順利!

      Redis 數(shù)據(jù)庫(kù) 數(shù)據(jù)結(jié)構(gòu)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:華為云企業(yè)級(jí)Redis揭秘第九期:高斯Redis與HBase對(duì)比優(yōu)勢(shì)
      下一篇:Spark性能優(yōu)化 (2) | 算子調(diào)優(yōu)
      相關(guān)文章
      亚洲国产午夜精品理论片在线播放| 久久精品国产亚洲麻豆| 亚洲综合色一区二区三区| 亚洲国产一成人久久精品| 亚洲第一区在线观看| 久久亚洲国产成人精品性色| 亚洲天堂免费在线| 亚洲成a人片在线观看无码| 国产亚洲一区二区三区在线观看| 亚洲精品久久久www| 亚洲精品国产高清嫩草影院| 亚洲伊人色一综合网| 亚洲精品日韩专区silk| 亚洲婷婷综合色高清在线| 亚洲理论在线观看| 亚洲国产精品网站久久| 在线亚洲精品自拍| 自拍偷自拍亚洲精品第1页| 亚洲另类激情综合偷自拍图| 亚洲äv永久无码精品天堂久久 | 亚洲日韩涩涩成人午夜私人影院| 亚洲人成网站999久久久综合| 亚洲AV永久纯肉无码精品动漫| 亚洲精品成人片在线观看精品字幕| 亚洲色大成网站WWW久久九九| 日批日出水久久亚洲精品tv| 亚洲午夜成激人情在线影院| 亚洲激情校园春色| 亚洲人成免费网站| 亚洲私人无码综合久久网| 综合一区自拍亚洲综合图区| 亚洲国产成人久久99精品| 久久精品国产亚洲AV大全| 亚洲国产成人精品久久| 91久久亚洲国产成人精品性色| 亚洲免费电影网站| 亚洲不卡视频在线观看| 亚洲成人福利在线| 亚洲国产精品无码第一区二区三区 | 亚洲性色AV日韩在线观看| 亚洲第一中文字幕|