1. redis面試cheatsheet

        共 1980字,需瀏覽 4分鐘

         ·

        2021-11-15 13:52




        本文總結(jié)一下redis面試中常見考點(diǎn),如果細(xì)節(jié)不懂可以自行搜索相關(guān)文章進(jìn)行詳細(xì)了解。
        后續(xù)如果還有其他常見題還會(huì)進(jìn)行補(bǔ)充,歡迎大家持續(xù)關(guān)注。


        redis的幾種數(shù)據(jù)結(jié)構(gòu)?

        string、list、hash、set、sorted set
        string是二進(jìn)制安全的,底層用的是sds(簡(jiǎn)單動(dòng)態(tài)字符串,自己實(shí)現(xiàn)的數(shù)據(jù)結(jié)構(gòu))
        list可以支持左右插入和刪除,底層是雙向鏈表
        hash、set底層是hashtable,通過掛鏈表解決沖突問題
        sorted set有一個(gè)score來進(jìn)行排序,底層是跳表
        ziplist對(duì)數(shù)據(jù)做了一些編碼,提高內(nèi)存使用率,在list,hash,sorted set初始時(shí)都是ziplist存儲(chǔ),達(dá)到某些條件才轉(zhuǎn)換成正常數(shù)據(jù)結(jié)構(gòu)。


        redis腳本如何使用?

        使用lua解釋器來執(zhí)行腳本,使用eval命令
        腳本可以方便地實(shí)現(xiàn)很多功能,比如唯一隊(duì)列
        lua可以保證命令的原子性


        redis實(shí)現(xiàn)分布式鎖?

        加鎖:setnx,注意要有過期時(shí)間,防止一直死鎖
        過期時(shí)間可以隨機(jī),防止雪崩
        set key value ex nx
        釋放鎖:get & del,為了保證原子性,放在lua里執(zhí)行


        java常用的redis客戶端?

        jedis:阻塞IO,同步,線程不安全,需要連接池,僅支持基本數(shù)據(jù)類型
        lettuce:異步,線程安全,基于netty框架的事件驅(qū)動(dòng),可以用單個(gè)lettuce連接來完成各種操作。
        redission:和lettuce類似,還提供了很多分布式服務(wù)。
        springboot中用rest template,底層默認(rèn)是lettuce。


        redis單線程?

        redis在進(jìn)行數(shù)據(jù)操作的時(shí)候是單線程,用隊(duì)列將并行變成串行,因?yàn)閿?shù)據(jù)都在內(nèi)存中,單線程操作不需要切換上下文,不需要加鎖,效率最高。
        對(duì)于數(shù)據(jù)在磁盤或者網(wǎng)絡(luò)這種IO比較慢的可以考慮多線程。


        redis過期策略?

        惰性刪除,過期了不刪,get的時(shí)候刪除。缺點(diǎn)是如果不get就會(huì)一直留在內(nèi)存中。
        定期刪除,可以在redis.conf里面配置頻率或者內(nèi)存最大值。
        redis采用惰性刪除+定期刪除


        redis持久化方案?

        首先,redis的優(yōu)勢(shì)不在持久化,而在緩存功能,強(qiáng)依賴持久化可以用數(shù)據(jù)庫,放在redis的數(shù)據(jù)必須考慮它可能會(huì)丟失。
        RDB:定期存儲(chǔ),保存數(shù)據(jù)本身
        AOF:保存寫操作日志
        AOF一般大于RDB,性能更低。


        redis雪崩,擊穿?

        擊穿:key過期,key被淘汰。從數(shù)據(jù)庫重新load值。
        雪崩:大量key在同一時(shí)間過期。
        如果key過期與時(shí)間無關(guān),可以用隨機(jī)過期時(shí)間
        如果不行,根據(jù)業(yè)務(wù),第一個(gè)線程更新所有key


        redis發(fā)布訂閱底層如何實(shí)現(xiàn)的?

        subcribe channel
        publish channel message
        服務(wù)端進(jìn)程中有一個(gè)字典,保存了每個(gè)channel訂閱的client list,publish channel message的時(shí)候,服務(wù)端會(huì)找到所有訂閱channel的client,進(jìn)行消息發(fā)送。


        redis運(yùn)維常用方法

        連接可以用cli,沒裝cli也可以用telnet連接
        info memory查看內(nèi)存
        線上keys *等命令非常危險(xiǎn),數(shù)據(jù)量大的時(shí)候容易阻塞,可以通過重命名或者禁用危險(xiǎn)命令。


        redis做了哪些提升性能的事情?

        redis單線程模型
        redis管道,多條命令打包一次性發(fā)送給服務(wù)端
        ziplist提高存儲(chǔ)效率


        redis集群模式

        主從模式:master讀寫,slave只讀,master同步數(shù)據(jù)到slave,master掛了不會(huì)再提供寫服務(wù),也不會(huì)重新選舉master,只能等master恢復(fù)
        哨兵模式:基于主從模式之上,加入哨兵,哨兵會(huì)重新選舉master。哨兵也可以是集群,哨兵每秒發(fā)送PING命令給master,slave和哨兵。哨兵發(fā)現(xiàn)PING命令沒有返回會(huì)認(rèn)為主觀下線,向其他哨兵確認(rèn),超過一定數(shù)量主觀下線后會(huì)認(rèn)為客觀下線。在這種模式下,客戶端連接哨兵。
        集群模式:如果數(shù)據(jù)量過大,單機(jī)放不下,就需要集群模式,該模式會(huì)將數(shù)據(jù)分片。
        現(xiàn)在大家一般用云上redis,很少自己搭建集群了。


        考點(diǎn):一致性Hash,問集群模式的時(shí)候可能會(huì)問到一致性Hash。

        數(shù)據(jù)Hash對(duì)2^32取模,節(jié)點(diǎn)Hash對(duì)2^32取模,映射到Hash環(huán)上,數(shù)據(jù)順時(shí)針找到最近節(jié)點(diǎn)進(jìn)行存儲(chǔ)。主要解決節(jié)點(diǎn)增加或者減少,不會(huì)導(dǎo)致大量數(shù)據(jù)緩存失效,造成雪崩。數(shù)據(jù)傾斜問題可以用虛擬節(jié)點(diǎn)解決。


        redis適用場(chǎng)景?

        分布式鎖
        session共享,如單點(diǎn)登錄
        分布式業(yè)務(wù)緩存
        排行榜sorted set
        簡(jiǎn)單消息,發(fā)布訂閱


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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
          
          

            1. 秋霞色情影音 | 全黄裸体做爰视频 | 摘花xxxx过程xxxx | 野外伦理片 | 亚洲成人性爱在线 |