亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

redis面試技巧

發布時間:2020-08-10 17:16:51 來源:ITPUB博客 閱讀:139 作者:專注的阿熊 欄目:建站服務器

前言 Redis在互聯網技術存儲方面使用如此廣泛,幾乎所有的后端技術面試官都要在Redis的使用和原理方面對小伙伴們進行360°的刁難。作為一個在互聯網公司面一次拿一次offer的面霸(請允許我使用一下夸張的修辭手法),打敗了無數競爭對手,每次都只能看到無數落寞的身影失望的離開,略感愧疚,在一個寂寞難耐的夜晚,我痛定思痛,決定開始寫吊打面試官系列,希望能幫助各位讀者以后面試勢如破竹,對面試官進行360°的反擊,吊打問你的面試官,吊打一同面試的同僚(好像不太好),瘋狂收割大廠offer! 面試開始 一個大腹便便,穿著格子襯衣的中年男子,拿著一個滿是劃痕的mac向你走來,看著快禿頂的頭發,心想著肯定是尼瑪頂級架構師吧!但是我們腹有詩書氣自華,虛都不虛。 小伙子您好,看你簡歷上寫了你項目里面用到了Redis,你們為啥用Redis? 心里忍不住暗罵,這叫啥問題,大家不都是用的這個嘛,但是你不能說出來。 認真回答道:帥氣迷人的面試官您好,因為傳統的關系型數據庫Mysql已經不能適用所有的場景了,比如秒殺的庫存扣減,APP首頁的訪問流量高峰等等,都很容易把數據庫打崩,所以引入了緩存中間件,目前市面上比較常用的緩存中間件有Redis 和 Memcached 不過中和考慮了他們的優缺點,最后選擇了Redis。 至于更細節的對比朋友們記得查閱Redis 和 Memcached 的區別,比如兩者的優缺點對比和各自的場景,后續我有時間也會寫出來。 那小伙子,我再問你,Redis有哪些數據結構呀? 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 這里我相信99%的讀者都能回答上來Redis的5個基本數據類型。如果回答不出來的小伙伴我們就要加油補課喲,大家知道五種類型最適合的場景更好。 但是,如果你是Redis中高級用戶,而且你要在這次面試中突出你和其他候選人的不同,還需要加上下面幾種數據結構HyperLogLog、Geo、Pub/Sub。 如果你還想加分,那你說還玩過Redis Module,像BloomFilter,RedisSearch,Redis-ML,這個時候面試官得眼睛就開始發亮了,心想這個小伙子有點東西啊。 注:本人在面試回答到Redis相關的問題的時候,經常提到BloomFilter(布隆過濾器)這玩意的使用場景是真的多,而且用起來是真的香,原理也好理解,看一下文章就可以在面試官面前侃侃而談了,不香么?下方傳送門 ↓ 避免緩存擊穿的利器之BloomFilter 如果有大量的key需要設置同一時間過期,一般需要注意什么? 如果大量的key過期時間設置的過于集中,到過期的那個時間點,redis可能會出現短暫的卡頓現象。嚴重的話會出現緩存雪崩,我們一般需要在時間上加一個隨機值,使得過期時間分散一些。 電商首頁經常會使用定時任務刷新緩存,可能大量的數據失效時間都十分集中,如果失效時間一樣,又剛好在失效的時間點大量用戶涌入,就有可能造成緩存雪崩 那你使用過Redis分布式鎖么,它是什么回事? 先拿setnx來爭搶鎖,搶到之后,再用expire給鎖加一個過期時間防止鎖忘記了釋放。 這時候對方會告訴你說你回答得不錯,然后接著問如果在setnx之后執行expire之前進程意外crash或者要重啟維護了,那會怎么樣? 這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠得不到釋放了。緊接著你需要抓一抓自己得腦袋,故作思考片刻,好像接下來的結果是你主動思考出來的,然后回答:我記得set指令有非常復雜的參數,這個應該是可以同時把setnx和expire合成一條指令來用的! 對方這時會顯露笑容,心里開始默念:嗯,這小子還不錯,開始有點意思了。 假如Redis里面有1億個key,其中有10w個key是以某個固定的已知的前綴開頭的,如何將它們全部找出來? 使用keys指令可以掃出指定模式的key列表。 對方接著追問:如果這個redis正在給線上的業務提供服務,那使用keys指令會有什么問題? 這個時候你要回答redis關鍵的一個特性:redis的單線程的。keys指令會導致線程阻塞一段時間,線上服務會停頓,直到指令執行完畢,服務才能恢復。這個時候可以使用scan指令,scan指令可以無阻塞的提取出指定模式的key列表,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用keys指令長。 不過,增量式迭代命令也不是沒有缺點的: 舉個例子, 使用 SMEMBERS 命令可以返回集合鍵當前包含的所有元素, 但是對于 SCAN 這類增量式迭代命令來說, 因為在對鍵進行增量式迭代的過程中, 鍵可能會被修改, 所以增量式迭代命令只能對被返回的元素提供有限的保證 。 使用過Redis做異步隊列么,你是怎么用的? 一般使用list結構作為隊列,rpush生產消息,lpop消費消息。當lpop沒有消息的時候,要適當sleep一會再重試。 如果對方追問可不可以不用sleep呢? list還有個指令叫blpop,在沒有消息的時候,它會阻塞住直到消息到來。 如果對方接著追問能不能生產一次消費多次呢? 使用pub/sub主題訂閱者模式,可以實現 1:N 的消息隊列。 如果對方繼續追問 pub/su b有什么缺點? 在消費者下線的情況下,生產的消息會丟失,得使用專業的消息隊列如RocketMQ等。 如果對方究極TM追問Redis如何實現延時隊列? 這一套連招下來,我估計現在你很想把面試官一棒打死(面試官自己都想打死自己了怎么問了這么多自己都不知道的),如果你手上有一根棒球棍的話,但是你很克制。平復一下激動的內心,然后神態自若的回答道:使用sortedset,拿時間戳作為score,消息內容作為key調用zadd來生產消息,消費者用zrangebyscore指令獲取N秒之前的數據輪詢進行處理。 到這里,面試官暗地里已經對你豎起了大拇指。并且已經默默給了你A+,但是他不知道的是此刻你卻豎起了中指,在椅子背后。 Redis是怎么持久化的?服務主從數據怎么交互的? RDB做鏡像全量持久化,AOF做增量持久化。因為RDB會耗費較長時間,不夠實時,在停機的時候會導致大量丟失數據,所以需要AOF來配合使用。MT5使用教程www.gendan5.com/mt5.html在redis實例重啟時,會使用RDB持久化文件重新構建內存,再使用AOF重放近期的操作指令來實現完整恢復重啟之前的狀態。 這里很好理解,把RDB理解為一整個表全量的數據,AOF理解為每次操作的日志就好了,服務器重啟的時候先把表的數據全部搞進去,但是他可能不完整,你再回放一下日志,數據不就完整了嘛。不過Redis本身的機制是 AOF持久化開啟且存在AOF文件時,優先加載AOF文件;AOF關閉或者AOF文件不存在時,加載RDB文件;加載AOF/RDB文件城后,Redis啟動成功; AOF/RDB文件存在錯誤時,Redis啟動失敗并打印錯誤信息 對方追問那如果突然機器掉電會怎樣? 取決于AOF日志sync屬性的配置,如果不要求性能,在每條寫指令時都sync一下磁盤,就不會丟失數據。但是在高性能的要求下每次都sync是不現實的,一般都使用定時sync,比如1s1次,這個時候最多就會丟失1s的數據。 對方追問RDB的原理是什么? 你給出兩個詞匯就可以了,fork和cow。fork是指redis通過創建子進程來進行RDB操作,cow指的是copy on write,子進程創建后,父子進程共享數據段,父進程繼續提供讀寫服務,寫臟的頁面數據會逐漸和子進程分離開來。 注:回答這個問題的時候,如果你還能說出AOF和RDB的優缺點,我覺得我是面試官在這個問題上我會給你點贊,兩者其實區別還是很大的,而且涉及到Redis集群的數據同步問題等等。想了解的伙伴也可以留言,我會專門寫一篇來介紹的。 Pipeline有什么好處,為什么要用pipeline? 可以將多次IO往返的時間縮減為一次,前提是pipeline執行的指令之間沒有因果相關性。使用redis-benchmark進行壓測的時候可以發現影響redis的QPS峰值的一個重要因素是pipeline批次指令的數目。 Redis的同步機制了解么? Redis可以使用主從同步,從從同步。第一次同步時,主節點做一次bgsave,并同時將后續修改操作記錄到內存buffer,待完成后將RDB文件全量同步到復制節點,復制節點接受完成后將RDB鏡像加載到內存。加載完成后,再通知主節點將期間修改的操作記錄同步到復制節點進行重放就完成了同步過程。后續的增量數據通過AOF日志同步即可,有點類似數據庫的binlog。 是否使用過Redis集群,集群的高可用怎么保證,集群的原理是什么? Redis Sentinal著眼于高可用,在master宕機時會自動將slave提升為master,繼續提供服務。 Redis Cluster著眼于擴展性,在單個redis內存不足時,使用Cluster進行分片存儲。 面試結束 小伙子你可以的,什么時候有時間來上班啊,要不明天就來吧? 你強裝鎮定,這么急啊我還需要租房,要不下禮拜一吧。 好的 心想這小子這么NB是不是很多Offer在手上,不行我得叫hr給他加錢。 能撐到最后,你自己都忍不住自己給自己點個贊了(暗示點贊,每次都看了不點贊,你們想白嫖我么?你們好壞喲,不過我喜歡?(? ???ω??? ?)?)。 總結 在技術面試的時候,不管是Redis還是什么問題,如果你能舉出實際的例子,或者是直接說自己開發過程的問題和收獲會給面試官的印象分會加很多,回答邏輯性也要強一點,不要東一點西一點,容易把自己都繞暈的。 還有一點就是我問你為啥用Redis你不要一上來就直接回答問題了,你可以這樣回答: 帥氣的面試官您好,首先我們的項目DB遇到了瓶頸,特別是秒殺和熱點數據這樣的場景DB基本上就扛不住了,那就需要緩存中間件的加入了,目前市面上有的緩存中間件有 Redis 和 Memcached ,他們的優缺點……,綜合這些然后再結合我們項目特點,最后我們在技術選型的時候選了誰。 如果你這樣有條不紊,有理有據的回答了我的問題而且還說出這么多我問題外的知識點,我會覺得你不只是一個會寫代碼的人,你邏輯清晰,你對技術選型,對中間件對項目都有自己的理解和思考,說白了就是你的offer有戲了。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄骅市| 西乌| 同德县| 大兴区| 天峻县| 广南县| 乐陵市| 宝山区| 惠东县| 静海县| 临澧县| 汽车| 安多县| 卢龙县| 普格县| 疏勒县| 沽源县| 赞皇县| 太仓市| 安仁县| 商水县| 九龙县| 巴彦淖尔市| 铁力市| 阳泉市| 安泽县| 西城区| 天津市| 山丹县| 台山市| 永泰县| 禄劝| 贺州市| 二连浩特市| 运城市| 沙坪坝区| 应城市| 忻州市| 铜梁县| 包头市| 长葛市|