面試還搞不懂redis,快看看這40道面試題(含答案)

Redis 面試題

1、什么是 Redis?

2、Redis 的數(shù)據(jù)類型?

3、使用 Redis 有哪些好處?

4、Redis 相比 Memcached 有哪些優(yōu)勢?

5、Memcache 與 Redis 的區(qū)別都有哪些?

6、Redis 是單進程單線程的?

7、一個字符串類型的值能存儲最大容量是多少?

8、Redis 的持久化機制是什么?各自的優(yōu)缺點?

9、Redis 常見性能問題和解決方案:

10、redis 過期鍵的刪除策略?

11、Redis 的回收策略(淘汰策略)?

12、為什么 edis 需要把所有數(shù)據(jù)放到內存中?

13、Redis 的同步機制了解么?

14、Pipeline 有什么好處,為什么要用 pipeline?

15、是否使用過 Redis 集群,集群的原理是什么?

16、Redis 集群方案什么情況下會導致整個集群不可用?

17、Redis 支持的 Java 客戶端都有哪些?官方推薦用哪個?

18、Jedis 與 Redisson 對比有什么優(yōu)缺點?

19、Redis 如何設置密碼及驗證密碼?

20、說說 Redis 哈希槽的概念?

21、Redis 集群的主從復制模型是怎樣的?

22、Redis 集群會有寫操作丟失嗎?為什么?

23、Redis 集群之間是如何復制的?

24、Redis 集群最大節(jié)點個數(shù)是多少?

25、Redis 集群如何選擇數(shù)據(jù)庫?

26、怎么測試 Redis 的連通性?

27、怎么理解 Redis 事務?

28、Redis 事務相關的命令有哪幾個?

29、Redis key 的過期時間和永久有效分別怎么設置?

30、Redis 如何做內存優(yōu)化?

31、Redis 回收進程如何工作的?

32、都有哪些辦法可以降低 Redis 的內存使用情況呢?

33、Redis 的內存用完了會發(fā)生什么?

34、一個 Redis 實例最多能存放多少的 keys?List、Set、Sorted Set他們最多能存放多少元素?

35、MySQL 里有 2000w 數(shù)據(jù),redis 中只存 20w 的數(shù)據(jù),如何保證redis 中的數(shù)據(jù)都是熱點數(shù)據(jù)?

36、Redis 最適合的場景?

37、假如 Redis 里面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,如果將它們全部找出來?

38、如果有大量的 key 需要設置同一時間過期,一般需要注意什么?

39、使用過 Redis 做異步隊列么,你是怎么用的?

40、使用過 Redis 分布式鎖么,它是什么回事?

1、什么是 Redis?

Redis 是完全開源免費的,遵守 BSD 協(xié)議,是一個高性能的 key-value 數(shù)據(jù)庫。

Redis 與其他 key - value 緩存產(chǎn)品有以下三個特點:

(1)Redis 支持數(shù)據(jù)的持久化,可以將內存中的數(shù)據(jù)保存在磁盤中,重啟的時候可以再次加載進行使用。

(2)Redis 不僅僅支持簡單的 key-value 類型的數(shù)據(jù),同時還提供 list,set,zset,hash 等數(shù)據(jù)結構的存儲。

(3)Redis 支持數(shù)據(jù)的備份,即 master-slave 模式的數(shù)據(jù)備份。

Redis 優(yōu)勢

(1)性能極高 – Redis 能讀的速度是 110000 次/s,寫的速度是 81000 次/s 。

(2)豐富的數(shù)據(jù)類型 – Redis 支持二進制案例的 Strings, Lists, Hashes, Sets 及Ordered Sets 數(shù)據(jù)類型操作。

(3)原子 – Redis 的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個操作是原子性的。多個操作也支持事務,即原子性,通過 MULTI 和 EXEC指令包起來。

(4)豐富的特性 – Redis 還支持 publish/subscribe, 通知, key 過期等等特性。

Redis 與其他 key-value 存儲有什么不同?

(1)Redis 有著更為復雜的數(shù)據(jù)結構并且提供對他們的原子性操作,這是一個不同于其他數(shù)據(jù)庫的進化路徑。Redis 的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結構的同時對程序員透明,無需進行額外的抽象。

