不了解Redis快取,拿什麼去征服面試官?

2021-10-05 15:50:24 字數 3902 閱讀 7259

她剪了短髮

好像溫柔了許多

好像過的很好

好像也沒那麼好

其實我也不知道

我已經很久沒有見過她了。

快取的收益和成本

快取可能會出現的問題

無論是大廠小廠,在專案開發過程中,快取肯定是離不開的,重要性也毋庸置疑。作為高頻面試題,無論是為了應付面試,還是為了學到東西,都必須要認真對待。

完全基於記憶體,絕大部分請求是純粹的記憶體操作,非常快速。資料存在記憶體中,類似於hashmap,hashmap的優勢就是查詢和操作的時間複雜度都是o(1)。

資料結構簡單,對資料操作也簡單,redis中的資料結構是專門進行設計的。

採用單執行緒,避免了不必要的上下文切換和競爭條件,也不存在多程序或者多執行緒導致的切換而消耗 cpu,不用去考慮各種鎖的問題,不存在加鎖釋放鎖操作,沒有因為可能出現死鎖而導致的效能消耗。

使用多路i/o復用模型(多個網路連線復用乙個執行緒,可以讓單個執行緒高效的處理多個連線請求),非阻塞io。

使用底層模型不同,它們之間底層實現方式以及與客戶端之間通訊的應用協議不一樣,redis直接自己構建了vm 機制 ,因為一般的系統呼叫系統函式的話,會浪費一定的時間去移動和請求。

org.springframework.boot<

/groupid>

spring-boot-starter-cache<

/artifactid>

<

/dependency>

//配置類新增註解

@enablecaching

//一般作用在查方法上

//在執行方法前先檢視快取中是否有資料,如果有資料,則直接返回快取資料;若沒有資料,執行該方法並將方法返回值放進快取。

//引數: value快取名、 key快取鍵值、 condition滿足快取條件、unless否決快取條件

@cacheable

//一般作用於增加修改方法

//和 @cacheable 類似,但會把方法的返回值放入快取中

@cacheput

//一般作用於刪除方法上

//方法執行成功後會從快取中移除相應資料。

//value快取名、 key快取鍵值、 condition滿足快取條件、 unless否決快取條件、 allentries是否移除所有資料(設定為true時會移除所有快取)

@cacheevict

針對問題解決:生成key過於簡單,容易衝突------自定義keygenerator

無法設定過期時間,預設過期時間為永久不過期------自定義cachemanager,設定快取過期時間

配置序列化方式,預設的是序列化jdkserialazable------配置類自定義序列化方式

在搭建完集群環境後,不得不考慮的乙個問題就是使用者訪問產生的session如何處理。如果不做任何處理的話,使用者將出現頻繁登入的現象,比如集群中存在a、b兩台伺服器,使用者在第一次訪問**時,nginx通過其負載均衡機制將使用者請求**到a伺服器,這時a伺服器就會給使用者建立乙個session。當使用者第二次傳送請求時,nginx將其負載均衡到b伺服器,而這時候b伺服器並不存在session,所以就會將使用者踢到登入頁面。這將大大降低使用者體驗度,導致使用者的流失,這種情況是專案絕不應該出現的。

我們應當對產生的session進行處理,通過粘性session,session複製或session共享等方式保證使用者的體驗度。

使用redis共享session

org.springframework.session<

/groupid>

spring-session-data-redis<

/artifactid>

<

/dependency>

//引數設定快取時間

50)

redis儲存的session格式為:

spring:session:sessions:expires:

+『sessionid』

高速讀寫------快取加速讀寫速度

降低後端負載------降低關係型資料庫負載壓力

資料不一致------更新策略有問題將導致快取資料和資料庫資料不一致問題

**維護成本------不僅要維護資料庫,還要維護快取

堆內快取記憶體溢位------一般快取方式分為堆內快取和遠端伺服器快取(redis),堆內快取效能更高,不需要進行網路傳輸,遠端快取需要套接字傳輸。使用者級別快取建議遠端快取,大資料量建議遠端快取,服務節點化原則。

如果快取集中在一段時間內失效,發生大量的快取穿透,所有的查詢都落在資料庫上,造成了快取雪崩。

由於原有快取失效,新快取未到期間所有原本應該訪問快取的請求都去查詢資料庫了,而對資料庫cpu 和記憶體造成巨大壓力,嚴重的會造成資料庫宕機。

◆解決

加鎖排隊------排斥鎖

資料預熱------可以通過快取reload機制,預先去更新快取,再即將發生大併發訪問前手動觸發載入快取不同的key。

雙層快取策略------c1為原始快取,c2為拷貝快取,c1失效時,可以訪問c2,c1快取失效時間設定為短期,c2設定為長期。

定時更新快取策略------ 失效性要求不高的快取,容器啟動初始化載入,採用定時任務更新或移除快取。

設定不同的過期時間------讓快取失效的時間點盡量均勻

詳細說一下加鎖排隊

即第乙個執行緒過來讀取cache,發現沒有,就去訪問db。後續執行緒再過來就需要等待第乙個執行緒讀取db成功,cache裡的value變得可用,後續執行緒返回新的value。

用到了加鎖排隊,吞吐率是不高的。僅適用於併發量不大的場景。

偽**

public object getcachevalue

(string key,

int expiredtime)

else

else}}

finally

return cachevalue;

}}

快取和資料庫中都沒有的資料,而使用者不斷發起請求,如果攻擊者入侵,可能造成資料庫壓力大。

這裡需要注意和快取擊穿的區別,快取擊穿,是指乙個key非常熱點,在不停的扛著大併發,大併發集中對這乙個點進行訪問,當這個key在失效的瞬間,持續的大併發就穿破快取,直接請求資料庫,就像在乙個屏障上鑿開了乙個洞。

◆解決

快取空物件------如果乙個查詢返回的資料為空,我們仍然把這個空結果進行快取,但它的過期時間會很短,最長不超過五分鐘。 通過這個直接設定的預設值存放到快取,這樣第二次到緩衝中獲取就有值了,而不會繼續訪問資料庫。

布隆過濾器------將所有可能存在的資料雜湊到乙個足夠大的 bitmap 中,乙個一定不存在的資料會被這個bitmap 攔截掉,從而避免了對底層儲存系統的查詢壓力(類似set),為什麼不用set?因為布隆過濾器占用記憶體空間很小,bit儲存。效能特別高。

你還不了解的OKRs E是什麼?

2020年,okr目標管理法成為80 企業都開始關注的企業管理方法。一方面因為環境原因,跨地域辦公這種工作模式開始被考慮如何更好的去執行,另一方面okr本身能夠從員工的層面來改變整個企業,因為企業的根本還是大部分普通員工。okr是目標與關鍵成果,這是很多人都已經知道的部分,但能讓okr具體到實際執行...

Redis高階不得不了解的記憶體優化細節

宣告 本文內容來自 redis開發與運維 一書第八章。redis所有的資料都在記憶體中,而記憶體又是非常寶貴的資源。對於如何優化記憶體使用一直是redis使用者非常關注的問題。本文讓我們深入到redis細節中,學習記憶體優化的技巧。分為如下幾個部分 一.redisobject物件 二.縮減鍵值物件 ...

Redis高階不得不了解的記憶體優化細節

宣告 本文內容來自 redis開發與運維 一書第八章。redis所有的資料都在記憶體中,而記憶體又是非常寶貴的資源。對於如何優化記憶體使用一直是redis使用者非常關注的問題。本文讓我們深入到redis細節中,學習記憶體優化的技巧。分為如下幾個部分 一.redisobject物件 二.縮減鍵值物件 ...