事出有因 Redis是一個分散式NoSQL資料庫,因其數據都存儲在記憶體中,所以訪問速度極快,因此幾乎所有公司都拿它做緩存使用,所以Redis常被稱為分散式緩存。一次我的一個同事讓我幫他看Redis相關的問題,我看到了他使用了Hash數據類型,其實它就對應Java里的Map。同事要往裡存十幾個key/ ...
事出有因
Redis是一個分散式NoSQL資料庫,因其數據都存儲在記憶體中,所以訪問速度極快,因此幾乎所有公司都拿它做緩存使用,所以Redis常被稱為分散式緩存。
一次我的一個同事讓我幫他看Redis相關的問題,我看到了他使用了Hash數據類型,其實它就對應Java里的Map。同事要往裡存十幾個key/value對,於是他就像使用本地Map一樣,連續的調用了十幾次的put操作。
哎,我只好心理默默的想著,以後再招聘時,一定要加強Redis的考察力度。
記一次面試
我:Redis想在都成了標配了,幾乎每個寫代碼的人都用過,那你說說Redis的全名是什麼?
他:Redis不就是它的全名嗎?其實會用不就行了嘛,我不關註這些。
(我心裡真想一腳把他踹飛,你不會還有理了咋地,不過一向“有內涵”的我,這次要好好地“軟懟”他。)
我:哦,沒關係,其實好多人都不知道它的全名。Redis有一種數據類型叫做String,即字元串。Java里也有個數據類型叫String,它們一樣嗎?
他:應該一樣吧,我平時寫Java代碼都是直接把一個String類型給存進去的。
(Redis是個中間件,用C語言寫的,和Java沒有關係的。)
我:是嗎?其實除了Java外還有很多語言可以操作它,比如Python。當然也可以把一個Python里的String存儲到Redis里,這沒有問題吧。
他:是的,沒有問題。
我:那你說Redis里的String到底是對應Java里的String,還是Python里的String呢?
他:這個。。。
(哈哈,小樣,讓你逞能,現在不NB了吧)
我:哦,沒關係,其實好多人都不知道它到底是哪個語言里的String。
(其實Redis里的String壓根就不是個字元串,那它是個什麼呢?)
我:Redis里有個數據類型Hash,你用過吧。
他:用過,和Java里的Map很像。
我:如果往Hash里存一個key/value,你怎麼做?
他:就像Map一樣,調用put方法把key/value存進去就行了。
我:那存10對key/value呢?
他:調用10次put方法不就行了嘛。
(瞧他得瑟那樣吧)
我:那要存100對,難道就調用100次put嗎?
他:這個。。。
我:哦,沒關係,不是每個人都會去思考這些問題的。
(我還真見過有人連續調用幾乎二十次的,那麼為什麼不能這樣做呢?)
我:Redis支持事務嗎?
他:支持啊。
我:那你說說Redis事務是什麼樣子的?
他:就是多條命令,要麼都執行,要麼都不執行。
(哎呦,可以呀,竟然回答對了。拜托,任何事務都是這樣的好不好,原子性嘛)
我:假如我要執行3條命令,執行到第2條時出現了錯誤,那事務會回滾嗎?
他:肯定會呀,不然還叫事務幹嘛。
(哎呦呦,又NB起來了)
我:是嗎?Are you 確定?
他:這個。。。
我:哦,沒關係,一般情況下也不會有人去使用Redis的事務。
(Redis的事務命令是“真的事務”嗎?出現錯誤時會回滾嗎?)
我:如果Redis是單節點,向它發送命令總能獲取到數據。如果Redis是集群,會有很多節點,如果向A節點發送命令,發現數據不在A上而在B節點上,此時會怎麼樣?
他:Redis應該負責返回我請求的數據,既然我向A發的命令就應該由A負責。
我:是嗎?你的意思是要A去B上幫你取數據嗎?
他:難道不是嗎?
(Redis是如何處理數據不在本節點這樣情況的呢?)
我:好吧,這個問題你可以回去想想。
(明明就是井底之蛙,非要擺出一副自己看到了宇宙邊緣的樣子。)
(END)
作者是工作超過10年的碼農,現在任架構師。喜歡研究技術,崇尚簡單快樂。追求以通俗易懂的語言解說技術,希望所有的讀者都能看懂並記住。下麵是公眾號和知識星球的二維碼,歡迎關註!