(2)Redis 運行在內存中但是可以持久化到磁盤,所以在對不同數(shù)據(jù)集進行高速讀寫時需要權衡內存,因為數(shù)據(jù)量不能大于硬件內存。在內存數(shù)據(jù)庫方面的另一個優(yōu)點是,相比在磁盤上相同的復雜的數(shù)據(jù)結構,在內存中操作起來非常簡單,這樣 Redis可以做很多內部復雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的,因為他們并不需要進行隨機訪問。

2、Redis 的數(shù)據(jù)類型?

答:Redis 支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及 zsetsorted set:有序集合)。

我們實際項目中比較常用的是 string,hash 如果你是 Redis 中高級用戶,還需要加上下面幾種數(shù)據(jù)結構 HyperLogLog、Geo、Pub/Sub。

如果你說還玩過 Redis Module,像 BloomFilter,RedisSearch,Redis-ML,面試官得眼睛就開始發(fā)亮了。

3、使用 Redis 有哪些好處?

(1)速度快,因為數(shù)據(jù)存在內存中,類似于 HashMap,HashMap 的優(yōu)勢就是查找和操作的時間復雜度都是 O1)

(2)支持豐富數(shù)據(jù)類型,支持 string,list,set,Zset,hash 等

(3)支持事務,操作都是原子性,所謂的原子性就是對數(shù)據(jù)的更改要么全部執(zhí)行,要么全部不執(zhí)行

(4)豐富的特性:可用于緩存,消息,按 key 設置過期時間,過期后將會自動刪除

4、Redis 相比 Memcached 有哪些優(yōu)勢?

(1)Memcached 所有的值均是簡單的字符串,redis 作為其替代者,支持更為豐富的數(shù)據(jù)類

(2)Redis 的速度比 Memcached 快很

(3)Redis 可以持久化其數(shù)據(jù)

5、Memcache 與 Redis 的區(qū)別都有哪些?

(1)存儲方式 Memecache 把數(shù)據(jù)全部存在內存之中,斷電后會掛掉,數(shù)據(jù)不能超過內存大小。Redis 有部份存在硬盤上,這樣能保證數(shù)據(jù)的持久性。

(2)數(shù)據(jù)支持類型 Memcache 對數(shù)據(jù)類型支持相對簡單。Redis 有復雜的數(shù)據(jù)類型。

(3)使用底層模型不同 它們之間底層實現(xiàn)方式 以及與客戶端之間通信的應用協(xié)議不一樣。Redis 直接自己構建了 VM 機制 ,因為一般的系統(tǒng)調用系統(tǒng)函數(shù)的話,會浪費一定的時間去移動和請求。

6、Redis 是單進程單線程的?

答:Redis 是單進程單線程的,redis 利用隊列技術將并發(fā)訪問變?yōu)榇性L問,消除了傳統(tǒng)數(shù)據(jù)庫串行控制的開銷。

7、一個字符串類型的值能存儲最大容量是多少?

答:512M

8、Redis 的持久化機制是什么?各自的優(yōu)缺點?

Redis提供兩種持久化機制 RDB 和 AOF 機制:

1、RDBRedis DataBase)持久化方式:

是指用數(shù)據(jù)集快照的方式半持久化模式)記錄 redis 數(shù)據(jù)庫的所有鍵值對,在某個時間點將數(shù)據(jù)寫入一個臨時文件,持久化結束后,用這個臨時文件替換上次持久化的文件,達到數(shù)據(jù)恢復。

優(yōu)點:

(1)只有一個文件 dump.rdb,方便持久化。

(2)容災性好,一個文件可以保存到安全的磁盤。

(3)性能最大化,fork 子進程來完成寫操作,讓主進程繼續(xù)處理命令,所以是 IO最大化。使用單獨子進程來進行持久化,主進程不會進行任何 IO 操作,保證了 redis的高性能)

(4)相對于數(shù)據(jù)集大時,比 AOF 的啟動效率更高。

缺點:

數(shù)據(jù)安全性低。RDB 是間隔一段時間進行持久化,如果持久化之間 redis 發(fā)生故障,會發(fā)生數(shù)據(jù)丟失。所以這種方式更適合數(shù)據(jù)要求不嚴謹?shù)臅r候

2、AOFAppend-only file)持久化方式:

是指所有的命令行記錄以 redis 命令請求協(xié)議的格式完全持久化存儲)保存為 aof 文件。

優(yōu)點:

(1)數(shù)據(jù)安全,aof 持久化可以配置 appendfsync 屬性,有 always,每進行一次命令操作就記錄到 aof 文件中一次。

