Redis開(kāi)發(fā)規(guī)范

前言:本文檔根據(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í)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,554評(píng)論 19 139
  • 轉(zhuǎn)載地址:http://gnucto.blog.51cto.com/3391516/998509 Redis與Me...
    Ddaidai閱讀 21,548評(píng)論 0 82
  • NOSQL類型簡(jiǎn)介鍵值對(duì):會(huì)使用到一個(gè)哈希表,表中有一個(gè)特定的鍵和一個(gè)指針指向特定的數(shù)據(jù),如redis,volde...
    MicoCube閱讀 4,159評(píng)論 2 27
  • 蹉跎時(shí)光的土地 寸草不生 骸骨跪求天山的湖水 草紙是半滴眼淚 半滴眼淚 一個(gè)狹長(zhǎng)的黑夜空洞 如此暗啞 魚(yú)群潛行水底...
    紅塵紅塵閱讀 259評(píng)論 2 3
  • 在那個(gè)轉(zhuǎn)型的年代掙錢(qián)很容易 有了錢(qián)之后身邊的朋友包括自己 花天酒地 陸續(xù)的妻離子散 至親們也遭受著這樣或那樣的變故...
    釋一舍閱讀 445評(píng)論 0 1

友情鏈接更多精彩內(nèi)容