大家好伤锚,我是漫步coding, 最近在整理2022年Redis最新面試題, 大家也可以通過我下面的博客地址在線閱讀, 今天講講第1篇 - Redis基礎(chǔ)知識绰筛。本文首發(fā)于公眾號: 漫步coding
2022年Redis最新面試題目錄
Redis基礎(chǔ)知識
Redis數(shù)據(jù)結(jié)構(gòu)
Redis事務(wù)
Redis數(shù)據(jù)持久化
Redis集群
Redis淘汰策略
Redis分布式鎖
Redis緩存問題
運維和部署
Redis基礎(chǔ)知識
什么是 Redis, 有哪些優(yōu)缺點?
Redis 最適合的場景, 可以簡單的說說嗎?
Redis 相比 Memcached 有哪些優(yōu)勢饶辙?
一個字符串類型的值能存儲最大容量是多少嗽桩?
Redis 讀寫分離
什么是 Redis, 有哪些優(yōu)缺點?
出現(xiàn)概率: ★★★★
Redis是一個非關(guān)系性數(shù)據(jù)庫, 開源的睹限、使用C語言編寫晚伙、支持網(wǎng)絡(luò)颖低、可基于內(nèi)存亦可持久化的日志型怨规、key-value(鍵值對)數(shù)據(jù)庫陌宿,是目前分布式架構(gòu)中不可或缺的一環(huán)。
Redis服務(wù)器程序是單進程模型波丰,也就是在一臺服務(wù)器上可以同時啟動多個Redis進程壳坪,而Redis的實際處理速度則完全依靠于主進程的的執(zhí)行效率。若在服務(wù)器上只運行一個Redis進程掰烟,當多個客戶端同時訪問時爽蝴,服務(wù)器的處理能力會有一定程度的下降沐批,若在同一臺服務(wù)器上開啟多個Redis進程,Redis在提高并發(fā)處理能力的同時會給服務(wù)器的CPU造成很大壓力蝎亚。也就是說九孩,在實際生產(chǎn)環(huán)境中,需要根據(jù)實際的需求來決定開啟多少個Redis進程发框。若對高并發(fā)要求更高一些躺彬,可能會考慮在同一臺服務(wù)器上開啟多個進程。若CPU資源比較緊張梅惯,采用單進程即可宪拥。
Redis優(yōu)點:
1)、性能極高, 讀寫性能優(yōu)異个唧,從內(nèi)存當中進行IO讀寫速度快江解。
2)、支持數(shù)據(jù)的持久化(支持AOF和RDB兩種持久化方式)徙歼,對數(shù)據(jù)的更新采用Copy-on-write技術(shù)(寫拷貝)犁河,可以異步的保存在磁盤上
由于Redis的數(shù)據(jù)都存放在內(nèi)存中,如果沒有配置持久化魄梯,redis重啟后數(shù)據(jù)就全丟失了桨螺,于是需要開啟redis的持久化功能,將數(shù)據(jù)保存到磁 盤上酿秸,當redis重啟后灭翔,可以從磁盤中恢復(fù)數(shù)據(jù)。
redis提供兩種方式進行持久化辣苏,一種是RDB持久化:指在指定的時間間隔內(nèi)將內(nèi)存中的數(shù)據(jù)集快照寫入磁盤肝箱,實際操作過程是fork一個子進程,先將數(shù)據(jù)集寫入臨時文件稀蟋,寫入成功后煌张,再替換之前的文件,用二進制壓縮存儲退客。
還有一種是AOF持久化:以日志的形式記錄服務(wù)器所處理的每一個寫骏融、刪除操作,查詢操作不會記錄萌狂,以文本的方式記錄档玻,可以打開文件看到詳細的操作記錄。
3)茫藏、支持主從復(fù)制误趴,主機會自動將數(shù)據(jù)同步到從機,可以進行讀寫分離务傲。
4)凉当、數(shù)據(jù)結(jié)構(gòu)豐富:除了支持string類型的value外還支持string碧囊、hash、set纤怒、sortedset糯而、list等數(shù)據(jù)結(jié)構(gòu)。
5)泊窘、原子性:多個操作通過MULTI和EXEC指令支持事務(wù)
Redis缺點:
1)熄驼、主從同步,如果主機宕機烘豹,宕機前有一部分數(shù)據(jù)沒有同步到從機瓜贾,會導(dǎo)致數(shù)據(jù)不一致。
2)携悯、主從同步祭芦,數(shù)據(jù)同步會有延遲。
3)憔鬼、讀寫分離龟劲,主機寫的負載量太大,也會導(dǎo)致主機的宕機
4)轴或、數(shù)據(jù)庫容量受到物理內(nèi)存的限制昌跌,不能用作海量數(shù)據(jù)的高性能讀寫
Redis 最適合的場景, 可以簡單的說說嗎?
出現(xiàn)概率: ★★★★
1、會話緩存(Session Cache)最常用的一種使用Redis的情景是會話緩存(session cache), Redis緩存會話比其他存儲(如Memcached)的優(yōu)勢在于:Redis提供持久化照雁。
2蚕愤、排行榜/計數(shù)器
Redis在內(nèi)存中對數(shù)字進行遞增或遞減的操作實現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執(zhí)行這些操作的時候變的非常簡單饺蚊,Redis只是正好提供了這兩種數(shù)據(jù)結(jié)構(gòu)萍诱。
3、發(fā)布/訂閱
Redis的發(fā)布/訂閱功能污呼。發(fā)布/訂閱的使用場景確實非常多裕坊。我已看見人們在社交網(wǎng)絡(luò)連接中使用,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器曙求,甚至用Redis的發(fā)布/訂閱功能來建立聊天系統(tǒng)碍庵!
4映企、緩存熱數(shù)據(jù)
可以緩存一些高頻讀, 低頻寫的內(nèi)容悟狱, 比如app首頁一些設(shè)置等。
5堰氓、利用BitMap統(tǒng)計用戶簽到挤渐、統(tǒng)計活躍用戶、用戶在線狀態(tài)等
Redis從2.2.0版本開始新增了setbit,getbit,bitcount等幾個bitmap相關(guān)命令双絮。雖然是新命令浴麻,但是并沒有新增新的數(shù)據(jù)類型得问,因為setbit等命令只不過是在set上的擴展。
可以利用BitMap統(tǒng)計用戶簽到软免、統(tǒng)計活躍用戶宫纬、用戶在線狀態(tài)
6、限速膏萧,接口訪問頻率限制:比如發(fā)送短信驗證碼的接口漓骚,通常為了防止別人惡意頻刷,會限制用戶每分鐘獲取驗證碼的頻率榛泛,例如一分鐘不能超過 5 次蝌蹂。
假設(shè)用于數(shù)據(jù)量上億的場景下,例如幾億用戶系統(tǒng)的簽到曹锨,去重登錄次數(shù)統(tǒng)計孤个,某用戶是否在線狀態(tài)等等。騰訊10億用戶沛简,要幾個毫秒內(nèi)查詢到某個用戶是否在線齐鲤,能怎么做?
千萬別說給每個用戶建立一個key椒楣,然后挨個記(你可以算一下需要的內(nèi)存會很恐怖佳遂,而且這種類似的需求很多。這里要用到位操作——使用setbit撒顿、getbit丑罪、bitcount命令。原理是:
redis內(nèi)構(gòu)建一個足夠長的數(shù)組凤壁,每個數(shù)組元素只能是0和1兩個值吩屹,然后這個數(shù)組的下標index用來表示用戶id(必須是數(shù)字哈),那么很顯然拧抖,這個幾億長的大數(shù)組就能通過下標和元素值(0和1)來構(gòu)建一個記憶系統(tǒng)煤搜。
Redis key name 約定
$dayKey?='login:'.\date('Ymd',\time());
Redis 數(shù)據(jù)結(jié)構(gòu)
這里需要注意的是Redis中字符串限制最大為512MB,所以位圖中最大可以設(shè)置2^32個不同的位(42.9億個)唧席。圖位的最小單位是比特(bit)擦盾,每個bit的值只能是0或1。同時注意setbit時的偏移量淌哟,當偏移量很大時迹卢,可能會有較大耗時。位圖不是絕對的好徒仓,有時可能更浪費空間腐碱。
127.0.0.1:6379>setbit'login-20220405'21
127.0.0.1:6379>setbit'login-20220405'1001
(integer)1
127.0.0.1:6379>setbit'login-20220405'2000000001
(integer)1
127.0.0.1:6379>setbit'login-20220405'42900000001
(integer)1
127.0.0.1:6379>setbit'login-20220405'43000000001
(error)?ERR?bit?offset?isnotan?integerorout?of?range
127.0.0.1:6379>getbit'login-20220405'100
(integer)1
127.0.0.1:6379>getbit'login-20220405'101
(integer)0
127.0.0.1:6379>
Redis 相比 Memcached 有哪些優(yōu)勢?
出現(xiàn)概率: ★★★
如果簡單地比較Redis與Memcached的區(qū)別掉弛,大多數(shù)都會得到以下觀點:
1 症见、數(shù)據(jù)支持類型 Memcache 對數(shù)據(jù)類型支持相對簡單喂走。Redis 有復(fù)雜的數(shù)據(jù)類型。Redis不僅僅支持簡單的k/v類型的數(shù)據(jù)谋作,同時還提供list芋肠,set,zset遵蚜,hash等數(shù)據(jù)結(jié)構(gòu)的存儲业栅。
2 、Redis支持數(shù)據(jù)的備份谬晕,即master-slave模式的數(shù)據(jù)備份碘裕。
3 、存儲方式 Memecache 把數(shù)據(jù)全部存在內(nèi)存之中攒钳, 斷電后會掛掉帮孔, 數(shù)據(jù)不能超過內(nèi)存大小。Redis支持數(shù)據(jù)的持久化不撑,可以將內(nèi)存中的數(shù)據(jù)保持在磁盤中文兢,重啟的時候可以再次加載進行使用。
一個字符串類型的值能存儲最大容量是多少焕檬?
Redis中字符串限制最大為512MB
Redis 讀寫分離
出現(xiàn)概率: ★★★
讀取請求QPS(Queries Per Second)壓力較大的服務(wù), 可以采用Redis讀寫分離姆坚,可以提供高可用、高性能实愚、靈活的讀寫分離服務(wù)兼呵,滿足熱點數(shù)據(jù)集中及高并發(fā)讀取的業(yè)務(wù)需求,最大化地節(jié)約運維成本腊敲。
讀寫分離版采取鏈式復(fù)制架構(gòu)击喂,可以通過擴展只讀實例個數(shù)使整體實例性能呈線性增長,同時基于源碼層面對Redis復(fù)制流程的定制優(yōu)化碰辅,可以最大程度地提升線性復(fù)制的系統(tǒng)穩(wěn)定性懂昂,充分利用每一個只讀節(jié)點的物理資源。
由于數(shù)據(jù)同步至只讀節(jié)點存在一定延遲没宾,且采用鏈式復(fù)制凌彬,只讀節(jié)點數(shù)越多,靠近鏈路末端的只讀節(jié)點數(shù)據(jù)延遲越大循衰,因此選用此架構(gòu)時铲敛,業(yè)務(wù)需要能接受一定程度的臟數(shù)據(jù)。如果對數(shù)據(jù)一致性要求較高羹蚣,推薦選用集群架構(gòu)原探。
你知道怎么用Redis實現(xiàn)實現(xiàn)分布式鎖?
出現(xiàn)概率: ★★★★
Redis 官方站提出了一種權(quán)威的基于 Redis 實現(xiàn)分布式鎖的方式名叫Redlock乱凿,此種方式比原先的單節(jié)點的方法更安全顽素。它可以保證以下特性:
安全特性:互斥訪問咽弦,即永遠只有一個client能拿到鎖
避免死鎖:最終 client 都可能拿到鎖,不會出現(xiàn)死鎖的情況胁出,即使原本鎖住某資源的 client crash 了或者出現(xiàn)了網(wǎng)絡(luò)分區(qū)
容錯性:只要大部分 Redis 節(jié)點存活就可以正常提供服務(wù)型型。
也歡迎關(guān)注我的公眾號:?漫步coding。一起交流, 在coding的世界里漫步, 回復(fù):?redis, 免費獲取最新Redis面試題(含答案)全蝶。