(2)通過 append 模式寫文件,即使中途服務器宕機,可以通過 redis-check-aof工具解決數(shù)據(jù)一致性問題。

(3)AOF 機制的 rewrite 模式。AOF 文件沒被 rewrite 之前(文件過大時會對命令進行合并重寫),可以刪除其中的某些命令(比如誤操作的 flushall))

缺點:

(1)AOF 文件比 RDB 文件大,且恢復速度慢。

(2)數(shù)據(jù)集大的時候,比 rdb 啟動效率低。

9、Redis 常見性能問題和解決方案:

(1)Master 最好不要寫內存快照,如果 Master 寫內存快照,save 命令調度 rdbSave函數(shù),會阻塞主線程的工作,當快照比較大時對性能影響是非常大的,會間斷性暫停服務

(2)如果數(shù)據(jù)比較重要,某個 Slave 開啟 AOF 備份數(shù)據(jù),策略設置為每秒同步一

(3)為了主從復制的速度和連接的穩(wěn)定性,Master 和 Slave 最好在同一個局域網(wǎng)

(4)盡量避免在壓力很大的主庫上增加從

(5)主從復制不要用圖狀結構,用單向鏈表結構更為穩(wěn)定,即:Master <- Slave1<- Slave2 <- Slave3…這樣的結構方便解決單點故障問題,實現(xiàn) Slave 對 Master的替換。如果 Master 掛了,可以立刻啟用 Slave1 做 Master,其他不變。

10、redis 過期鍵的刪除策略?

(1)定時刪除:在設置鍵的過期時間的同時,創(chuàng)建一個定時器 timer). 讓定時器在鍵的過期時間來臨時,立即執(zhí)行對鍵的刪除操作。

(2)惰性刪除:放任鍵過期不管,但是每次從鍵空間中獲取鍵時,都檢查取得的鍵是否過期,如果過期的話,就刪除該鍵;如果沒有過期,就返回該鍵。

(3)定期刪除:每隔一段時間程序就對數(shù)據(jù)庫進行一次檢查,刪除里面的過期鍵。至于要刪除多少過期鍵,以及要檢查多少個數(shù)據(jù)庫,則由算法決定。

11、Redis 的回收策略(淘汰策略)?

volatile-lru:從已設置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰

volatile-ttl:從已設置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰

volatile-random:從已設置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰

allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰

allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰

no-enviction(驅逐):禁止驅逐數(shù)據(jù)

注意這里的 6 種機制,volatile 和 allkeys 規(guī)定了是對已設置過期時間的數(shù)據(jù)集淘汰數(shù)據(jù)還是從全部數(shù)據(jù)集淘汰數(shù)據(jù),后面的 lru、ttl 以及 random 是三種不同的淘汰策略,再加上一種 no-enviction 永不回收的策略。

使用策略規(guī)則:

(1)如果數(shù)據(jù)呈現(xiàn)冪律分布,也就是一部分數(shù)據(jù)訪問頻率高,一部分數(shù)據(jù)訪問頻率低,則使用 allkeys-lru

(2)如果數(shù)據(jù)呈現(xiàn)平等分布,也就是所有的數(shù)據(jù)訪問頻率都相同,則使用allkeys-random

12、為什么 edis 需要把所有數(shù)據(jù)放到內存中?

答 :Redis 為了達到最快的讀寫速度將數(shù)據(jù)都讀到內存中,并通過異步的方式將數(shù)據(jù)寫入磁盤。所以 redis 具有快速和數(shù)據(jù)持久化的特征。如果不將數(shù)據(jù)放在內存中,磁盤 I/O 速度為嚴重影響 redis 的性能。在內存越來越便宜的今天,redis 將會越來越受歡迎。如果設置了最大使用的內存,則數(shù)據(jù)已有記錄數(shù)達到內存限值后不能繼續(xù)插入新值。

13、Redis 的同步機制了解么?

答:Redis 可以使用主從同步,從從同步。第一次同步時,主節(jié)點做一次 bgsave,并同時將后續(xù)修改操作記錄到內存 buffer,待完成后將 rdb 文件全量同步到復制節(jié)點,復制節(jié)點接受完成后將 rdb 鏡像加載到內存。加載完成后,再通知主節(jié)點將期間修改的操作記錄同步到復制節(jié)點進行重放就完成了同步過程。

14、Pipeline 有什么好處,為什么要用 pipeline?

