redis 熱key、bigKey、布隆過濾器、pipeline

之前在用redis的時候只會覺得說有緩存真好,可以節省大量時間,但是從來沒有想過redis可能會存在的問題。

在這裏記錄下最近自己遇到的以及聽到的可能有問題的地方。

熱Key

熱點key是指瞬間有大量請求去訪問同一個key,從而壓垮緩存服務。會造成流量過於集中,達到物理網卡上限,從而導致所在redis服務器宕機。那麼接下來,對於這個key的請求就不可用,可能會直接壓到數據庫。導致服務整體不可用。

發現熱key的方式:

  1. 憑藉業務經驗進行預估。問題在於並非所有的業務都能預估出哪些key是熱key。
  2. 在客戶端進行收集。在操作redis之前,先進行數據統計。缺點在於會對客戶端代碼造成入侵。
  3. 在Proxy層面進行收集,如果有統一proxy入口,可以在proxy上收集上報
  4. 直接使用redis自帶命令,monitor命令、hotkeys參數
  5. 自己抓包評估

解決方案:

  1. 利用二級緩存,利用本地緩存
  2. 備份熱key,把這個key在多臺機器上都存一份

目前自己代碼中用到的解決方案是對可能的熱key進行預估,並且將這些數據存儲到本地緩存中。之前一直是擔心本地緩存佔用內存過多,後來發現其實可以對需要本地緩存的數據進行一個預估,估計佔用存儲空間的大小。

https://www.jianshu.com/p/9a761a575daa

https://segmentfault.com/a/1190000017142556?utm_source=tag-newest 有贊透明多級緩存方案

https://www.cnblogs.com/williamjie/p/11250789.html

bigkey

bigkey可能造成的影響:

redis是單線程運行的,一次操作的value很大會對整個redis的響應時間造成負面影響。

這種情況下需要對bigkey進行拆分。

https://blog.csdn.net/beyond59241/article/details/78889867

https://blog.csdn.net/lavorange/article/details/83475960

想到之前的一種場景,需要對所有用戶的積分進行排名,之前用到了zset,但是當用戶數目上漲的時候,這個key也變成了一個bigkey,這個key在一週內有效,這裏如何拆分還沒有想到合適的方式。

布隆過濾器

布隆過濾器可以快速判斷一個元素是否在集合中

https://blog.csdn.net/u011277123/article/details/88757861

http://www.xiaosongit.com/index/detail/id/627.html

https://yq.aliyun.com/articles/167466?spm=a2c4e.11153940.0.0.7d2b49c4bqtmn6

pipeline

一次性執行多條命令提升執行速度。

原生的批命令具有原子性,而pipeline不具備原子性

原生批命令對應的是一條命令,多個key。pipeline是多命令

原生批命令是服務端實現,pipeline需要服務端和客戶端共同完成。

但是使用pipeline的時候也需要注意命令個數不應該太多,不然會導致數據量過大,增加客戶端的等待時間,還可能造成網絡擁堵。

https://blog.csdn.net/u011489043/article/details/78769428

https://blog.csdn.net/w1lgy/article/details/84455579

發佈了162 篇原創文章 · 獲贊 20 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章