【Java面試】Redis存線上程安全問題嗎?為什麼?

跟著Mic學架構 發表於 2022-05-25
Java 面試 Redis

一個工作了5年的粉絲私信我。

他說自己準備了半年時間,想如螞蟻金服,結果第一面就掛了,非常難過。

問題是: “Redis存線上程安全問題嗎?”

關於這個問題,看看普通人和高手的回答。

普通人:

嗯。。。。。。。。。。。。

高手:

好的,關於這個問題,我從兩個方面來回答。

第一個,從Redis 服務端層面。

Redis Server本身是一個執行緒安全的K-V資料庫,也就是說在Redis Server上執行的指令,不需要任何同步機制,不會存線上程安全問題。

雖然Redis 6.0裡面,增加了多執行緒的模型,但是增加的多執行緒只是用來處理網路IO事件,對於指令的執行過程,仍然是由主執行緒來處理,所以不會存在多個執行緒通知執行操作指令的情況。

image-20220418161842204

為什麼Redis沒有采用多執行緒來執行指令,我認為有幾個方面的原因。

  • Redis Server本身可能出現的效能瓶頸點無非就是網路IO、CPU、記憶體。但是CPU不是Redis的瓶頸點,所以沒必要使用多執行緒來執行指令。
  • 如果採用多執行緒,意味著對於redis的所有指令操作,都必須要考慮到執行緒安全問題,也就是說需要加鎖來解決,這種方式帶來的效能影響反而更大。

第二個,從Redis客戶端層面。

雖然Redis Server中的指令執行是原子的,但是如果有多個Redis客戶端同時執行多個指令的時候,就無法保證原子性。

假設兩個redis client同時獲取Redis Server上的key1, 同時進行修改和寫入,因為多執行緒環境下的原子性無法被保障,以及多程式情況下的共享資源訪問的競爭問題,使得資料的安全性無法得到保障。

image-20220418162653033

當然,對於客戶端層面的執行緒安全性問題,解決方法有很多,比如儘可能的使用Redis裡面的原子指令,或者對多個客戶端的資源訪問加鎖,或者通過Lua指令碼來實現多個指令的操作等等。

以上就是我對這個問題的理解。

總結

關於執行緒安全性問題,是一個非常重要,非常重要的知識。

雖然我們在實際開發中很少去主動使用執行緒,但是在專案中執行緒無處不在,比如Tomcat就是用多執行緒來處理請求的

如果對執行緒安全不瞭解,那麼很容已出現各種生產事故和莫名其妙的問題。

這也是為什麼大廠一定會問多執行緒併發的原因。

需要高手面試文件(附贈阿里內部十萬字面試文件)或者有不懂的技術面試題想諮詢的小夥伴可以私信或者關注同名公眾號。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注同名微信公眾號獲取更多技術乾貨!