答:可以將多次 IO 往返的時間縮減為一次,前提是 pipeline 執(zhí)行的指令之間沒有因果相關性。使用 redis-benchmark 進行壓測的時候可以發(fā)現(xiàn)影響 redis 的 QPS峰值的一個重要因素是 pipeline 批次指令的數(shù)目。

15、是否使用過 Redis 集群,集群的原理是什么?

(1)Redis Sentinal 著眼于高可用,在 master 宕機時會自動將 slave 提升為master,繼續(xù)提供服務。

(2)Redis Cluster 著眼于擴展性,在單個 redis 內存不足時,使用 Cluster 進行分片存儲。

16、Redis 集群方案什么情況下會導致整個集群不可用?

答:有 A,B,C 三個節(jié)點的集群,在沒有復制模型的情況下,如果節(jié)點 B 失敗了,那么整個集群就會以為缺少 5501-11000 這個范圍的槽而不可用。

17、Redis 支持的 Java 客戶端都有哪些?官方推薦用哪個?

答:Redisson、Jedis、lettuce 等等,官方推薦使用 Redisson。

18、Jedis 與 Redisson 對比有什么優(yōu)缺點?

答:Jedis 是 Redis 的 Java 實現(xiàn)的客戶端,其 API 提供了比較全面的 Redis 命令的支持;Redisson 實現(xiàn)了分布式和可擴展的 Java 數(shù)據(jù)結構,和 Jedis 相比,功能較為簡單,不支持字符串操作,不支持排序、事務、管道、分區(qū)等 Redis 特性。

Redisson 的宗旨是促進使用者對 Redis 的關注分離,從而讓使用者能夠將精力更集中地放在處理業(yè)務邏輯上。

19、Redis 如何設置密碼及驗證密碼?

設置密碼:config set requirepass 123456

授權密碼:auth 123456

20、說說 Redis 哈希槽的概念?

答:Redis 集群沒有使用一致性 hash,而是引入了哈希槽的概念,Redis 集群有16384 個哈希槽,每個 key 通過 CRC16 校驗后對 16384 取模來決定放置哪個槽,集群的每個節(jié)點負責一部分 hash 槽。

21、Redis 集群的主從復制模型是怎樣的?

答:為了使在部分節(jié)點失敗或者大部分節(jié)點無法通信的情況下集群仍然可用,所以集群使用了主從復制模型,每個節(jié)點都會有 N-1 個復制品。

22、Redis 集群會有寫操作丟失嗎?為什么?

答 :Redis 并不能保證數(shù)據(jù)的強一致性,這意味這在實際中集群在特定的條件下可能會丟失寫操作。

23、Redis 集群之間是如何復制的?

答:異步復制

24、Redis 集群最大節(jié)點個數(shù)是多少?

答:16384 個。

25、Redis 集群如何選擇數(shù)據(jù)庫?

答:Redis 集群目前無法做數(shù)據(jù)庫選擇,默認在 0 數(shù)據(jù)庫。

26、怎么測試 Redis 的連通性?

答:使用 ping 命令。

27、怎么理解 Redis 事務?

答:

(1)事務是一個單獨的隔離操作:事務中的所有命令都會序列化、按順序地執(zhí)行。事務在執(zhí)行的過程中,不會被其他客戶端發(fā)送來的命令請求所打斷。

(2)事務是一個原子操作:事務中的命令要么全部被執(zhí)行,要么全部都不執(zhí)行。

28、Redis 事務相關的命令有哪幾個?

答:MULTI、EXEC、DISCARD、WATCH

29、Redis key 的過期時間和永久有效分別怎么設置?

答:EXPIRE 和 PERSIST 命令。

30、Redis 如何做內存優(yōu)化?

答:盡可能使用散列表(hashes),散列表(是說散列表里面存儲的數(shù)少)使用的內存非常小,所以你應該盡可能的將你的數(shù)據(jù)模型抽象到一個散列表里面。比如你的 web 系統(tǒng)中有一個用戶對象,不要為這個用戶的名稱,姓氏,郵箱,密碼設置單獨的 key,而是應該把這個用戶的所有信息存儲到一張散列表里面。

31、Redis 回收進程如何工作的?

