哈嘍界睁!大家好,我是小奇索守,一位不靠譜的程序員
小奇打算以輕松幽默的對話方式來分享一些技術晕窑,如果你覺得通過小奇的文章學到了東西抑片,那就給小奇一個贊吧
文章持續(xù)更新
作為一名Java程序員,Redis底層的一些原理是我們不必學會就可以搬磚工作的一種技能點敞斋,但是小奇為什么還要講一下呢截汪?難道就是為了浪費大家1分鐘的寶貴時間,一個人1分鐘植捎,50萬人就是1年衙解,5000萬人就是100年,賺了焰枢,小奇以一己之力成功搞掛一個人(血賺)蚓峦。
當然不是舌剂,并且小奇的文章也沒有那么多人看,最多也就浪費個腎吧暑椰。
學習Redis底層原理是因為面試官要問啊霍转!,所以我們就要學一汽,什么避消?不實用的你不學?那鄰居小奇可要使勁學啦召夹,到時候面試官只要小奇不要你岩喷。
至于你問為什么面試官要問Redis底層原理呢,這個监憎。纱意。。我把這次機會留給你枫虏,下次你面試的時候面試官問:“講一下Redis底層原理”妇穴。你:“面試官你好,請問為什么你要問Redis底層原理呢隶债,你給我臺電腦腾它,我五分鐘給你搭建好圖書管理系統(tǒng)他不香嗎,咱們鍵盤上見真章”死讹。這時面試官就會告訴你答案瞒滴,你就可以把答案打在評論區(qū),讓小奇以及眾多小伙伴一起知道一下到底為什么要問赞警?
在一個晴朗的周日,我來到了一個陌生的園區(qū)(別問為什么是周日愧旦,問就是997世剖,不過為了填飽肚子的打工人,只能明知山有虎笤虫、偏向虎山行)旁瘫,坐在陌生的會議室,等待HR小姐姐去叫面試官琼蚯,此時我的心情和各位小伙伴一樣五味雜陳酬凳,擔心面試官問的會不會很難?問到我的知識盲區(qū)我該怎么辦遭庶?一會自我介紹的時候要不要吹一下我和小奇的關系宁仔?
一位英俊瀟灑,眼神犀利的面試官走了進來峦睡,看到他那犀利翎苫、仿佛能看穿一切的眼神 权埠,我在想要不然一會就不要20k了,要8k得了煎谍,這個面試官一看就不好糊弄啊弊知,但是我想起來我來之前剛看了小奇的趣學編程系列,我已經完全學會了小奇的精髓粱快,我頓時就來了底氣秩彤,決定一會要30k,不給就學小奇賴著不走(哈哈)
面試官:小奇是吧事哭,帶簡歷了嗎漫雷?
我:沒帶,現在彩印兩塊一張鳍咱,我簡歷五張降盹,每次面試都要花費十塊,我朋友說了還沒工作就先讓你掏錢的工作不要去谤辜。
面試官:蓄坏。。丑念。那你靠什么來征服我涡戳,讓我錄用你
我:氣質?
(此時面試官并沒有叫保安脯倚,而是從門后拿出了恭候我多時的棍子渔彰,我瞬間慫了)
我只好從我的雙肩包中拿出了我上午從其他公司面試官手中要回的簡歷,上午的情形是這樣的推正。
上午的面試官:今天的面試就到這吧恍涂,回去等通知吧!
我:面試官你好植榕,如果貴公司不打算錄取我的話再沧,能不能把我的紙質簡歷還給我,我下午還有一家面試尊残。
上午的面試官:我說你的簡歷怎么皺皺巴巴炒瘸,原來你一直在循環(huán)利用啊夜郁!這個癥狀出現多久了什燕?
我:半拉月了粘勒。竞端。。
(當我把皺皺巴巴的簡歷交給面試官后庙睡,這場面試才得以繼續(xù)進行事富。技俐。。)
面試官:我看你簡歷上寫的精通Redis雕擂?(哼,面試官輕蔑的一笑)
(看著面試官輕蔑的笑容贱勃,我忍不住拿出了我的Redis書籍推給了他)
我:這本書我倒背如流井赌,你隨便提問,答不上來算我輸贵扰,答上來你就要為你的輕蔑向我道歉仇穗。
(我的笑容逐漸自信。戚绕。纹坐。)
(此時面試官看著書若有所思,我懷疑他肯定在想他對這本書的了解程度吧)
面試官:好吧舞丛,那你先說一下Redis如何實現持久化的
我:Redis主要有兩種持久化方式耘子,一種是RDB(快照)方式,另一種是AOF格式球切。
面試官:可以說一說兩者的區(qū)別和如何配置使用嗎
我們可以想象一下我現在要記錄一個人的姿勢是什么樣子的谷誓,那么我只能通過拍照,或者描述來記錄
RDB(快照)方式可以理解我想知道目前一個人的姿勢是什么樣子的吨凑,那么我就給他拍一張照片片林,那么照片上就是他這個人的姿勢。
AOF可以理解為動作的描述怀骤,我通過對這個人每一個動作的描述來知道這個人的姿勢是什么樣子的费封,比如這個人左手六、右手七蒋伦、左腳畫圓弓摘、右腳踢,那么我通過這些動作就知道這個人目前的姿勢痕届。
所以RDB快照就相當于將Redis中的數據保存了下來韧献,恢復的時候只需要將照片拿出來,人根據姿勢恢復就行了研叫。
而AOF相當于將Redis中的每一條執(zhí)行命令記錄了下來锤窑,恢復的時候需要根據命令一條一條的來,先左手六嚷炉、再右手七渊啰、再左腳畫圓、再右腳踢。绘证。隧膏。(如果想不明白可以按照姿勢試一下就明白了)
RDB在redis.conf目錄中進行配置,命令格式為 save [時間] [次數]
那save 60 10000來舉例嚷那,含義是如果在60秒內有至少10000條改動胞枕,那么就自動保存一次,也就是拍一張照片魏宽,那么中間如果改動到500條的時候Redis掛了腐泻,那么這500條改動就找不到了。
如果執(zhí)行save命令會造成Redis正常讀寫收到影響队询,我們可以用bgsave(寫時復制)命令來生成RDB快照贫悄,bgsave是用一個子線程來實現快照功能,主線程繼續(xù)他的讀寫任務
使用AOF來保存數據就不會有RDB快照中Redis宕機所產生的風險了娘摔,因為AOF保存的是每一條命令窄坦,但是AOF也并不是只能每一條命令就保存一次,這樣會耗費性能凳寺,我們可以設置為每1秒執(zhí)行一次保存鸭津,這樣就算丟失也只會丟失1秒的數據
可以通過配置文件中的appendonly設置為yes來開啟AOF功能
AOF有三個保存策略
appendfsync always:每次有新命令就保存下來,性能最慢肠缨,但是最安全
appendsync everysec:每秒保存一次命令逆趋,足夠快,故障時只會丟失1秒鐘的數據
appendfsync no:從不保存晒奕,將數據交給操作系統(tǒng)來處理闻书。更快,也更不安全
推薦使用每秒保存一次命令的方式
面試官:AOF中那么多命令恢復起來太麻煩魄眉,有沒有什么優(yōu)化的方式
AOF文件中有太多沒用的指令,所以AOF會定期根據內存的最新數據生成AOF文件
例如我們記錄一個人的動作闷袒,發(fā)現他先抬手坑律,再放下手、然后再抬手囊骤,那我我們可以將動作合并為一個動作就是抬手晃择,因為執(zhí)行抬手,放手也物,抬手三個動作和只執(zhí)行一個抬手的動作是一樣的
我們可以配置AOF重寫的頻率宫屠,有兩個配置項
auto-aof-rewrite-percentage 100 (aof文件自上一次重寫后文件大小增長了100%則再次觸發(fā)重寫)
auto-aof-rewrite-min-size 64mb (aof文件至少要達到64M才會自動重寫,文件太小恢復速度本來就很快滑蚯,重寫的意義不大)
aof可以手動重寫浪蹂,命令為:bgrewriteaof,此時也會使用一個子進程來重寫,不會對redis的正常命令有影響
面試官:RDB和AOF各有優(yōu)缺點,我們該怎么選擇
在redis啟動的時候如果即配置RDB又配置AOF创葡,則優(yōu)先使用AOF浙踢,因為AOF更加安全,但是性能不太好灿渴,但是我們可以混合使用洛波,達到更好的效果
將RDB和AOF混合使用,例如恢復的時候先根據照片恢復最后一次拍照記錄的樣子骚露,然后再恢復拍照后記錄的動作
配置開啟混合使用:aof‐use‐rdb‐preamble yes
面試官:可以聊一聊redis的主從架構模式,以及怎樣搭建嗎
我:可以棘幸,redis的主從架構模式其實是用一個redis節(jié)點來做寫操作(主節(jié)點)焰扳,多個redis節(jié)點來做讀操作(從節(jié)點),主節(jié)點會將寫入的數據同步給從節(jié)點误续,以保證從從節(jié)點讀取的數據是最新的數據
搭建方式:主節(jié)點不用修改任何配置吨悍,從節(jié)點修改redis.conf配置文件
配置主節(jié)點的ip端口:replicaof (代表從節(jié)點從哪個主節(jié)點同步數據)
配置好從節(jié)點后啟動從節(jié)點,這個時候啟動從節(jié)點蹋嵌,從節(jié)點會從主節(jié)點去初次獲取數據
面試官:可以聊一聊redis的哨兵架構模式,以及怎樣搭建嗎
我:好的栽烂,哨兵架構是在主從架構上衍生出來的躏仇,因為主從架構中如果主節(jié)點掛了,那么我們就不能夠寫入數據了腺办,只能從從節(jié)點中讀取數據焰手,這樣是很不方便的。
那么我們弄一個哨兵集群來監(jiān)視這些節(jié)點怀喉,當主節(jié)點掛了以后我們哨兵選舉一個從節(jié)點成為主節(jié)點册倒,并讓寫數據的命令得以繼續(xù)執(zhí)行(我們用比較有名的村莊來舉例。磺送。驻子。)。
搭建:復制一份sentinel.conf文件進行修改估灿,redis中默認有這個文件
修改端口號崇呵,以及sentinel命令,格式為:sentinel monitor <主節(jié)點名稱> <端口>
quorum是一個數字類型馅袁,意思是有多少個sentinel認為這個主節(jié)點失效時才算真正的失效域慷,比如我配置了三個sentinel,那么我這里2的含義就是有兩個sentinel認為當前主節(jié)點失效就算失效了。
面試官:小伙子真厲害啊犹褒,我這邊沒有什么要問的了抵窒,你還有什么問題要問(面試官兩眼放光)
我:額。叠骑。李皇。面試官這個我的紙質簡歷可以給我嗎,可以不往我的簡歷上寫寫畫畫嗎宙枷,我明天的面試還要用掉房。
面試官:還面啥別的公司啊,就來我這吧慰丛,條件隨便開
我:那就100k吧(此時面試官又拿起了他準備好的棍子)
面試官:你要是不來就給我推薦一下卓囚,讓別人來我這面試一下
我:你先好好學習一下Redis吧,今天幸虧只是我來了诅病,如果是小奇的忠實讀者來了哪亿,你將會被虐的很慘的。(我將我的《Redis設計與實現》留給了面試官贤笆,轉身留下了帥氣的背影锣夹,而面試官落寞無神的呆呆的坐在那里,仿佛一個億離他而去苏潜。银萍。。)
這里關于Redis還沒有整理完畢贴唇,文章后面持續(xù)更新,建議收藏飞袋。
文章中涉及到的命令大家一定要像我一樣每個都敲幾遍戳气,只有在敲的過程中才能發(fā)現自己對命令是否真正的掌握了。
如果覺得我的文章還不錯的話就點個贊吧巧鸭。