Redis使用規範

Redis使用規範1、        目的redis

爲了不出現因redis使用不當而出現異常影響業務,以及方便後面的運維,故出具redis使用規範,經過規範使用能夠更好、更高效發揮redis緩存優點。數據庫

2、        使用規範1.  Redis有數據丟失風險,程序須要處理數據丟失時從新加載過程【強制】數組

使用redis有丟失數據的風險,項目架構時須要考慮到相應解決方案,程序須要處理若是redis數據丟失時從新加載過程。緩存


2.  冷熱數據分離【強制】服務器

冷熱數據分離,不要將全部數據所有都放到Redis中, 雖然Redis支持持久化,可是Redis的數據存儲所有都是在內存中的,成本昂貴。建議根據業務只將高頻熱數據存儲到Redis中,對於低頻冷數據可使用基於磁盤(Oracle、MySQL、MongoDB等)存儲方式,不只節省內存成本,並且數據量小在操做時速度更快、效率更高!網絡


3.  不一樣業務數據要分開存儲【強制】數據結構

不要將不相關的業務數據都放到一個Redis實例中,新業務申請新的單獨實例。由於Redis爲單線程處理,獨立存儲會減小不一樣業務相互操做的影響,提升請求響應速度;同時也避免單個實例內存數據量過大,在出現異常狀況時能夠更快恢復服務。架構


4.  規範Key格式【強制】併發

合適的Key,便於查看,統計,排錯。不推薦含義不清的Key和特別長的Key。例如:系統名+應用名+業務數據 。運維


5.  選擇合適的數據類型【建議】

在不能肯定其它複雜數據結構必定優於String類型時,避免使用Redis的複雜數據結構。每種數據結構都有相應的使用場景,String類型是Redis中最簡單的數據類型,推薦使用String類型。可是考慮到具體的業務場景,綜合評估性能、存儲、網絡等方面以後使用適當的數據結構。Redis支持的數據庫結構類型較多:字符串(String),哈希(Hash),列表(List),集合(Set),有序集合(Sorted Set), Bitmap, HyperLogLog和地理空間索引(geospatial)等,須要根據業務場景選擇合適的類型,常見的如:String能夠用做普通的K-V、計數類;Hash能夠用做對象如商品、經紀人等,包含較多屬性的信息;List能夠用做消息隊列、粉絲/關注列表等;Set能夠用於推薦;SortedSet能夠用於排行榜等。


6.  謹慎全量操做Hash、Set等集合結構【建議】

在使用HASH結構存儲對象屬性時,開始只有有限的十幾個field,每每使用HGETALL獲取全部成員,效率也很高,可是隨着業務發展,會將field擴張到上百個甚至幾百個,此時還使用HGETALL會出現效率急劇降低、網卡頻繁打滿等問題,此時建議根據業務拆分爲多個Hash結構;或者若是大部分都是獲取全部屬性的操做,能夠將全部屬性序列化爲一個STRING類型存儲!一樣在使用SMEMBERS操做SET結構類型時也是相同的狀況。


7.  對於必需要存儲的大文本數據壓縮後存儲【建議】

對於大文本寫入到Redis時,要壓縮後存儲。大文本數據存入Redis,除了帶來極大的內存佔用外,在訪問量高時,很容易就會將網卡流量佔滿,進而形成整個服務器上的全部服務不可用,並引起雪崩效應,形成各個系統癱瘓。


8.  禁止大String【強制】

核心集羣禁用大於1MB的String大Key(雖然Redis支持512MB大小的String),若是1MB的key每秒重複寫入10次,就會致使寫入網絡IO達10MB。


9.  線上Redis禁止使用Keys正則匹配操做【強制】

Redis是單線程處理,在線上KEY數量較多時,操做效率極低,該命令一旦執行會嚴重阻塞線上其它命令的正常請求,並且在高QPS狀況下會直接形成Redis服務崩潰。若是有相似需求,用Scan命令代替。


10. 存儲的Key要儘量設置超時時間【建議】

若是應用將Redis定位爲緩存Cache使用,對於存放的Key要設置超時時間!由於若不設置,這些Key會一直佔用內存不釋放,形成極大的浪費,並且隨着時間的推移會致使內存佔用愈來愈大,直到達到服務器內存上限。另外Key的超時長短要根據業務綜合評估,而不是越長越好。


11. 頻繁對String進行Append操做,則使用List【建議】

若是出現頻繁對String進行Append操做,則請使用List進行Push操做,取出時使用Pop。這樣避免String頻繁分配內存致使的延時。


12. 線上禁止長時間打開Monitor命令【強制】

禁止生產環境長時間打開Monitor命令,Monitor命令在高併發條件下,會存在內存暴增和影響Redis性能的隱患。


13. 位級別和字級別的操做【建議】

Redis 引入了位級別和字級別的操做:GETRANGE, SETRANGE, GETBIT 和 SETBIT.使用這些命令,能夠把Redis的字符串當作一個隨機讀取的(字節)數組。例如你有一個應用,用來標誌用戶的ID是連續的整數,你可使用一個位圖標記用戶的性別,使用1表示男性,0表示女性,或者其餘的方式。這樣的話,1億個用戶將僅使用12 M的內存。你可使用一樣的方法,使用 GETRANGE 和 SETRANGE 命令爲每一個用戶存儲一個字節的信息。


14. 設置最大內存及最大內存淘汰策略參數【強制】

設置最大內存能夠限制redis內存使用,避免出現耗盡全部物理內存OOM問題出現故障。同時設置maxmemory-policy(最大內存淘汰策略),根據自身業務類型,選好maxmemory-policy(最大內存淘汰策略),設置好過時時間。

15. 預留足夠空閒物理內存【強制】Redis在作持久化時會fork出一個一樣資源大小的進程來進行bgsave操做,預留足夠物理內存(通常須要預留總物理內存的40%左右)能夠保證fork進程正常,避免持久化失敗。

相關文章
相關標籤/搜索