繼續(xù)Java最全面試題答案系列篇,之前分享了mysql、spring辅柴、多線程等最全答案,文末有相關(guān)獲取方式哦~
Redis支持哪幾種數(shù)據(jù)類型瞭吃?
支持多種類型的數(shù)據(jù)結(jié)構(gòu)
1.string:最基本的數(shù)據(jù)類型碌嘀,二進制安全的字符串,最大512M歪架。
2.list:按照添加順序保持順序的字符串列表筏餐。
3.set:無序的字符串集合,不存在重復的元素牡拇。
4.sorted set:已排序的字符串集合魁瞪。
5.hash:key-value對的一種集合。
Redis主要有哪些功能惠呼?
1.哨兵(Sentinel)和復制(Replication)
Redis服務器毫無征兆的罷工是個麻煩事导俘,如何保證備份的機器是原始服務器的完整備份呢?這時候就需要哨兵和復制剔蹋。
Sentinel可以管理多個Redis服務器旅薄,它提供了監(jiān)控,提醒以及自動的故障轉(zhuǎn)移的功能泣崩,Replication則是負責讓一個Redis服務器可以配備多個備份的服務器少梁。
Redis也是利用這兩個功能來保證Redis的高可用的
2.事務
很多情況下我們需要一次執(zhí)行不止一個命令,而且需要其同時成功或者失敗矫付。redis對事務的支持也是源自于這部分需求凯沪,即支持一次性按順序執(zhí)行多個命令的能力,并保證其原子性买优。
3.LUA腳本
在事務的基礎(chǔ)上妨马,如果我們需要在服務端一次性的執(zhí)行更復雜的操作(包含一些邏輯判斷)挺举,則lua就可以排上用場了
4.持久化
redis的持久化指的是redis會把內(nèi)存的中的數(shù)據(jù)寫入到硬盤中,在redis重新啟動的時候加載這些數(shù)據(jù)烘跺,從而最大限度的降低緩存丟失帶來的影響湘纵。
5.集群(Cluster)
單臺服務器資源的總是有上限的,CPU資源和IO資源我們可以通過主從復制滤淳,進行讀寫分離梧喷,把一部分CPU和IO的壓力轉(zhuǎn)移到從服務器上,這也有點類似mysql數(shù)據(jù)庫的主從同步脖咐。
在Redis官方的分布式方案出來之前伤柄,有twemproxy和codis兩種方案,這兩個方案總體上來說都是依賴proxy來進行分布式的文搂,下面的內(nèi)容有具體集群方案詳解。
Redis是單進程單線程的秤朗?
Redis是單進程單線程的煤蹭,Redis利用隊列技術(shù)將并發(fā)訪問變?yōu)榇性L問,消除了傳統(tǒng)數(shù)據(jù)庫串行控制的開銷取视。
Redis為什么是單線程的硝皂?
多線程處理會涉及到鎖,而且多線程處理會涉及到線程切換而消耗CPU作谭。因為CPU不是Redis的瓶頸稽物,Redis的瓶頸最有可能是機器內(nèi)存或者網(wǎng)絡(luò)帶寬。單線程無法發(fā)揮多核CPU性能折欠,不過可以通過在單機開多個Redis實例來解決贝或。
其它開源軟件采用的模型
Nginx:多進程單線程模型
Memcached:單進程多線程模型
使用Redis的優(yōu)勢?
1.速度快锐秦,因為數(shù)據(jù)存在內(nèi)存中咪奖,類似于HashMap,HashMap的優(yōu)勢就是查找和操作的時間復雜度都是O(1)
2. 支持豐富數(shù)據(jù)類型酱床,支持string羊赵,list,set扇谣,sorted set昧捷,hash
3.支持事務,操作都是原子性罐寨,所謂的原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行靡挥,要么全部不執(zhí)行
4. 豐富的特性:可用于緩存,消息鸯绿,按key設(shè)置過期時間芹血,過期后將會自動刪除
Redis單點吞吐量
單點TPS達到8萬/秒贮泞,QPS達到10萬/秒,補充下TPS和QPS的概念
1.QPS:?應用系統(tǒng)每秒鐘最大能接受的用戶訪問量
每秒鐘處理完請求的次數(shù)幔烛,注意這里是處理完啃擦,具體是指發(fā)出請求到服務器處理完成功返回結(jié)果《鲂可以理解在server中有個counter令蛉,每處理一個請求加1,1秒后counter=QPS狡恬。
2.TPS:?每秒鐘最大能處理的請求數(shù)
每秒鐘處理完的事務次數(shù)珠叔,一個應用系統(tǒng)1s能完成多少事務處理,一個事務在分布式處理中弟劲,可能會對應多個請求祷安,對于衡量單個接口服務的處理能力,用QPS比較合理兔乞。
Redis相比memcached有哪些優(yōu)勢汇鞭?
1.memcached所有的值均是簡單的字符串,Redis作為其替代者庸追,支持更為豐富的數(shù)據(jù)類型
2.Redis的速度比memcached快很多
3.Redis可以持久化其數(shù)據(jù)
4.Redis支持數(shù)據(jù)的備份霍骄,即master-slave模式的數(shù)據(jù)備份。
Redis有哪幾種數(shù)據(jù)淘汰策略淡溯?
在Redis中读整,允許用戶設(shè)置最大使用內(nèi)存大小server.maxmemory,當Redis 內(nèi)存數(shù)據(jù)集大小上升到一定大小的時候咱娶,就會施行數(shù)據(jù)淘汰策略米间。
1.volatile-lru:從已設(shè)置過期的數(shù)據(jù)集中挑選最近最少使用的淘汰
2.volatile-ttr:從已設(shè)置過期的數(shù)據(jù)集中挑選將要過期的數(shù)據(jù)淘汰
3.volatile-random:從已設(shè)置過期的數(shù)據(jù)集中任意挑選數(shù)據(jù)淘汰
4.allkeys-lru:從數(shù)據(jù)集中挑選最近最少使用的數(shù)據(jù)淘汰
5.allkeys-random:從數(shù)據(jù)集中任意挑選數(shù)據(jù)淘汰
6.noenviction:禁止淘汰數(shù)據(jù)
redis淘汰數(shù)據(jù)時還會同步到aof
Redis集群方案應該怎么做?都有哪些方案膘侮?
1.twemproxy
2.codis车伞,目前用的最多的集群方案,基本和twemproxy一致的效果喻喳,但它支持在 節(jié)點數(shù)量改變情況下另玖,舊節(jié)點數(shù)據(jù)可恢復到新hash節(jié)點。
3.Redis cluster3.0自帶的集表伦,特點在于他的分布式算法不是一致性hash谦去,而是hash槽的概念,以及自身支持節(jié)點設(shè)置從節(jié)點蹦哼。
具體請查看阿里架構(gòu)師進階專題:Redis集群的5種使用方式鳄哭,各自優(yōu)缺點分析
Redis讀寫分離模型
通過增加Slave DB的數(shù)量,讀的性能可以線性增長纲熏。為了避免Master DB的單點故障妆丘,集群一般都會采用兩臺Master DB做雙機熱備锄俄,所以整個集群的讀和寫的可用性都非常高。
讀寫分離架構(gòu)的缺陷在于勺拣,不管是Master還是Slave奶赠,每個節(jié)點都必須保存完整的數(shù)據(jù),如果在數(shù)據(jù)量很大的情況下药有,集群的擴展能力還是受限于單個節(jié)點的存儲能力毅戈,而且對于Write-intensive類型的應用,讀寫分離架構(gòu)并不適合愤惰。
Redis數(shù)據(jù)分片模型
為了解決讀寫分離模型的缺陷苇经,可以將數(shù)據(jù)分片模型應用進來。
可以將每個節(jié)點看成都是獨立的master宦言,然后通過業(yè)務實現(xiàn)數(shù)據(jù)分片扇单。
結(jié)合上面兩種模型,可以將每個master設(shè)計成由一個master和多個slave組成的模型奠旺。
Redis提供了哪幾種持久化方式蜘澜?
1. Redis主要提供了兩種持久化機制:RDB和AOF;
2.RDB
默認開啟凉倚,會按照配置的指定時間將內(nèi)存中的數(shù)據(jù)快照到磁盤中,創(chuàng)建一個dump.rdb文件嫂沉,Redis啟動時再恢復到內(nèi)存中稽寒。
Redis會單獨創(chuàng)建fork()一個子進程,將當前父進程的數(shù)據(jù)庫數(shù)據(jù)復制到子進程的內(nèi)存中趟章,然后由子進程寫入到臨時文件中杏糙,持久化的過程結(jié)束了,再用這個臨時文件替換上次的快照文件蚓土,然后子進程退出宏侍,內(nèi)存釋放。
需要注意的是蜀漆,每次快照持久化都會將主進程的數(shù)據(jù)庫數(shù)據(jù)復制一遍谅河,導致內(nèi)存開銷加倍,若此時內(nèi)存不足确丢,則會阻塞服務器運行绷耍,直到復制結(jié)束釋放內(nèi)存;都會將內(nèi)存數(shù)據(jù)完整寫入磁盤一次鲜侥,所以如果數(shù)據(jù)量大的話褂始,而且寫操作頻繁,必然會引起大量的磁盤I/O操作描函,嚴重影響性能崎苗,并且最后一次持久化后的數(shù)據(jù)可能會丟失狐粱;
3.AOF
以日志的形式記錄每個寫操作(讀操作不記錄),只需追加文件但不可以改寫文件胆数,Redis啟動時會根據(jù)日志從頭到尾全部執(zhí)行一遍以完成數(shù)據(jù)的恢復工作肌蜻。包括flushDB也會執(zhí)行。
主要有兩種方式觸發(fā):有寫操作就寫幅慌、每秒定時寫(也會丟數(shù)據(jù))宋欺。
因為AOF采用追加的方式,所以文件會越來越大胰伍,針對這個問題齿诞,新增了重寫機制,就是當日志文件大到一定程度的時候骂租,會fork出一條新進程來遍歷進程內(nèi)存中的數(shù)據(jù)祷杈,每條記錄對應一條set語句,寫到臨時文件中渗饮,然后再替換到舊的日志文件(類似rdb的操作方式)但汞。默認觸發(fā)是當aof文件大小是上次重寫后大小的一倍且文件大于64M時觸發(fā)。
當兩種方式同時開啟時互站,數(shù)據(jù)恢復Redis會優(yōu)先選擇AOF恢復私蕾。一般情況下,只要使用默認開啟的RDB即可胡桃,因為相對于AOF踩叭,RDB便于進行數(shù)據(jù)庫備份,并且恢復數(shù)據(jù)集的速度也要快很多翠胰。
開啟持久化緩存機制容贝,對性能會有一定的影響,特別是當設(shè)置的內(nèi)存滿了的時候之景,更是下降到幾百reqs/s斤富。所以如果只是用來做緩存的話,可以關(guān)掉持久化锻狗。
Redis常見性能問題和解決方案满力?
(1) Master最好不要做任何持久化工作,如RDB內(nèi)存快照和AOF日志文件
(2) 如果數(shù)據(jù)比較重要轻纪,某個Slave開啟AOF備份數(shù)據(jù)脚囊,策略設(shè)置為每秒同步一次
(3) 為了主從復制的速度和連接的穩(wěn)定性,Master和Slave最好在同一個局域網(wǎng)內(nèi)
(4) 盡量避免在壓力很大的主庫上增加從庫
(5) 主從復制不要用圖狀結(jié)構(gòu)桐磁,用單向鏈表結(jié)構(gòu)更為穩(wěn)定悔耘,即:Master <- Slave1 <- Slave2 <- Slave3...
這樣的結(jié)構(gòu)方便解決單點故障問題,實現(xiàn)Slave對Master的替換我擂。如果Master掛了衬以,可以立刻啟用Slave1做Master缓艳,其他不變。
Redis支持的Java客戶端都有哪些看峻?官方推薦用哪個阶淘?
Redisson、Jedis互妓、lettuce等等溪窒,官方推薦使用Redisson。
Redis哈希槽的概念冯勉?
Redis集群沒有使用一致性hash,而是引入了哈希槽的概念澈蚌,當需要在 Redis 集群中放置一個 key-value 時,根據(jù) CRC16(key) mod 16384的值灼狰,決定將一個key放到哪個桶中宛瞄。
Redis集群最大節(jié)點個數(shù)是多少?
Redis集群預分好16384個桶(哈希槽)
Redis集群的主從復制模型是怎樣的交胚?
為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用份汗,所以集群使用了主從復制模型,每個節(jié)點都會有N-1個復制品.
Redis集群會有寫操作丟失嗎?為什么蝴簇?
Redis并不能保證數(shù)據(jù)的強一致性杯活,這意味這在實際中集群在特定的條件下可能會丟失寫操作。
Redis集群之間是如何復制的熬词?
異步復制
Redis如何做內(nèi)存優(yōu)化旁钧?
盡可能使用散列表(hashes),散列表(是說散列表里面存儲的數(shù)少)使用的內(nèi)存非常小荡澎,所以你應該盡可能的將你的數(shù)據(jù)模型抽象到一個散列表里面均践。比如你的web系統(tǒng)中有一個用戶對象晤锹,不要為這個用戶的名稱摩幔,姓氏,郵箱鞭铆,密碼設(shè)置單獨的key,而是應該把這個用戶的所有信息存儲到一張散列表里面.
Redis回收進程如何工作的或衡?
一個客戶端運行了新的命令,添加了新的數(shù)據(jù)车遂。
Redi檢查內(nèi)存使用情況封断,如果大于maxmemory的限制, 則根據(jù)設(shè)定好的策略進行回收。
Redis回收使用的是什么算法舶担?
LRU算法
Redis有哪些適合的場景坡疼?
1)Session共享(單點登錄)
2)頁面緩存
3)隊列
4)排行榜/計數(shù)器
5)發(fā)布/訂閱
以上就是最全Redis詳細答案總結(jié)。
覺得不錯請點贊支持衣陶,歡迎留言或進我的個人群179961551領(lǐng)取【架構(gòu)資料專題目合集90期】柄瑰、【BATJTMD大廠JAVA面試真題1000+】闸氮,本群專用于學習交流技術(shù)、分享面試機會教沾,拒絕廣告蒲跨,我也會在群內(nèi)不定期答題、探討授翻。