前言:本文檔根據(jù)約束力強(qiáng)弱及故障敏感性,規(guī)約依次分為強(qiáng)制、推薦、參考三大類。對(duì)于規(guī)約條目的延伸信息中,“說(shuō)明”對(duì)內(nèi) 容做了適當(dāng)擴(kuò)展和解釋;“正例” 倡什么樣的編碼和實(shí)現(xiàn)方式;“反例”說(shuō)明需要 防的雷區(qū),以及真實(shí)的錯(cuò)誤案例。
1.【強(qiáng)制】Redis的key定義為多個(gè)具有獨(dú)立意義的字符串由冒號(hào)“:”拼接而成,在做MySQL數(shù)據(jù)表緩存時(shí),“具有獨(dú)立意義的字符串”強(qiáng)制定義為數(shù)據(jù)表的單個(gè)字段,并且將格式約定為:表名:字符串1:字符串2:·····。
說(shuō)明:數(shù)據(jù)表的單個(gè)字段本身就是一個(gè)具有獨(dú)立意義的字符串,在做Redis緩存時(shí)不再對(duì)該字符串做拆分、拼接。Redis在做其它存儲(chǔ)用途時(shí),可以通過(guò)拆分一個(gè)字符串、拼接多個(gè)字符串以及直接使用單個(gè)字符串等多種手段形成“具有獨(dú)立意義的字符串”。
正例:話費(fèi)黑名單存儲(chǔ)在Redis中時(shí),在功能上都可以的情況下,可以采用“configcache:fee:blacklist”作為key,也可以使用“configcache:feeblacklist”作為key,前者認(rèn)為fee和blacklist分別是具有獨(dú)立意義的字符串,后者認(rèn)為feeblacklist是具有獨(dú)立意義的字符串。
待討論:使用何種機(jī)制保證key值的唯一性。
2.【強(qiáng)制】禁止使用Keys正則匹配操作,包括但不限于各種形式的模糊匹配操作。
說(shuō)明:Redis是單線程處理,在線上KEY數(shù)量較多時(shí),操作效率極低(時(shí)間復(fù)雜度為O(N)),該命令一旦執(zhí)行會(huì)嚴(yán)重阻塞線上其它命令的正常請(qǐng)求,而且在高QPS情況下會(huì)直接造成Redis服務(wù)崩潰。
3.【強(qiáng)制】將對(duì)象寫(xiě)入Redis時(shí)使用fastToJson序列化方式。
說(shuō)明:統(tǒng)一序列化方式。
4.【強(qiáng)制】避免多個(gè)應(yīng)用使用同一個(gè)Redis實(shí)例
說(shuō)明:redis是單線程作業(yè),因此不要把多個(gè)應(yīng)用放在一個(gè)redis實(shí)例,這樣會(huì)降低每個(gè)業(yè)務(wù)的吞吐量,必要的時(shí)候一個(gè)應(yīng)用我們也可以針對(duì)不用的功能點(diǎn)使用多個(gè)redis實(shí)例。
5.【推薦】程序需要處理如果redis數(shù)據(jù)丟失時(shí)的重新加載的過(guò)程。
6.【推薦】存儲(chǔ)的Key盡可能設(shè)置超時(shí)時(shí)間。
說(shuō)明:如果應(yīng)用將Redis定位為緩存Cache使用,對(duì)于存放的Key要盡可能設(shè)置超時(shí)時(shí)間。因?yàn)槿舨辉O(shè)置,這些Key會(huì)一直占用內(nèi)存不釋放,造成極大的浪費(fèi),而且隨著時(shí)間的推移會(huì)導(dǎo)致內(nèi)存占用越來(lái)越大,直到達(dá)到服務(wù)器內(nèi)存上限!另外Key的超時(shí)長(zhǎng)短要根據(jù)業(yè)務(wù)綜合評(píng)估,而不是越長(zhǎng)越好。
待討論1:什么樣的時(shí)間比較合適。定義MySQL緩存的時(shí)間,其它場(chǎng)景按需設(shè)置。
7.【推薦】選擇合適的數(shù)據(jù)類型,在不能確定其它復(fù)雜數(shù)據(jù)結(jié)構(gòu)一定優(yōu)于String類型時(shí),避免使用Redis的復(fù)雜數(shù)據(jù)結(jié)構(gòu),復(fù)雜類型對(duì)象指的是hash,set之類的非string對(duì)象。
說(shuō)明:每種數(shù)據(jù)結(jié)構(gòu)都有相應(yīng)的使用場(chǎng)景,String類型是Redis中最簡(jiǎn)單的數(shù)據(jù)類型,推薦使用String類型。但是考慮到具體的業(yè)務(wù)場(chǎng)景,綜合評(píng)估性能、存儲(chǔ)、網(wǎng)絡(luò)等方面之后使用適當(dāng)?shù)臄?shù)據(jù)結(jié)構(gòu)。
8.【推薦】將一個(gè)Redis實(shí)例的所有操作集中封裝在一個(gè)類中。
說(shuō)明:Redis自由度非常大,key有各種各樣的形式,將所有的操作集中在一個(gè)類中,便于管理。
9.【參考】盡可能使用不要超過(guò)1M大小的kv。
說(shuō)明:如果將redis作為cache進(jìn)行頻繁讀寫(xiě)和超時(shí)刪除等,此時(shí)應(yīng)該避免設(shè)置較大的k-v,因?yàn)檫@樣會(huì)導(dǎo)致redis的 內(nèi)存碎片增加,導(dǎo)致rss占用較大,最后被操作系統(tǒng)OOM killer干掉。參考值:flowsal中的order表,100條記錄占用redis的內(nèi)存為1.07M
10.【參考】如果出現(xiàn)頻繁對(duì)string進(jìn)行append操作,則請(qǐng)使用list進(jìn)行push操作,取出時(shí)使用pop。這樣避免string頻繁分配內(nèi)存導(dǎo)致的延時(shí)。