Redis key 命名需具有可讀性以及可管理性鸠窗,不該使用含義不清的 key 以及特別長的 key 名妓羊;
一、實現(xiàn)目標(biāo)
簡潔稍计,高效躁绸,可維護(hù)
二、鍵值設(shè)計規(guī)約
1 臣嚣、 Redis key 命名風(fēng)格
【推薦】Redis key 命名需具有可讀性以及可管理性净刮,不該使用含義不清的 key 以及特別長的 key 名;
【強(qiáng)制】以英文字母開頭硅则,命名中只能出現(xiàn)小寫字母淹父、數(shù)字、英文點(diǎn)號 (.) 和英文半角冒號(:)怎虫;
【強(qiáng)制】不要包含特殊字符暑认,如下劃線、空格大审、換行蘸际、單雙引號以及其他轉(zhuǎn)義字符;
2 徒扶、命名規(guī)范
【強(qiáng)制】命名規(guī)范:業(yè)務(wù)模塊名: 業(yè)務(wù)邏輯含義: 其他: value 類型
1 )業(yè)務(wù)模塊名:具體的功能模塊
2)邏輯含義段:
【強(qiáng)制】不同業(yè)務(wù)邏輯含義使用英文半角冒號 (:) 分割粮彤,
【強(qiáng)制】同一業(yè)務(wù)邏輯含義段的單詞之間使用英文半角點(diǎn)號 (.) 分割,用來表示一個完整的語義
3)value 類型:
【強(qiáng)制】Redis key 命名以 key 所代表的 value 類型結(jié)尾姜骡,以提高可讀性导坟;
示例:user:basic.info:{userid}:string
3 、 value 設(shè)計
【強(qiáng)制】:拒絕 bigkey(防止網(wǎng)卡流量圈澈、慢查詢)乍迄。
String 類型控制在 10KB 以內(nèi),Hash士败、List闯两、Set、ZSet 元素個數(shù)不要超過 5000谅将。
三漾狼、業(yè)務(wù)規(guī)范
1、【強(qiáng)制】使用 Redis 進(jìn)行緩存時饥臂,必須進(jìn)行申請逊躁。申請之前,需要拿出使用的合理方案隅熙,然后進(jìn)行評估稽煤,避免隨意使用核芽。
2、【強(qiáng)制】Redis 應(yīng)用場景應(yīng)該是純緩存服務(wù)酵熙,功能主要是緩存數(shù)據(jù)轧简,緩存數(shù)據(jù)可丟失,除特殊需求外匾二,需提供可行性哮独、可實施的方案。
3察藐、【強(qiáng)制】 關(guān)于過期時間
Redis key 一定要設(shè)置過期時間皮璧。要跟自己的業(yè)務(wù)場景,需要對 key 設(shè)置合理的過期時間分飞°参瘢可以在寫入 key 時,就要追加過期時間譬猫;也可以在需要寫入另一個 key 時讯檐,刪除上一個 key。
說明:
(1) 若不設(shè)置的話删窒,這些 key 會一直占用內(nèi)存不釋放裂垦,隨著時間的推移會越來越大,直到達(dá)到服務(wù)器的內(nèi)存上限肌索,導(dǎo)致服務(wù)器宕機(jī)等重大事故蕉拢;
(2) 對于 key 的超時時長設(shè)置,可根據(jù)業(yè)務(wù)場景進(jìn)行評估诚亚,設(shè)置合理有效期晕换;
(3) 某些業(yè)務(wù)的確需要長期有效,可以判斷即將到期時站宗,重新設(shè)置有效期闸准,避免引起熱點(diǎn) key 問題。
4梢灭、【推薦】Redis 的使用夷家,應(yīng)該考慮冷熱數(shù)據(jù)分離,不該將所有數(shù)據(jù)全部放到 Redis 中敏释,對于使用不頻繁库快,且無關(guān)緊要的信息存入 MySQL,或日志文件中钥顽,Redis 的數(shù)據(jù)存儲全部都是在內(nèi)存中的义屏,成本昂貴。
5、【推薦】Redis 有數(shù)據(jù)丟失風(fēng)險闽铐,程序處理數(shù)據(jù)時蝶怔,應(yīng)該考慮丟失后的重新加載過程。
6兄墅、【強(qiáng)制】禁止大 key
大 key 數(shù)據(jù)存? Redis踢星,除了帶來極大的內(nèi)存占用外,在并發(fā)高時察迟,很容易就會將網(wǎng)卡流量占滿斩狱,進(jìn)而造成整個服務(wù)器上的所有服務(wù)不可用耳高。雖然 Redis 支持 512MB 大小的 string扎瓶,但是假設(shè) 1mb 的 string 大 key,每秒重復(fù)寫入 10 次泌枪,就會導(dǎo)致寫入網(wǎng)絡(luò) IO 達(dá) 10MB;
(1) 讀寫大 key 會導(dǎo)致超時嚴(yán)重概荷,網(wǎng)卡流量占滿, 甚至阻塞服務(wù), 更甚者導(dǎo)致宕機(jī)風(fēng)險。
(2) 如果刪除大 key碌燕,DEL 命令可能阻塞 Redis 進(jìn)程數(shù)十秒误证,使得其他請求阻塞,對應(yīng)用程序和 Redis 集群可用性造成嚴(yán)重的影響修壕。
(3) 每個 key 不要超過 10Kb愈捅。
7、【強(qiáng)制】Redis 一定不可使用 Keys 正則匹配操作慈鸠。
8蓝谨、【推薦】選擇合適的數(shù)據(jù)類型。
目前 Redis 支持的數(shù)據(jù)庫結(jié)構(gòu)類型較多:字符串(String)青团,哈希(Hash)譬巫,列表(List),集合(Set)督笆,有序集合(Sorted Set), Bitmap, HyperLogLog 和地理空間索引(geospatial)等, 需要根據(jù)業(yè)務(wù)場景選擇合適的類型芦昔。
在不能確定其它復(fù)雜數(shù)據(jù)結(jié)構(gòu)?定優(yōu)于 String 類型時,避免使用 Redis 的復(fù)雜數(shù)據(jù)結(jié)構(gòu)娃肿。 每種數(shù)據(jù)結(jié)構(gòu)都有相應(yīng)的使?場景咕缎,String 類型是 Redis 中最簡單的數(shù)據(jù)類型,建議使用 String 類型料扰。 但是考慮到具體的業(yè)務(wù)場景凭豪,綜合評估性能、存儲網(wǎng)絡(luò)等方面之后使用適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)记罚。 需要根據(jù)業(yè)務(wù)場景選擇合適的類型墅诡,常見的如:String 可以用作普通的 K-V、簡單數(shù)據(jù)類類型等;Hash 可以用作對象如居民末早、醫(yī)生等烟馅,包含較多屬性的信息;List 可以用作息隊列然磷、醫(yī)生同行 / 關(guān)注列表等郑趁;Set 可以用于推薦;Sorted Set 可以用于排行等姿搜。
9寡润、【推薦】關(guān)于集合類操作
出現(xiàn)問題最多的就是超時問題,因為使用了 O(N) 的操作舅柜,導(dǎo)致服務(wù)超時梭纹,甚至服務(wù)不可用。
使用 Set致份,Zset变抽,List,Hash 等集合類的 O(N) 操作時要評估當(dāng)前元素個數(shù)的規(guī)模以及將來的增長規(guī)模氮块,對于短期就可能變?yōu)榇蠹系?key绍载,要預(yù)估 O(N) 操作的元素數(shù)量,避免全量操作滔蝉,可以使用 HSCAN击儡,SSCAN,ZSCAN 進(jìn)行漸進(jìn)操作蝠引。集合元素數(shù)量過大在使用過程中會影響 Redis 的實際性能阳谍,Hash 類元素個數(shù)建議盡量不要超過 100,集合類立肘、鏈表類數(shù)據(jù)盡量不要超過 10k边坤。元素數(shù)量過大可考慮拆分成多個 key 進(jìn)行處理。
寫到最后:
如果您有好的建議和想法谅年,歡迎留言茧痒,我會繼續(xù)完善文檔,提高文檔輸出質(zhì)量融蹂。