之前在用redis的時候只會覺得說有緩存真好,可以節省大量時間,但是從來沒有想過redis可能會存在的問題。
在這裏記錄下最近自己遇到的以及聽到的可能有問題的地方。
熱Key
熱點key是指瞬間有大量請求去訪問同一個key,從而壓垮緩存服務。會造成流量過於集中,達到物理網卡上限,從而導致所在redis服務器宕機。那麼接下來,對於這個key的請求就不可用,可能會直接壓到數據庫。導致服務整體不可用。
發現熱key的方式:
- 憑藉業務經驗進行預估。問題在於並非所有的業務都能預估出哪些key是熱key。
- 在客戶端進行收集。在操作redis之前,先進行數據統計。缺點在於會對客戶端代碼造成入侵。
- 在Proxy層面進行收集,如果有統一proxy入口,可以在proxy上收集上報
- 直接使用redis自帶命令,monitor命令、hotkeys參數
- 自己抓包評估
解決方案:
- 利用二級緩存,利用本地緩存
- 備份熱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的時候也需要注意命令個數不應該太多,不然會導致數據量過大,增加客戶端的等待時間,還可能造成網絡擁堵。