你必須知道的Redis使用規範

java零基礎自學,點擊瞭解:https://how2j.cn

本文章轉載自(如有侵權,聯繫刪除):https://my.oschina.net/kenblog/blog/3196207


Redis使用規範

在公司項目中,redis屬於高頻使用,在使用中,我們遇到了各種各樣的redis問題,於是針對自身情況梳理了一個redis使用規範。

一、鍵名設計

1、key名設計

  1. 禁止包含特殊字符(比如空格、換行、單雙引號以及其他轉義字符)

  2. 建議以業務名爲前綴,以冒號分割來構造一定規則的key名(比如業務名:表名:id)

比如:teach:leeson_id:21
  1. 控制key的長度
key太長量一大起來就會非常佔用內存

2、value設計

  1. 拒絕大key操作
禁用超過10K的string大key(雖然redis支持512MB大小的string),如果1mb的key每秒重複寫入10次,就會導致寫入網絡IO達10MB。

錯誤示範:直接將laravel的整個模型或者對象當成value存儲
  1. 設計key時使用合適的數據類型(在資源利用和性能之間作平衡)
錯誤示範:一個普通字符串弄成hash類型進行存儲
  1. 一定要控制key的生命週期
錯誤示範:key設置爲永不過期
  1. 控制value長度
比如string類型,如果value爲'8個字節的長整型'則內部使用int類型,如果value爲'小於等於39個字節的字符串'則內部使用embstr類型,如果value爲'大於39個字節的字符串'則內部使用raw類型。這樣能很好的利用redis的性能。
  1. 數據按需存儲
不需要的數據千萬不要存儲在redis,只會浪費內存空間

二、命令使用

  1. 禁止使用keys、flushall、hmgetall等命令
爲防止業務研發的誤操作,通常可以在交付redis實例之前將默認命令rename掉;而真正需要刪除或者遍歷key時可以使用scan家族命令
  1. 慎用hgetall、lrange、smembers、zrange等命令
除非業務場景需要,儘量不要使用這些命令。如果沒有控制好會導致操作量過大,形成阻塞。

三、緩存設計

  1. 多個庫的使用

如果應用中會涉及到各種不同的redis數據存儲,應該分庫存儲,最好是一種業務使用一個庫

比如:課程緩存:庫1;訂單隊列:庫2;日誌處理:庫3
  1. 避免多個應用公用一個redis實例
避免一個應用出現問題或者錯誤使用拖累其他應用
  1. 合理評估業務場景,並設置最大內存以及內存淘汰策略(maxmemory和maxmemory-policy)
目前我們用的阿里雲redis,不太存在這個問題
  1. 使用帶有連接池的數據庫,可以有效控制連接,同時提高效率

  2. 給redis設置一個密碼

目前我們用的阿里雲redis,不太存在這個問題
  1. 冷熱數據區分
雖然 Redis支持持久化,但將所有數據存儲在redis中,成本非常昂貴。
建議將熱數據 (如 QPS超過 5k) 的數據加載到redis中。
低頻數據可存儲在Mysql、ElasticSearch中。
  1. 緩存非特殊情況不做中間態
redis大多數時候都是做緩存用,去掉後業務邏輯不應發生改變,萬不可切入到業務裏。
第一,緩存的高可用會影響業務;
第二,產生深耦合會發生無法預料的效果;
第三,會對維護產生負效果。

四、場景實戰問題

1、項目redis使用問題

當前的使用方式是,每個接入的應用要配置核心項目的redis配置。這樣是不合理的,核心項目的redis應該只能在核心項目中使用,對外應該是提供api接口或者rpc進行訪問。

2、慎用laravel自帶的cache功能

laravel自帶的cache功能最容易導致大key,經常由於簡單使用至今將整個對象模型存儲到redis,造成大key。

3、注意key的過期時間設置

在報名等高峯期的時候,key值設置過短容易造成緩存穿透,導致大量請求直接打到mysql數據庫。

4、小心緩存穿透

經常使用會只給有數據的結果進行緩存,結果導致空數據無法緩存,相同查詢直接每次都到達數據庫,所以空值也應該被緩存。

5、慎用緩存層層包裹

緩存裏面的數據還有一層緩存數據,會導致問題排查麻煩,出問題也不容易處理。

6、慎用將redis做爲消息隊列

如沒有非常特殊的需求,嚴禁將 Redis 當作消息隊列使用。redis 當作消息隊列使用,會有容量、網絡、效率、功能方面的多種問題。

如需要消息隊列,可使用高吞吐的 Kafka 或者高可靠的 RocketMQ,nsq,(花園同步有時間前後要求,且量不大才使用的)。

五、查詢使用問題

1、線上Redis禁止使用Keys正則匹配操作

redis是單線程處理,在線上Key數量較多時,操作效率極低【時間複雜度爲O(N)】,該命令一旦執行會嚴重阻塞線上其它命令的正常請求,而且在高QPS情況下會直接造成redis服務崩潰!如果有類似需求,請使用scan命令代替。

六、其他

1、redis同步工具

阿里雲的redis-shake工具,方便快速

2、大key查詢

阿里雲有大key分析工具

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