答:一個客戶端運行了新的命令,添加了新的數(shù)據(jù)。Redi 檢查內存使用情況,如果大于 maxmemory 的限制, 則根據(jù)設定好的策略進行回收。一個新的命令被執(zhí)行,等等。所以我們不斷地穿越內存限制的邊界,通過不斷達到邊界然后不斷地回收回到邊界以下。如果一個命令的結果導致大量內存被使用(例如很大的集合的交集保存到一個新的鍵),不用多久內存限制就會被這個內存使用量超越。

32、都有哪些辦法可以降低 Redis 的內存使用情況呢?

答:如果你使用的是 32 位的 Redis 實例,可以好好利用 Hash,list,sorted set,set等集合類型數(shù)據(jù),因為通常情況下很多小的 Key-Value 可以用更緊湊的方式存放到一起。

33、Redis 的內存用完了會發(fā)生什么?

答:如果達到設置的上限,Redis 的寫命令會返回錯誤信息(但是讀命令還可以正常返回。)或者你可以將 Redis 當緩存來使用配置淘汰機制,當 Redis 達到內存上限時會沖刷掉舊的內容。

34、一個 Redis 實例最多能存放多少的 keys?List、Set、Sorted Set 他們最多能存放多少元素?

答:理論上 Redis 可以處理多達 232 的 keys,并且在實際中進行了測試,每個實例至少存放了 2 億 5 千萬的 keys。我們正在測試一些較大的值。任何 list、set、和 sorted set 都可以放 232 個元素。換句話說,Redis 的存儲極限是系統(tǒng)中的可用內存值。

35、MySQL 里有 2000w 數(shù)據(jù),redis 中只存 20w 的數(shù)據(jù),如何保證 redis 中的數(shù)據(jù)都是熱點數(shù)據(jù)?

答:Redis 內存數(shù)據(jù)集大小上升到一定大小的時候,就會施行數(shù)據(jù)淘汰策略。

相關知識:

Redis 提供 6 種數(shù)據(jù)淘汰策略:

volatile-lru:從已設置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰

volatile-ttl:從已設置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰

volatile-random:從已設置過期時間的數(shù)據(jù)集(server.db[i].expires)中任意選擇數(shù)據(jù)淘汰

allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰

allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中任意選擇數(shù)據(jù)淘汰

no-enviction(驅逐):禁止驅逐數(shù)據(jù)

36、Redis 最適合的場景?

1、會話緩存(Session Cache)

最常用的一種使用 Redis 的情景是會話緩存(session cache)。用 Redis 緩存會話比其他存儲(如 Memcached)的優(yōu)勢在于:Redis 提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現(xiàn)在,他們還會這樣嗎?幸運的是,隨著 Redis 這些年的改進,很容易找到怎么恰當?shù)氖褂?Redis 來緩存會話的文檔。甚至廣為人知的商業(yè)平臺Magento 也提供 Redis 的插件。

2、全頁緩存(FPC)

除基本的會話 token 之外,Redis 還提供很簡便的 FPC 平臺?;氐揭恢滦詥栴},即使重啟了 Redis 實例,因為有磁盤的持久化,用戶也不會看到頁面加載速度的下降,這是一個極大改進,類似 PHP 本地 FPC。再次以 Magento 為例,Magento提供一個插件來使用 Redis 作為全頁緩存后端。此外,對 WordPress 的用戶來說,Pantheon 有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度加載你曾瀏覽過的頁面。

3、隊列

Reids 在內存存儲引擎領域的一大優(yōu)點是提供 list 和 set 操作,這使得 Redis能作為一個很好的消息隊列平臺來使用。Redis 作為隊列使用的操作,就類似于本地程序語言(如 Python)對 list 的 push/pop 操作。如果你快速的在 Google中搜索“Redis queues”,你馬上就能找到大量的開源項目,這些項目的目的就是利用 Redis 創(chuàng)建非常好的后端工具,以滿足各種隊列需求。例如,Celery 有一個后臺就是使用 Redis 作為 broker,你可以從這里去查看。

4,排行榜/計數(shù)器

Redis 在內存中對數(shù)字進行遞增或遞減的操作實現(xiàn)的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執(zhí)行這些操作的時候變的非常簡單,Redis 只是正好提供了這兩種數(shù)據(jù)結構。所以,我們要從排序集合中獲取到排名最靠前的 10個用戶–我們稱之為“user_scores”,我們只需要像下面一樣執(zhí)行即可:當然,這是假定你是根據(jù)你用戶的分數(shù)做遞增的排序。如果你想返回用戶及用戶的分數(shù),你需要這樣執(zhí)行:ZRANGE user_scores 0 10 WITHSCORES Agora Games 就是一個很好的例子,用 Ruby 實現(xiàn)的,它的排行榜就是使用 Redis 來存儲數(shù)據(jù)的,你可以在這里看到。

