面試官問(wèn),實(shí)際項(xiàng)目中用Redis要注意哪些規(guī)范?
點(diǎn)擊上方“程序員大白”,選擇“星標(biāo)”公眾號(hào)
重磅干貨,第一時(shí)間送達(dá)

Redis功能強(qiáng)大,數(shù)據(jù)類(lèi)型豐富,再快的系統(tǒng),也經(jīng)不住瘋狂的濫用。通過(guò)禁用部分高風(fēng)險(xiǎn)功能,并掛上開(kāi)發(fā)的枷鎖,業(yè)務(wù)更能夠以簡(jiǎn)潔、通用的思想去考慮問(wèn)題,而不是綁定在某種實(shí)現(xiàn)上。
Redis根據(jù)不同的用途,會(huì)有不同的持久化策略和逐出策略,所以,在使用和申請(qǐng) Redis 集群前,請(qǐng)明確是用來(lái)做緩存還是存儲(chǔ)。Redis的集群有主從和 cluster 兩種模式,各有優(yōu)缺點(diǎn)。以下規(guī)范不區(qū)分集群模式,我們分別從使用場(chǎng)景和操作限制兩方面說(shuō)明。
使用規(guī)范
冷熱數(shù)據(jù)區(qū)分
雖然 Redis支持持久化,但將所有數(shù)據(jù)存儲(chǔ)在 Redis 中,成本非常昂貴。建議將熱數(shù)據(jù) (如 QPS超過(guò) 5k) 的數(shù)據(jù)加載到 Redis 中。低頻數(shù)據(jù)可存儲(chǔ)在 Mysql、 ElasticSearch中。
業(yè)務(wù)數(shù)據(jù)分離
不要將不相關(guān)的數(shù)據(jù)業(yè)務(wù)都放到一個(gè) Redis中。一方面避免業(yè)務(wù)相互影響,另一方面避免單實(shí)例膨脹,并能在故障時(shí)降低影響面,快速恢復(fù)。
消息大小限制
由于 Redis 是單線程服務(wù),消息過(guò)大會(huì)阻塞并拖慢其他操作。保持消息內(nèi)容在 1KB 以下是個(gè)好的習(xí)慣。嚴(yán)禁超過(guò) 50KB 的單條記錄。消息過(guò)大還會(huì)引起網(wǎng)絡(luò)帶寬的高占用,持久化到磁盤(pán)時(shí)的 IO 問(wèn)題。
連接數(shù)限制
連接的頻繁創(chuàng)建和銷(xiāo)毀,會(huì)浪費(fèi)大量的系統(tǒng)資源,極限情況會(huì)造成宿主機(jī)當(dāng)機(jī)。請(qǐng)確保使用了正確的 Redis 客戶端連接池配置。
緩存 Key 設(shè)置失效時(shí)間
作為緩存使用的 Key,必須要設(shè)置失效時(shí)間。失效時(shí)間并不是越長(zhǎng)越好,請(qǐng)根據(jù)業(yè)務(wù)性質(zhì)進(jìn)行設(shè)置。注意,失效時(shí)間的單位有的是秒,有的是毫秒,這個(gè)很多同學(xué)不注意容易搞錯(cuò)。
緩存不能有中間態(tài)
緩存應(yīng)該僅作緩存用,去掉后業(yè)務(wù)邏輯不應(yīng)發(fā)生改變,萬(wàn)不可切入到業(yè)務(wù)里。
緩存的高可用會(huì)影響業(yè)務(wù);
產(chǎn)生深耦合會(huì)發(fā)生無(wú)法預(yù)料的效果;
會(huì)對(duì)維護(hù)行產(chǎn)生膚效果。
擴(kuò)展方式首選客戶端 hash
如果應(yīng)用太小就別考慮了,如單 redis 集群并不能為你的數(shù)據(jù)服務(wù),不要著急擴(kuò)大你的 redis 集群(包括 M/S 和 Cluster),集群越大,在狀態(tài)同步和持久化方面的性能越差。優(yōu)先使用客戶端 hash 進(jìn)行集群拆分。如:根據(jù)用戶 id 分 10 個(gè)集群,用戶尾號(hào)為 0 的落在第一個(gè)集群。
操作限制
嚴(yán)禁使用 Keys
Keys 命令效率極低,屬于 O(N)操作,會(huì)阻塞其他正常命令,在 cluster 上,會(huì)是災(zāi)難性的操作。嚴(yán)禁使用,DBA 應(yīng)該 rename 此命令,從根源禁用。
嚴(yán)禁使用 Flush
flush 命令會(huì)清空所有數(shù)據(jù),屬于高危操作。嚴(yán)禁使用,DBA 應(yīng)該 rename 此命令,從根源禁用,僅 DBA 可操作。
嚴(yán)禁作為消息隊(duì)列使用
如沒(méi)有非常特殊的需求,嚴(yán)禁將 Redis 當(dāng)作消息隊(duì)列使用。Redis 當(dāng)作消息隊(duì)列使用,會(huì)有容量、網(wǎng)絡(luò)、效率、功能方面的多種問(wèn)題。如需要消息隊(duì)列,可使用高吞吐的 Kafka 或者高可靠的 RocketMQ。
嚴(yán)禁不設(shè)置范圍的批量操作
redis 那么快,慢查詢除了網(wǎng)絡(luò)延遲,就屬于這些批量操作函數(shù)。大多數(shù)線上問(wèn)題都是由于這些函數(shù)引起。
1、[zset] 嚴(yán)禁對(duì) zset 的不設(shè)范圍操作
ZRANGE、 ZRANGEBYSCORE等多個(gè)操作 ZSET 的函數(shù),嚴(yán)禁使用 ZRANGE myzset 0 -1 等這種不設(shè)置范圍的操作。請(qǐng)指定范圍,如 ZRANGE myzset 0 100。如不確定長(zhǎng)度,可使用 ZCARD 判斷長(zhǎng)度
2、[hash] 嚴(yán)禁對(duì)大數(shù)據(jù)量 Key 使用 HGETALL
HGETALL會(huì)取出相關(guān) HASH 的所有數(shù)據(jù),如果數(shù)據(jù)條數(shù)過(guò)大,同樣會(huì)引起阻塞,請(qǐng)確保業(yè)務(wù)可控。如不確定長(zhǎng)度,可使用 HLEN 先判斷長(zhǎng)度
3、[key] Redis Cluster 集群的 mget 操作
Redis Cluster 的 MGET 操作,會(huì)到各分片取數(shù)據(jù)聚合,相比傳統(tǒng)的 M/S架構(gòu),性能會(huì)下降很多,請(qǐng)?zhí)崆皦簻y(cè)和評(píng)估
4、[其他] 嚴(yán)禁使用 sunion, sinter, sdiff等一些聚合操作
禁用 select 函數(shù)
select函數(shù)用來(lái)切換 database,對(duì)于使用方來(lái)說(shuō),這是很容易發(fā)生問(wèn)題的地方,cluster 模式也不支持多個(gè) database,且沒(méi)有任何收益,禁用。
禁用事務(wù)
redis 本身已經(jīng)很快了,如無(wú)大的必要,建議捕獲異常進(jìn)行回滾,不要使用事務(wù)函數(shù),很少有人這么干。
禁用 lua 腳本擴(kuò)展
lua 腳本雖然能做很多看起來(lái)很 cool 的事情,但它就像是 SQL 的存儲(chǔ)過(guò)程,會(huì)引入性能和一些難以維護(hù)的問(wèn)題,禁用。
禁止長(zhǎng)時(shí)間 monitor
monitor函數(shù)可以快速看到當(dāng)前 redis 正在執(zhí)行的數(shù)據(jù)流,但是當(dāng)心,高峰期長(zhǎng)時(shí)間阻塞在 monitor 命令上,會(huì)嚴(yán)重影響 redis 的性能。此命令不禁止使用,但使用一定要特別特別注意。
Key 規(guī)范
Redis 的 Key 一定要規(guī)范,這樣在遇到問(wèn)題時(shí),能夠進(jìn)行方便的定位。Redis 屬于無(wú) scheme 的 KV 數(shù)據(jù)庫(kù),所以,我們靠約定來(lái)建立其 scheme 語(yǔ)義。其好處:
1、能夠根據(jù)某類(lèi) key 進(jìn)行數(shù)據(jù)清理 2、能夠根據(jù)某類(lèi) key 進(jìn)行數(shù)據(jù)更新 3、能夠方面了解到某類(lèi) key 的歸屬方和應(yīng)用場(chǎng)景 4、為統(tǒng)一化、平臺(tái)化做準(zhǔn)備,減少技術(shù)變更
一般,一個(gè) key 需要帶以下維度:業(yè)務(wù)、key 用途、變量等,各個(gè)維度使用 : 進(jìn)行分隔,以下是幾個(gè) key 的實(shí)例:
user:sex 用戶 10002232 的性別 msg:achi 201712 的用戶發(fā)言數(shù)量排行榜
最后
適當(dāng)?shù)募s束是架構(gòu)成熟的必要條件,通過(guò)約定能達(dá)到規(guī)范是集體開(kāi)發(fā)的最高境界。Redis用的多,也要用的穩(wěn),給點(diǎn)約束、立點(diǎn)規(guī)矩,生活將變的美好。通過(guò)二次封裝redis客戶端,直接阻斷,效果更佳。
推薦閱讀
國(guó)產(chǎn)小眾瀏覽器因屏蔽視頻廣告,被索賠100萬(wàn)(后續(xù))
年輕人“不講武德”:因看黃片上癮,把網(wǎng)站和786名女主播起訴了
關(guān)于程序員大白
程序員大白是一群哈工大,東北大學(xué),西湖大學(xué)和上海交通大學(xué)的碩士博士運(yùn)營(yíng)維護(hù)的號(hào),大家樂(lè)于分享高質(zhì)量文章,喜歡總結(jié)知識(shí),歡迎關(guān)注[程序員大白],大家一起學(xué)習(xí)進(jìn)步!

