面試官:我們來聊一聊Redis吧,你了解多少就答多少

      網友投稿 699 2025-03-31

      哈嘍!大家好,我是小奇,一位不靠譜的程序員

      小奇打算以輕松幽默的對話方式來分享一些技術,如果你覺得通過小奇的文章學到了東西,那就給小奇一個贊吧

      文章持續更新,可以微信搜索【小奇JAVA面試】第一時間閱讀,回復【資料】更有我為大家準備的福利喲!

      文章目錄

      一、前言

      二、面試

      三、Redis基本數據類型與使用場景

      1、String

      2、Hash

      3、List

      4、Set

      5、ZSet

      四、Redis日常問題

      五、總結

      一、前言

      作為一名Java程序員,Redis底層的一些原理是我們不必學會就可以搬磚工作的一種技能點,但是小奇為什么還要講一下呢?難道就是為了浪費大家1分鐘的寶貴時間,一個人1分鐘,50萬人就是1年,5000萬人就是100年,賺了,小奇以一己之力成功搞掛一個人(血賺)。

      當然不是,并且小奇的文章也沒有那么多人看,最多也就浪費個腎吧。

      學習Redis底層原理是因為面試官要問啊!,所以我們就要學,什么?不實用的你不學?那鄰居小奇可要使勁學啦,到時候面試官只要小奇不要你。

      至于你問為什么面試官要問Redis底層原理呢,這個。。。我把這次機會留給你,下次你面試的時候面試官問:“講一下Redis底層原理”。你:“面試官你好,請問為什么你要問Redis底層原理呢,你給我臺電腦,我五分鐘給你搭建好圖書管理系統他不香嗎,咱們鍵盤上見真章”。這時面試官就會告訴你答案,你就可以把答案打在評論區,讓小奇以及眾多小伙伴一起知道一下到底為什么要問?

      二、面試

      在一個晴朗的周日,我來到了一個陌生的園區(別問為什么是周日,問就是997,不過為了填飽肚子的打工人,只能明知山有虎、偏向虎山行),坐在陌生的會議室,等待HR小姐姐去叫面試官,此時我的心情和各位小伙伴一樣五味雜陳,擔心面試官問的會不會很難?問到我的知識盲區我該怎么辦?一會自我介紹的時候要不要吹一下我和小奇的關系?

      一位英俊瀟灑,眼神犀利的面試官走了進來,看到他那犀利、仿佛能看穿一切的眼神 ,我在想要不然一會就不要20k了,要8k得了,這個面試官一看就不好糊弄啊,但是我想起來我來之前剛看了小奇的趣學編程系列,我已經完全學會了小奇的精髓,我頓時就來了底氣,決定一會要30k,不給就學小奇賴著不走(哈哈)

      面試官:小奇是吧,帶簡歷了嗎?

      我:沒帶,現在彩印兩塊一張,我簡歷五張,每次面試都要花費十塊,我朋友說了還沒工作就先讓你掏錢的工作不要去。

      面試官:。。。那你靠什么來征服我,讓我錄用你

      我:氣質?

      (此時面試官并沒有叫保安,而是從門后拿出了恭候我多時的棍子,我瞬間慫了)

      我只好從我的雙肩包中拿出了我上午從其他公司面試官手中要回的簡歷,上午的情形是這樣的。

      上午的面試官:今天的面試就到這吧,回去等通知吧!

      我:面試官你好,如果貴公司不打算錄取我的話,能不能把我的紙質簡歷還給我,我下午還有一家面試。

      上午的面試官:我說你的簡歷怎么皺皺巴巴,原來你一直在循環利用啊!這個癥狀出現多久了?

      我:半拉月了。。。

      (當我把皺皺巴巴的簡歷交給面試官后,這場面試才得以繼續進行。。。)

      三、Redis基本數據類型與使用場景

      面試官:我看你簡歷上寫的精通Redis?(哼,面試官輕蔑的一笑)

      (看著面試官輕蔑的笑容,我忍不住拿出了我的Redis書籍推給了他)

      我:這本書我倒背如流,你隨便提問,答不上來算我輸,答上來你就要為你的輕蔑向我道歉。

      (我的笑容逐漸自信。。。)

      (此時面試官看著書若有所思,我懷疑他肯定在想他對這本書的了解程度吧)

      面試官:好吧,那先簡單說一下Redis有哪些數據類型吧

      我:redis主要有五種數據類型,分別是String、Hash、List、Set、ZSet。

      面試官:那他們都是怎么存儲和讀取數據的呢,有哪些使用場景呢?

      1、String

      單值存儲:set [key] [value]

      取值:get [key]

      多值存儲:mset [key1] [value] [key2] [value]

      取值:mget [key1] [key2]

      分布式鎖上鎖:setnx [key] true

      返回1代表上鎖成功

      返回0代表上鎖失敗

      分布式鎖釋放鎖:del [key]

      設置超時時間:expire [key] [時間] (如果出現異常導致刪除鎖失敗,可以設置超時時間,到達時間鎖自動刪除)

      實現原子性分布式鎖加鎖并設置超時時間:set [key] true ex [時間] nx (如果上完鎖在給鎖設置超時時間之間出現異常,還是會導致鎖無法刪除,那么將上鎖命令和設置超時時間命令合為一個命令)

      計數器:incr [key]

      獲取計數器的值:get [key]

      批量獲取計數:incrby [key]

      獲取計數器的值:get [key]

      2、Hash

      存儲數據:hset [table] [key] [value] (這里我們可以假設實現向購物車中添加商品)

      向購物車添加一個蘋果

      面試官:我們來聊一聊Redis吧,你了解多少就答多少

      向購物車添加一本書

      向購物車添加一個香蕉

      在原有商品上加數量:hincrby [table] [key] [數量]

      再向購物車中添加一個蘋果

      商品種類數量:hlen [table]

      獲取購物車所有的商品:hgetall [table]

      刪除商品:hdel [table] [key]

      3、List

      將一個值放入列表的頭部(最左邊):lpush [key] [value]

      移除并返回列表的頭元素:lpop [key]

      將一個值放入列表的尾部(最右邊):rpush [key] [value]

      移除并返回列表的尾元素:rpop [key]

      返回列表中指定區間內的元素:lrange [key] [開始位置] [結束位置]

      從列表表頭彈出一個元素,若列表中沒有元素,阻塞等待time秒,如果time=0,一直阻塞等待

      從列表表尾彈出一個元素,若列表中沒有元素,阻塞等待time秒,如果time=0,一直阻塞等待

      4、Set

      往集合key中存入元素,元素存在則忽略,若key不存在則新建:sadd [key] [元素] (這里我們模仿一個抽獎的業務場景,先往集合中放入要抽獎的人)

      從集合key中隨機選取幾個元素,元素不從集合中刪除:srandmember [key] [元素個數] (這里我們抽兩個獎項)

      獲取集合key中所有元素:smembers [key]

      獲取集合key中元素的個數:scard [key]

      判斷一元素是否存在于集合中:sismember [key] [元素]

      從集合中刪除元素:srem [key] [元素]

      從集合中隨機選出幾個元素,并且刪除:spop [key] [元素個數] (例如我們抽獎的時候先抽了三等獎,那么抽二等獎的時候三等獎的人就沒有資格了,就要將三等獎的人刪除)

      交集運算:sinter [key] [元素]

      將交集結果存入新集合key2中:sinterstore [key2] [key] [元素]

      并集運算:sunion [key] [元素]

      將并集結果存入新集合key2中:sunionstore [key2] key [元素]

      差集運算:sdiff [key] [運算]

      將差集結果存入新集合key2中:sdiffstore [key2] [key] [元素]

      5、ZSet

      往有序集合key中加入帶分值的元素:zadd [key] [分值] [元素] (業務中我們可以用來實現例如微博熱搜排行的功能)

      返回有序集合key中元素的分值:zscore [key] [元素]

      返回有序集合key中元素的個數:zcard [key]

      為有序集合key中元素的分值加上一個分值:zincrby [key] [分值] [元素]

      正序獲取有序集合key從開始下標到結束下標的元素:zrange [key] [開始] [結束]

      倒敘獲取有序集合key從開始下標到結束下標的元素:zrevrange [key] [開始下標] [結束下標] (這里就是例如微博熱搜榜中根據熱度倒敘排序獲取前十個)

      從有序集合key中刪除元素:zrem [key] [元素]

      (整理不易,性感小奇在線求贊。。。)

      四、Redis日常問題

      面試官:嗯。你上面寫了那么多我也顧不上看,簡單的問你幾個問題吧

      我:好

      面試官:Redis中我們怎么創建分布式鎖

      我:使用setnx命令

      面試官:Redis中創建分布式鎖后出現異常解鎖失敗,怎么將這個鎖刪掉

      我:可以使用expire來給鎖加一個時間,過了這個時間后Redis自動將這個鎖刪掉。

      面試官:如果在加時間之前就出現異常了,時間沒有加上怎么辦?

      我:可以使用原子性的命令將分布式鎖和時間一同創建出來,這樣就不用擔心異常了,因為原子性,一個成功都成功,一個失敗都失敗。

      面試官:Redis是單線程的嗎?

      我:Redis在讀寫操作的時候是單線程的,但是其它功能,例如持久化、異步刪除、集群數據同步等是有額外的線程執行的。

      面試官:Redis單線程為什么還能這么快?

      我:因為Redis的數據都在內存中,而且單線程避免了多線程的切換性能損耗問題。

      面試官:Redis單線程如何處理并發客戶端連接?

      我:Redis利用epoll來實現IO多路復用,將連接信息和事件放到隊列中,依次放到文件事件分派器中,事件分派器將事件分發給事件處理器

      面試官:我想全量查詢Redis中所有key怎么查詢,或者模糊查詢符合規則的key怎么查詢呢

      我:使用 keys * 可以查詢Redis中所有的key,如果要模糊查詢直接加上規則即可,例如要查詢前綴為小奇的key可以使用 keys 小奇* 來查詢

      面試官:這樣查詢有沒有什么問題呢,有沒有其他的解決方案呢?

      我:使用 keys * 查詢是全量查詢Redis中的key值,如果key值過多的話最造成線程堵塞,因為Redis讀寫是單線程的,我們可以使用scan命令漸進式讀取數據。

      面試官:可以詳細說一下scan命令嗎?

      我:scan命令的格式為:scan [游標] match [通配符] count [每一次查詢的數量] (初始查詢的時候游標為0,然后第二次查詢游標為第一次查詢時返回的數據,依次類推,最后游標返回0時表示查詢完畢)

      我現在Redis中一共有9條數據,我每次查詢3條,分三次查詢完畢。

      面試官:scan命令有什么缺點嗎,一定能夠完全獲取全量的數據嗎?

      我:不一定,如果在scan的過程中有新的數據變化,例如插入數據,刪除數據等,那么新增的鍵可能沒有遍歷到,因為scan遍歷過的地方就不在遍歷了,你插入到遍歷過的地方就不會再遍歷到。

      面試官:小伙子真厲害啊,我這邊沒有什么要問的了,你還有什么問題要問(面試官兩眼放光)

      我:額。。。面試官這個我的紙質簡歷可以給我嗎,可以不往我的簡歷上寫寫畫畫嗎,我明天的面試還要用。

      面試官:還面啥別的公司啊,就來我這吧,條件隨便開

      我:那就100k吧(此時面試官又拿起了他準備好的棍子)

      面試官:你要是不來就給我推薦一下,讓別人來我這面試一下

      我:你先好好學習一下Redis吧,今天幸虧只是我來了,如果是小奇的忠實讀者來了,你將會被虐的很慘的。(我將我的《Redis設計與實現》留給了面試官,轉身留下了帥氣的背影,而面試官落寞無神的呆呆的坐在那里,仿佛一個億離他而去。。。)

      五、總結

      這里關于Redis還沒有整理完畢,文章后面持續更新,建議。

      文章中涉及到的命令大家一定要像我一樣每個都敲幾遍,只有在敲的過程中才能發現自己對命令是否真正的掌握了。

      如果覺得我的文章還不錯的話就點個贊吧,另外可以微信搜索【小奇JAVA面試】閱讀更多的好文章,獲取我為大家準備的資料。

      Redis 分布式

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:Office365excel文件保存之后邊框沒有了解決方法
      下一篇:表格中兩個數的比值怎么算
      相關文章
      亚洲成A人片77777国产| 亚洲综合无码一区二区三区| 亚洲欧洲日产专区| 亚洲国产精品特色大片观看完整版| 亚洲高清视频一视频二视频三| 亚洲AV成人片无码网站| 亚洲国产精品成人午夜在线观看 | 久久亚洲国产成人精品无码区| 国产一区二区三区亚洲综合| 国产精品亚洲一区二区在线观看| 亚洲人成色777777老人头| 亚洲欧美精品午睡沙发| 亚洲免费综合色在线视频| 亚洲欧好州第一的日产suv| 亚洲精华国产精华精华液好用| 亚洲午夜福利在线视频| 亚洲一线产品二线产品| 亚洲色中文字幕在线播放| 亚洲国产视频久久| 亚洲另类无码一区二区三区| 亚洲第一成年免费网站| 亚洲AV无码男人的天堂| 日韩色日韩视频亚洲网站| 在线观看亚洲免费| 国产国拍亚洲精品福利 | 国产成人亚洲综合无码| 亚洲乱码中文字幕综合| 亚洲福利视频导航| 亚洲第一页中文字幕| 亚洲一卡2卡3卡4卡国产网站| 国产精品亚洲精品青青青 | 国产亚洲一区二区三区在线| 亚洲AV无码欧洲AV无码网站| 亚洲尹人九九大色香蕉网站 | 国产亚洲视频在线观看| 亚洲jizzjizz少妇| 狼人大香伊蕉国产WWW亚洲| 亚洲高清成人一区二区三区| 久久乐国产精品亚洲综合| 亚洲国产日韩在线视频| 337p欧洲亚洲大胆艺术|