關於redis的某些事

2021-09-25 16:23:58 字數 2338 閱讀 7064

1、redis使用場景,能做什麼事,不方便做什麼事?

2、為什麼使用redis?

3、redis為什麼這麼快?

4、redis快取和資料庫資料一致性問題

先刪除快取,然後更新資料庫

5、如何應對快取穿透和快取雪崩問題以及快取擊穿

快取穿透,即黑客故意去請求快取中不存在的資料,導致所有的請求都懟到資料庫上,從而資料庫連線異常。

解決方案:

(一)利用互斥鎖,快取失效的時候,先去獲得鎖,得到鎖了,再去請求資料庫。沒得到鎖,則休眠一段時間重試

(二)採用非同步更新策略,無論key是否取到值,都直接返回。value值中維護乙個快取失效時間,快取如果過期,非同步起乙個執行緒去讀資料庫,更新快取。需要做快取預熱(專案啟動前,先載入快取)操作。

(三)提供乙個能迅速判斷請求是否有效的攔截機制,比如,利用布隆過濾器,內部維護一系列合法有效的key。迅速判斷出,請求所攜帶的key是否合法有效。如果不合法,則直接返回。

快取雪崩,即快取同一時間大面積的失效,這個時候又來了一波請求,結果請求都懟到資料庫上,從而導致資料庫連線異常。

解決方案:

(一)給快取的失效時間,加上乙個隨機值,避免集體失效。

(二)使用互斥鎖,但是該方案吞吐量明顯下降了。

(三)雙快取。我們有兩個快取,快取a和快取b。快取a的失效時間為20分鐘,快取b不設失效時間。自己做快取預熱操作。然後細分以下幾個小點

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

key設定不過期

6、如何解決redis的併發競爭key問題?

7、redis的過期策略和記憶體淘汰機制

我們set key的時候,都可以給乙個expire time,就是過期時間,指定這個key比如說只能存活1個小時,我們自己可以指定快取到期就失效。

如果假設你設定乙個一批key只能存活1個小時,那麼接下來1小時後,redis是怎麼對這批key進行刪除的?

答案是:定期刪除+惰性刪除

所謂定期刪除,指的是redis預設是每隔100ms就隨機抽取一些設定了過期時間的key,檢查其是否過期,如果過期就刪除。

注意,這裡可不是每隔100ms就遍歷所有的設定過期時間的key,那樣就是一場效能上的災難。

實際上redis是每隔100ms隨機抽取一些key來檢查和刪除的。

但是,定期刪除可能會導致很多過期key到了時間並沒有被刪除掉,所以就得靠惰性刪除了。

這就是說,在你獲取某個key的時候,redis會檢查一下 ,這個key如果設定了過期時間那麼是否過期了?如果過期了此時就會刪除,不會給你返回任何東西。

並不是key到時間就被刪除掉,而是你查詢這個key的時候,redis再懶惰的檢查一下

通過上述兩種手段結合起來,保證過期的key一定會被乾掉。

如果大量過期key堆積在記憶體裡,導致redis記憶體塊耗盡了,怎麼辦?

答案是:走記憶體淘汰機制。

記憶體淘汰機制:

noeviction:當記憶體不足以容納新寫入資料時,新寫入操作會報錯,這個一般沒人用吧

allkeys-lru:當記憶體不足以容納新寫入資料時,在鍵空間中,移除最近最少使用的key(這個是最常用的)

allkeys-random:當記憶體不足以容納新寫入資料時,在鍵空間中,隨機移除某個key,這個一般沒人用吧

volatile-lru:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,移除最近最少使用的key(這個一般不太合適)

volatile-random:當記憶體不足以容納新寫入資料時,在設定了過期時間的鍵空間中,隨機移除某個key

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

續2023年某些事

開始了第一次面試,先是筆試,對於剛做測試的我來說,有些理論上的東西確實不懂。工作的時候只是動手操作,那份卷子答的一般。筆試之後接著就是面試,面試官是個女的。乙個比較會用眼睛會說話的女人,從她的眼神看出了犀利和內涵。倒數第二題她問我你是怎麼知道 公司的,對我們公司了解多少。當時感覺自己太天真,答的挺有...

關於某些莫隊的優化

這種優化只能對於在擴充套件縮小區間維護答案時,查詢的東西是可以差分的,並且只能優化掉修改的複雜度 比如你在查乙個區間的逆序對,當你擴充套件右端點時,你需要將答案加上前面這段區間中比新的右端點位置上的值大的個數,這種查詢就是可以差分的,比如我們當前的區間的左右端點為l,r l,rl,r,那麼我們擴充套...

redis 集群批量刪除 某些key

驗證 插入資料10.20.26.92 7000 set test s1 1 10.20.26.92 7000 set test s2 2刪除資料redis cli h 127.0.0.1 p 6379 a 123456 keys test s xargs redis cli h 127.0.0.1 ...