Chinese中国精品自拍_亚洲精品视频在线_欧美高清在线播放_理论片午午伦夜理片2021,337p日本欧洲大胆精品,国产在线自在拍91精品,亚洲第一页乱,最新日韩中文字幕,成在线色,日韩高清一区,国产乱子伦农村XXXX

新聞
首頁 >  神州信息新聞 >  數(shù)字中國·星火文集 | Redis大Key分析和解決最佳實(shí)踐

數(shù)字中國·星火文集 | Redis大Key分析和解決最佳實(shí)踐

  • 發(fā)布時(shí)間:2022-06-08
  • 來源:
  •   
  • 打印

Redis大Key分析和解決最佳實(shí)踐

神州信息

劉彬

1.

概述

我們先假定有如下場景:某稅務(wù)局一線運(yùn)維收到客戶反饋通知,,說系統(tǒng)查詢某機(jī)構(gòu)對(duì)申報(bào)信息極為緩慢,。于是開發(fā)人員找到一個(gè)出問題的機(jī)構(gòu)A,通過搜索日志系統(tǒng)找到系統(tǒng)操作Redis時(shí)間比較久,并且從日志系統(tǒng)搜到一些Redis 含詢超時(shí)的異常,。最后我們定位到的原因如下:

在申報(bào)接口的時(shí)候系統(tǒng)通過Redis做了一個(gè)級(jí)存,記錄機(jī)構(gòu)的申報(bào)信息,,Redis數(shù)據(jù)結(jié)構(gòu):key=機(jī)構(gòu),、IDvalue=申報(bào)列表,而Redis查詢發(fā)現(xiàn)多了許多大key,,體現(xiàn)在一個(gè)機(jī)構(gòu)ID一天有上萬甚至幾十萬的申報(bào)信息,。我們通常將此類問題稱為Redis大Key問題。

2.

Redis大Key基本概念及場景

所謂的大key問題是某個(gè)key對(duì)應(yīng)的value比較大,,所以本質(zhì)上是大value問題,,key往往是開發(fā)過程中可以自行設(shè)置,可以控制大小,,value往往不受程序控制跟業(yè)務(wù)場景有關(guān)系,,因此可能導(dǎo)致value較大。

2.1基本概念

在Redis中,,大key指的是key對(duì)應(yīng)的value值所占的內(nèi)存空間比較大:

● value是string類型,,大小建議控制在10kb以內(nèi)。

● valve是hash,、list,、set、zset等集合類型,,元素個(gè)數(shù)建議不要超過 5000(或者1萬,、幾萬)。上述的定義并不絕對(duì),,主要是根據(jù)value的大小和元索個(gè)數(shù)來確定,,業(yè)務(wù)也可以很據(jù)自己的場景確定標(biāo)淮。

2.2常見場景

大key的產(chǎn)生往往是業(yè)務(wù)方設(shè)計(jì)不合理,沒有預(yù)見vaule的動(dòng)態(tài)增長問題,。

通常有幾類此較經(jīng)典的場錄:

● 一直往value存放數(shù)據(jù),,沒有刪除及過期機(jī)制。

● 數(shù)據(jù)沒有合理做分片,,將大key變成以一個(gè)個(gè)小key,。

3.

Redis大Key帶來的影響

● 客戶端超時(shí)阻塞。由于Redis單線程的特性,,操作大key的通常比較耗時(shí),,也就意味著阻塞Redis可能性越大,這樣會(huì)造成容戶瑞阻塞或者引起故障切換,,會(huì)出現(xiàn)各種Redis慢查詢,。

● 內(nèi)存空間不均勻。集群模式在slot分片均勻情況下,,會(huì)出現(xiàn)數(shù)據(jù)和查詢傾斜情況,,部分有大key的Redis節(jié)點(diǎn)占用內(nèi)行多、QPS高,。

● 引發(fā)網(wǎng)絡(luò)阻塞,。每次獲取大key產(chǎn)生的網(wǎng)絡(luò)流量按大,如果一個(gè)key的大小為1MB每秒訪問量為1000,,那么行秒會(huì)產(chǎn)生1000MB的流量,。這對(duì)于普通千兆網(wǎng)卡的服務(wù)器說是災(zāi)難性的。

● 阻塞工作線程,。執(zhí)行大key刪除時(shí),,在低版本Redis中可能阻塞線程。

4.

Redis大Key如何檢測

● 改寫Redis客戶端,,在sdk中加入埋點(diǎn),,實(shí)時(shí)上報(bào)數(shù)據(jù)給Redis大key 檢測平臺(tái)、監(jiān)控告警,。

● scan+debug object bigkey命令,,循環(huán)遍歷Redis key序列化后的長度。debug object bigkey可能會(huì)比較慢,,它存在阻塞Redis的可能,,建議在從節(jié)點(diǎn)執(zhí)行該命令,官方不推薦,。

