# ****Redis使用規(guī)范****
一:書寫本規(guī)范的背景哭懈,目的,原因茎用,意義等虛化的內(nèi)容全部省略遣总。制定本規(guī)范只是為了減少因濫用,亂用轨功,誤用造成的生產(chǎn)旭斥,研發(fā)事故
二:Redis使用場景分析及使用建議
1)、純Cache使用古涧,主要是key->value的使用垂券,這個場景主要是考慮減少數(shù)據(jù)庫的讀壓力減少數(shù)據(jù)庫的QPS,所以這部分key必須設(shè)置超時時間羡滑!因為若不設(shè)置菇爪,這些Key會一直占用內(nèi)存不釋放算芯,造成極大的浪費,而且隨著時間的推移會導(dǎo)致內(nèi)存占用越來越大娄帖,直到達(dá)到服務(wù)器內(nèi)存上限也祠!另外Key的超時長短要根據(jù)業(yè)務(wù)綜合評估,而不是越長越好近速!
2)诈嘿、作為限流中間件使用,如保存中獎信息削葱,作為已中獎用戶限制奖亚;如保存獎品數(shù)量信息,作為數(shù)量限制析砸,防止減少時扣減超出限制昔字。這部分?jǐn)?shù)據(jù)往往會使用hash,set數(shù)據(jù)首繁,這部分?jǐn)?shù)據(jù)應(yīng)該在某次活動結(jié)束后作郭,對里面的內(nèi)容和信息進(jìn)行落地,然后刪除弦疮。
3)夹攒、作為隊列使用,包括限流隊列用戶秒殺場景胁塞,或者任務(wù)隊列用于程序異步化咏尝。這里主要用到list,用于秒殺場景的key理論上在活動結(jié)束后啸罢,如果list內(nèi)數(shù)據(jù)還在编检,則需要刪除,用戶任務(wù)隊列的key理論上必須存在消費者扰才,基本無需處理
4)允懂、數(shù)據(jù)庫使用,主要使用hash和set滿足數(shù)據(jù)庫使用場景训桶,如存儲用戶信息的hash累驮,用戶排行榜數(shù)據(jù)的sortedset。這部分?jǐn)?shù)據(jù)需要有同步程序,理應(yīng)redis的數(shù)據(jù)和mysql或者oracle數(shù)據(jù)庫中都存有一份,在數(shù)據(jù)不同步時阻肿,能進(jìn)行同步恢復(fù)操作蕾额。
5)、發(fā)布訂閱消息中間件使用,暫未使用粟判。
6)怜奖、分布式session使用蜡坊,盡量與業(yè)務(wù)Redis不在同一實例上杠输,減少相關(guān)性。
7)秕衙、分布式鎖蠢甲,用于減少數(shù)據(jù)庫的鎖性能消耗,通過Redis的setnx操作實現(xiàn)分布式鎖据忘。
三:目前Redis使用存在的一些問題
1)鹦牛、用于Cache的key沒有設(shè)置超時時間
2)、用于限流中間件使用的的key未做好退出處理
3)勇吊、數(shù)據(jù)庫使用的key曼追,同步還是有缺失,導(dǎo)致數(shù)據(jù)出錯后汉规,無法正常使用
4)礼殊、session和業(yè)務(wù)使用同一實例,依賴性較強
5)针史、在操作Redis時晶伦,同一請求處理中多次操作Redis,但未使用管道合并請求
6)啄枕、只使用Redis坝辫,未將數(shù)據(jù)落地至關(guān)系型數(shù)據(jù)庫,或者沒有足夠的日志導(dǎo)致在導(dǎo)出數(shù)據(jù)射亏,查找數(shù)據(jù)時太煩
7)、key太多竭业,沒有統(tǒng)一的地方查詢每個key的使用原因智润,場景
8)、因為不敢刪除未辆,導(dǎo)致內(nèi)存占用越來越大窟绷,導(dǎo)致在持久化是超出正常內(nèi)存使用
四:使用規(guī)范
根據(jù)存在的問題及使用建議,需要做如下的規(guī)范:
1)咐柜、嚴(yán)格控制KEY的長度兼蜈,但需要注意的是KEY格式需要滿足前綴+名稱+(期限)等組成,前綴包括項目名稱簡寫如zj拙友,hb为狸,js,sh遗契,活動功能區(qū)分hd或者gn辐棒,名稱建議與Controller名稱一致,如果可以需要加期限,如1709表示17年9月過后可以刪除漾根。
2)泰涂、嚴(yán)格或者是必須設(shè)置ttl,需重新封裝Redis操作類辐怕,封裝的類中其中所有的set方法盡可能加上expire逼蒙,禁止直接使用內(nèi)置client庫
3)、禁止使用hgetall寄疏,smembers是牢,keys,lrange 0赁还,-1等獲取所有數(shù)據(jù)的操作妖泄,特別是嚴(yán)禁在生產(chǎn)環(huán)境使用,如需獲取全量數(shù)據(jù)艘策,需要通過scan蹈胡,hscan等操作替代
4)、在同一線程或進(jìn)程多次操作Redis時朋蔫,需要使用管道的方式獲取數(shù)據(jù)罚渐,或者mget,hmget等獲取數(shù)據(jù)驯妄,但不建議在集群環(huán)境中使用荷并。不可以在同一方法內(nèi)SET10000次,GET10000次
5)青扔、嚴(yán)禁將數(shù)據(jù)只保存在Redis中源织,對一些核心數(shù)據(jù)必須落地至數(shù)據(jù)庫,一些非核心數(shù)據(jù)必須落地至日志
6)微猖、Redis只是一個其中的工具谈息,適用場景也是有限的,沒必要拿到一個工具往死里用凛剥,在技術(shù)選型時侠仇,不要拘泥于只有Redis
7)、控制每一個value的大小犁珠,不要把大量數(shù)據(jù)合在一個key中逻炊,只保存有效的,可使用的犁享,這種場景建議hash或其他方式余素,或?qū)alue進(jìn)行壓縮后儲存
8)、建議將保存用戶信息和保存業(yè)務(wù)數(shù)據(jù)及保存session數(shù)據(jù)分離使用不同實例饼疙,減少因Redis單線程讀寫高并發(fā)情況使用效果不佳
9)溺森、根據(jù)目前的實際情況慕爬,提出搭建Redis KEY使用管理平臺,具體內(nèi)容見五
五:Redis key管理平臺
目標(biāo):
初級-》所有Redis key可管理屏积,可查詢医窿,可知道key用途
進(jìn)階-》可導(dǎo)出(導(dǎo)出方式分為csv,數(shù)據(jù)庫等)炊林,刪除姥卢,批量操作
實現(xiàn)內(nèi)容:
1、按照需求詳細(xì)記錄每個key的使用渣聚,包括key名稱独榴,數(shù)據(jù)結(jié)構(gòu),生成規(guī)則奕枝,ttl時間棺榔,數(shù)據(jù)格式示例
2、記錄時需評估合理性隘道,在添加時需要注明key使用者症歇,如果是list,還應(yīng)注明消費者相關(guān)
3谭梗、定期導(dǎo)出所有key跟管理平臺所維護的 key進(jìn)行對比忘晤,看是否有異常key使用情況
4、記錄不在管理平臺中的key使用相關(guān)信息
5激捏、做好定期檢查工作设塔,對不正常的key,進(jìn)行分析