Redis常見問題,從入門到放棄

2021-09-28 20:49:38 字數 2183 閱讀 4198

1、為什麼使用redis

在專案中主要是為了解決效能和併發問題,當然redis還具備做分布式鎖的功能,但如果只是為了分布式鎖,完全可以用其他的中介軟體(如zookeeper)代替,並不是非要用redis。

2、使用redis有什麼缺點

先更新資料庫,再更新快取

先刪除快取,再更新資料庫

先更新資料庫,在刪除快取

三種方案,哪個好???

(一)先更新資料,在更新快取

普遍不推薦,為何?

原因一、從併發,執行緒安全角度

執行緒a和執行緒b同時進行更新操作,那麼會出現以下問題:

執行緒a更新資料庫

執行緒b更新資料庫

執行緒b更新快取

執行緒a更新快取

這樣就會出現髒資料,一般不考慮!

原因二、業務場景角度

(1)當我們在操作乙個寫比較多而讀比較少的業務場景的時候,這種方案就會導致快取還沒有被讀到就被頻繁的更新

(2)如果你寫入資料庫的值,並不是直接寫入快取的,而是要經過一系列複雜的計算再寫入快取。那麼,每次寫入資料庫後,都再次計算寫入快取的值,無疑是浪費效能的。顯然,刪除快取更為適合。

(二)先刪除快取,再更新資料庫

有這樣乙個場景,執行緒a進行更新操作,執行緒b進行查詢操作

執行緒a刪除快取

執行緒b查詢快取,沒有

執行緒b查詢資料庫,將值放入快取並返回

執行緒a更新資料庫

這樣也導致了髒資料,如果沒有給快取設定過期時間,那麼快取與資料庫就永遠不一致。

可以解決嗎?

採用延時雙刪策略,意思就是先刪除快取,再更新資料庫,最後休眠一段時間再次刪除快取。

這裡說的休眠時間是多久呢,根據自己的業務情況而定,可以在讀操作所花的時間加上幾百ms就行,目的就是刪除讀操作所產生的快取。差不多解決了,你說要是加上休眠系統吞吐量降低了怎麼辦呢,那就將第二次刪除作為非同步的。自己起乙個執行緒,非同步刪除。這樣,寫的請求就不用沉睡一段時間後了,再返回。這麼做,加大吞吐量。

大多數設計者會採用加鎖或者佇列的方式來保證不會有大量的請求直接到達資料庫,當然如果併發量很大,這可能會使得使用者等待超時

給快取不同的快取過期時間

給快取加乙個快取過期標誌。簡要說明:就是每個快取(key)都有乙個與之對應的標記(key_sign)也存在快取裡面,且該標記的過期時間為對應快取值的過期時間的一半。當請求到達快取時,判斷每個快取(key)對應的標記(key_sign)是否過期,若沒有,則直接返回快取值(key對應的值value),若key_sign過期,去資料庫查詢資料,將資料更新到快取值(key對應的value),同時將快取標記(key_sign)設定為未過期,並更新兩者的過期時間。

布隆過濾器,將所有可能存在的值放在乙個足夠大的bitmap中,當乙個一定不存在bitmap中的資料會被這個bitmap過濾掉,從而避免了對底層儲存系統的查詢壓力

另一種是,直接將從資料庫中查到的空值進行快取,但是它的過期時間很短,最長不超過五分鐘,這樣第二次查詢時快取中就有值了。

3、單執行緒的redis為什麼這麼快

4、redis的資料型別,以及每種資料型別的使用場景

5、redis的過期策略以及記憶體淘汰機制

redis採用的是定期刪除+惰性刪除

採用定期刪除 + 惰性刪除有問題嗎?

當然,定期刪除沒刪掉,而你也沒有去獲取,這個過期的key也沒有失效。這樣,redis的記憶體佔用率會越來越高。so!

記憶體淘汰機制就有了

在redis.conf中有這樣一行配置就是配置記憶體淘汰機制的

#max-memory-policy volitile-lru

noeviction:當記憶體不足以寫入新資料時,新寫入操作會報錯

allkeys-lru:當記憶體不足以寫入新資料時,會移除最近最少使用的key

allkeys-random:當記憶體不足以寫入新資料時,在鍵中間中,隨機移除某個key

volatile-ttl:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,有更早過期時間的key優先移除。不推薦

可以發現,如果在沒有設定快取過期時間的鍵空間中,volatile-lru、volatile-random、volatile-ttl和noeviction一樣流氓!

redis 從入門到放棄

keys ping 測試客戶機與伺服器的連線 info 檢視環境資訊,比如客戶端數量等 config get 檢視系統配置資訊 dbsize 有多少個key keys 檢視所有key del key 刪除指定key type key 返回 key 所儲存的值的型別。expire key time i...

kmp從入門到放棄

標籤 kmp 擴充套件kmp 給你兩個字串,你需要回答,b串是否是a串的子串 a串是否包含b串 a aaaaaaaaaaaaaaaaaaaaaaaaaab b aaaaaaaab 最壞狀態 o mn 一般做法 for 列舉b在a串中的起始位置 for 向後比較ab是否相等 o n m 傳說中的kmp...

beego 從入門到放棄

beego 的專案基本都是通過 bee命令來建立的,所以在建立專案之前確保你已經安裝了 bee 工具和 beego。如果你還沒有安裝,那麼請查閱 beego 的安裝 和 bee 工具的安裝 現在一切就緒我們就可以開始建立專案了,開啟終端,進入 gopath src 所在的目錄 建立乙個專案名為201...