● scan+memory usage,。該命令是在Redis 4.0+以后提供的,可以循環(huán)遍歷統(tǒng)計(jì)計(jì)算每個(gè)鍵值的字節(jié)數(shù),。

● 通過python腳本迭代的scan key,。對(duì)每次scan的內(nèi)容進(jìn)行判斷是否為大key,。

● Redis-cli --bigkeys??梢哉业侥硞€(gè)Redis 實(shí)例5種數(shù)據(jù)類型(string,、hash、list,、set,、zset)的最大key。但如果Redis key 比較多,,執(zhí)行該命令會(huì)比較慢,,建議在從節(jié)點(diǎn)執(zhí)行該命令。

● rdbtools開源工具包,。rdbtools是python寫的一個(gè)第三方開源工具,,用來解析Redis快照文件,Redis實(shí)例上執(zhí)行bgsave,,然后對(duì)dump出,;來的rdb文件進(jìn)行分析,找到其中的大key,。

例如:rdb dump.rdb -c memory --byes 10240 -f Redis.csv

從dump.rdb 快照文件統(tǒng)計(jì) (bgsave),,將所有>10kb的key輸出到一個(gè)csv文件,。

5.

Redis大Key如何刪除

如果對(duì)這類大key直接使用del命今進(jìn)行刪除,,會(huì)導(dǎo)致長時(shí)間阻塞,甚至崩潰,,因?yàn)閐el命令在刪除集合類型數(shù)據(jù)時(shí),,時(shí)間復(fù)雜度為O(M),M是集合中元素的個(gè)數(shù),。Redis是單線程的,,單個(gè)命令執(zhí)行時(shí)間過長就會(huì)阻塞其他命令,容易引起雪崩,,穩(wěn)妥的建議如下:

主動(dòng)刪除大Key

一,、分批次漸近刪除

一般來說,對(duì)于string數(shù)據(jù)類型使用del命令不會(huì)產(chǎn)生阻塞,。其它數(shù)據(jù)類型分批刪除,,通過scan命令遍歷大key,每次取得少部分元素進(jìn)行刪除,,然后再獲取和刪除下一批元素.對(duì)Hash,Sorted Set, List. Set 分別處理,、思路相同,先對(duì)key改名進(jìn)行邏輯刪除,,使客戶端無法使用原key,,然后使用批量小步刪除,。

● 刪除大Hash

步驟:(1)key改名,相當(dāng)于邏輯上刪除key,,任何Redis命令都訪問不了該key,。(2)小步多批次刪除。

偽代碼:

● 刪除大List

偽代碼:

● 刪除大Set

偽代碼:

● 刪除大Sorted Set

偽代碼:

二,、采用unlink+bigkey異步非阻塞刪除,,這個(gè)命令是在Redis 4.0+提供的代替del命令,不會(huì)阻塞主線程,。

被動(dòng)刪除大Key

被動(dòng)刪除是指利用Redis自身的key消除策略,,配置lazyfree情性刪除。但是參數(shù)默認(rèn)是關(guān)閉的,??膳渲萌缦聟?shù)開啟:

6.

Redis大Key如何設(shè)計(jì)與優(yōu)化

主要針對(duì)以下兩種經(jīng)典場景進(jìn)行優(yōu)化:

單個(gè)key 存儲(chǔ)的 value 很大(超過 10kb)

1)從業(yè)務(wù)角度評(píng)估,value中只存儲(chǔ)有用的字段,,盡量去掉無用的字段,。

2)可以考點(diǎn)在應(yīng)用層先對(duì)value進(jìn)行壓縮,比如采用LZ4/Snappy之類的壓縮算法,,配合Redis客戶端序列化配置,,可以無侵入完成value的壓縮。.

3)value設(shè)計(jì)的時(shí)候越小越好,,關(guān)聯(lián)的數(shù)據(jù)分不同的key進(jìn)行存儲(chǔ),。

4)大key分拆成幾個(gè)key-value,使用multiGet獲取值,,這樣分拆的意義在于分拆單次操作的壓力.將操作壓力拼攤到多個(gè)Redis實(shí)例中,,降低對(duì)單個(gè)Redis的IO影響。

5)對(duì)Redis集群進(jìn)行擴(kuò)容,。

集合數(shù)據(jù)類型hash. list, set. sorted set等存儲(chǔ)過多的元素(超過5000個(gè))

類似于場景一中的第一個(gè)做法,,可以將這些元素分拆:

以hash為例,原先的正常存取流程是hget(hashKey,field) ;hset(hashkey,field,value)現(xiàn)在,,我們可以分拆構(gòu)建一個(gè)新的 newHashkey,,具體做法:固定一個(gè)桶的數(shù)量,比如10000每次存取的時(shí)候,,先在本地計(jì)算field的hash值,,取模10000,確定了該field落在哪個(gè)newHashkey上,。

set,、sorted、list也可以采用類似做法,。

聯(lián)系我們