5、發(fā)布/訂閱

最后(但肯定不是最不重要的)是 Redis 的發(fā)布/訂閱功能。發(fā)布/訂閱的使用場景確實非常多。我已看見人們在社交網(wǎng)絡連接中使用,還可作為基于發(fā)布/訂閱的腳本觸發(fā)器,甚至用 Redis 的發(fā)布/訂閱功能來建立聊天系統(tǒng)!

37、假如 Redis 里面有 1 億個 key,其中有 10w 個 key 是以某個固定的已知的前綴開頭的,如果將它們全部找出來?

答:使用 keys 指令可以掃出指定模式的 key 列表。

對方接著追問:如果這個 redis 正在給線上的業(yè)務提供服務,那使用 keys 指令會有什么問題?

這個時候你要回答 redis 關鍵的一個特性:redis 的單線程的。keys 指令會導致線程阻塞一段時間,線上服務會停頓,直到指令執(zhí)行完畢,服務才能恢復。這個時候可以使用 scan 指令,scan 指令可以無阻塞的提取出指定模式的 key 列表,但是會有一定的重復概率,在客戶端做一次去重就可以了,但是整體所花費的時間會比直接用 keys 指令長。

38、如果有大量的 key 需要設置同一時間過期,一般需要注意什么?

答:如果大量的 key 過期時間設置的過于集中,到過期的那個時間點,redis 可能會出現(xiàn)短暫的卡頓現(xiàn)象。一般需要在時間上加一個隨機值,使得過期時間分散一些。

39、使用過 Redis 做異步隊列么,你是怎么用的?

答:一般使用 list 結構作為隊列,rpush 生產(chǎn)消息,lpop 消費消息。當 lpop 沒有消息的時候,要適當 sleep 一會再重試。如果對方追問可不可以不用 sleep 呢?list 還有個指令叫 blpop,在沒有消息的時候,它會阻塞住直到消息到來。如果對方追問能不能生產(chǎn)一次消費多次呢?使用 pub/sub 主題訂閱者模式,可以實現(xiàn)1:N 的消息隊列。

如果對方追問 pub/sub 有什么缺點?

在消費者下線的情況下,生產(chǎn)的消息會丟失,得使用專業(yè)的消息隊列如 RabbitMQ等。

如果對方追問 redis 如何實現(xiàn)延時隊列?

我估計現(xiàn)在你很想把面試官一棒打死如果你手上有一根棒球棍的話,怎么問的這么詳細。但是你很克制,然后神態(tài)自若的回答道:使用 sortedset,拿時間戳作為score,消息內容作為 key 調用 zadd 來生產(chǎn)消息,消費者用 zrangebyscore 指令獲取 N 秒之前的數(shù)據(jù)輪詢進行處理。到這里,面試官暗地里已經(jīng)對你豎起了大拇指。但是他不知道的是此刻你卻豎起了中指,在椅子背后。

40、使用過 Redis 分布式鎖么,它是什么回事?

先拿 setnx 來爭搶鎖,搶到之后,再用 expire 給鎖加一個過期時間防止鎖忘記了釋放。

這時候對方會告訴你說你回答得不錯,然后接著問如果在 setnx 之后執(zhí)行 expire之前進程意外 crash 或者要重啟維護了,那會怎么樣?

這時候你要給予驚訝的反饋:唉,是喔,這個鎖就永遠得不到釋放了。緊接著你需要抓一抓自己得腦袋,故作思考片刻,好像接下來的結果是你主動思考出來的,然后回答:我記得 set 指令有非常復雜的參數(shù),這個應該是可以同時把 setnx 和expire 合成一條指令來用的!

對方這時會顯露笑容,心里開始默念:嗯,這小子還不錯。

文源網(wǎng)絡,僅供學習之用,如有侵權,聯(lián)系刪除。

我將本文的內容和往期的面試題及答案整理成了PDF文檔:

file

關注公眾號【java圈子】,優(yōu)質文章每日送達。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,363評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,497評論 3 416
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,305評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,962評論 1 311
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,727評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,193評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,257評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,411評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,945評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,777評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,978評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,519評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,216評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,642評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,878評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,657評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,960評論 2 373

推薦閱讀更多精彩內容