在使用 Redis 時(shí),可能會(huì)出現(xiàn)請求響應(yīng)慢、網(wǎng)絡(luò)卡頓、數(shù)據(jù)丟失的情況。排查問題的時(shí)候,發(fā)現(xiàn)是 big keys 的問題。
在 Redis 中,一個(gè)字符串類型大可以達(dá)到 512MB,其他非字符串類型的集合類型(list、set、hash、zset等)可以存儲 40 億個(gè)(2^32-1),但在實(shí)際業(yè)務(wù)場景中,并不需要這么大的內(nèi)存。而且對于一個(gè)請求量大的互聯(lián)網(wǎng)軟件,對數(shù)據(jù)的大小要求更加的嚴(yán)格。如果達(dá)到如下標(biāo)準(zhǔn),就可以認(rèn)定是 big keys 了:
big keys 是如何產(chǎn)生的以上對 big keys 的判斷標(biāo)準(zhǔn)并不是唯一,只是一個(gè)大題的標(biāo)準(zhǔn)。在實(shí)際業(yè)務(wù)開發(fā)中,對 big keys 的判斷是需要根據(jù)具體的使用場景做不同的判斷。比如操作某個(gè) key 導(dǎo)致請求響應(yīng)時(shí)間變慢,那么這個(gè) key 就可以判定成 big keys。
一般來說,big keys 的產(chǎn)生都是由于程序的設(shè)計(jì)不當(dāng),或者對數(shù)據(jù)的規(guī)模沒有一個(gè)大體的估算。比如:
以上幾種類型都是在實(shí)際運(yùn)維中遇到的。在開發(fā)中需要根據(jù)預(yù)估的數(shù)據(jù)大小來合理的設(shè)計(jì)緩存數(shù)據(jù)。
big keys 的危害在系統(tǒng)中如果存在 big keys,會(huì)導(dǎo)致請求數(shù)據(jù)響應(yīng)變慢、請求超時(shí)或者系統(tǒng)不穩(wěn)定。
1、響應(yīng)變慢、超時(shí)阻塞Redis 是單線程工作的,同一時(shí)間只能處理一個(gè)請求,操作 big keys 時(shí)比較耗時(shí),請求響應(yīng)也變慢。其他請求也處于阻塞狀態(tài),導(dǎo)致請求超時(shí)。除了查詢 big keys 比較耗時(shí),刪除 big keys 也會(huì)導(dǎo)致一樣的問題。
2、網(wǎng)絡(luò)擁塞請求單個(gè) big keys 產(chǎn)生的網(wǎng)絡(luò)流量比較大,假設(shè)一個(gè) big keys 為 1MB,客戶端每秒訪問量是 1000,那么每秒產(chǎn)生 1000MB 的流量,普通的千兆網(wǎng)卡承受不了這么大的流量。而且一般會(huì)在單機(jī)部署多個(gè)Redis實(shí)例,一個(gè) big keys 可能也會(huì)影響其他實(shí)例。
3、內(nèi)存分布不均Redis 集群模式中,key根據(jù)不同的hash嘈分配到不同的節(jié)點(diǎn)上,當(dāng)大部分的 big keys 分布在同一個(gè)節(jié)點(diǎn),導(dǎo)致內(nèi)存傾斜在同一個(gè)節(jié)點(diǎn)上,內(nèi)存分布不均。在水平擴(kuò)容時(shí),需要以大容量的節(jié)為準(zhǔn),浪費(fèi)內(nèi)存。
如何發(fā)現(xiàn) big keysRedis4.0 后提供了--bigkeys
命令,比如:
./redis-cli --bigkeys
獲取每個(gè)數(shù)據(jù)類型大的 big keys,同時(shí)給出每個(gè)類型鍵的個(gè)數(shù)和平均大小。因?yàn)?Redis 是單線程工作的,為了減少對線上請求的影響,執(zhí)行--bigkeys
命令需要注意一下幾點(diǎn):
--i
參數(shù),降低掃描的執(zhí)行速度,比如--i 0.1
表示 100 毫秒執(zhí)行一次。找到 big keys 之后,首先需要?jiǎng)h除對應(yīng)的big keys,但是使用 del 命令刪除 big keys 是比較耗時(shí)的。Redis4.0 后可以使用 unlink 刪除,和 del 命令相比,unlink 是非阻塞的異步刪除。
非字符串的 big keys,使用 hscan、sscan、zscan 方式漸進(jìn)式刪除,同時(shí)要注意防止big keys 過期時(shí)間自動(dòng)刪除問題(例如一個(gè) 200 萬的 zset 設(shè)置1小時(shí)過期,會(huì)觸發(fā)del操作,造成阻塞)。
big key 拆分字符串類型的數(shù)據(jù)是減少字符串的長度,將一個(gè)字符串拆成幾個(gè)小的字符串。非字符串的是減少元素?cái)?shù)量。這些都是講一個(gè) key 拆成多個(gè) key,比如:
如果 big keys 無法避免,那獲取數(shù)據(jù)盡量不要把所有的數(shù)據(jù)都取出來,就使用分段的方式取出數(shù)據(jù)。刪除的方式也類似,分段刪除數(shù)據(jù)。
總結(jié)Scanning for big keys
Bigkey問題的解決思路與方式探索
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
新聞標(biāo)題:詳解Redis中bigkeys發(fā)現(xiàn)和解決-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://chinadenli.net/article28/dgjdjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信小程序、云服務(wù)器、App開發(fā)、Google、微信公眾號、標(biāo)簽優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容