tyro系列之三:Redis學習筆記

Redis是什麼?

Redis是用C語言開發的一個開源的高性能鍵值對內存數據庫,是一種NoSQL數據庫。它提供五種數據類型:string、hashlist,set,zset

Redis的應用場景

通常把Redis當成內存數據庫(如登錄信息)、緩存服務器(如商品信息)、解決分佈式集羣架構中的session共享問題等。之前在工作中,我們同時用了Redis和Memcached兩種緩存。兩者分工明確,Redis用於業務數據緩存,Memcached用於接口數據緩存。我們所謂的業務數據緩存,是指把和用戶相關的業務數據緩存起來,讓用戶登錄和收聽速度更快,有更好的用戶體驗。我們用Redis緩存的業務數據有:用戶sessionId、驗證碼、驗證碼發送次數;用戶賬號、角色、權限、收藏、上次收聽狀態等;內容分類、播放地址等。我們所謂的接口數據緩存,是在代碼層面把提供給客戶端的接口數據緩存起來。

Redis序列化

在SpringDataRedis中,RedisTemplate默認使用的是JdkSerializationRedisSerializer,StringRedisTemplate默認使用的是StringRedisSerializer。我們之前習慣用StringRedisTemplate,像驗證碼本來就是字符串。如果是複雜對象,保存時我們手動調用JSON.toJSONString()把對象轉化成字符串,獲取時手動調用 JSON.parseObject()還原成對象。這種做法肯定比採用Spring提供的Jackson2JsonRedisSerializer性能要差。我準備以後在項目中具體比較下。

Redis遠不止這麼多

 一般開發人員,配一個連接池、一個StringRedisSerializer,就可以get、set了,Redis就用起來了。這樣還不夠。《Redis開發與運維》這本書中給出的“用好Redis的建議”是:1、切勿當做黑盒使用,開發與運維同樣重要。2、閱讀源碼。這本書中說很多線上故障都是把Redis當成黑盒使用造成的。

Redis事務

Redis本身是單線程的。每個命令都是原子操作。Redis事務服務的對象是命令集合,它將命令集合序列化並確保處於同一事務的命令集合連續且不被打斷地執行。它不支持回滾操作。事務是通過MULTI,EXEC,DISCARD和WATCH命令完成的。

Redis持久化方案

Redis提供了兩種持久化方案:RDB方式(默認)和AOF方式。RDB方式是通過快照完成的,當符合一定條件時Redis會自動將內存中的數據進行快照並持久化到硬盤。

開啓AO F持久化後每執行一條會更改Redis中的數據的命令,Redis就會將該命令寫入硬盤中的AOF文件。

緩存穿透、緩存雪崩緩存擊穿

這幾個詞是最近才知道的(感覺自己真的像個江湖郎中)。我們通常都是根據key去緩存查詢,如果找不到就去DB查詢。如果key對應的value是一定不存在的,並且對該key併發請求量很大,就會對DB造成很大的壓力。這就叫做“緩存穿透”。

當緩存服務器重啓或者大量緩存集中在某個時間段失效,會給DB帶來很大壓力。這就叫做“緩存雪崩”。

某個key的緩存值在某個時間點失效的時候,恰好有大量的請求過來,這些請求發現緩存過期又從DB加載數據並回設到緩存。此時可能瞬間把DB壓垮。這就叫“緩存擊穿”。 緩存擊穿指查詢同一個key,緩存雪崩是查詢不同key。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章