最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

2023-06-21:redis中什么是BigKey?該如何解決?

2023-06-21 17:28 作者:福大大架構(gòu)師每日一題  | 我要投稿

2023-06-21:redis中什么是BigKey?該如何解決?

答案2023-06-21:

什么是bigkey

bigkey是指存儲(chǔ)在Key-Value數(shù)據(jù)庫(kù)中的鍵對(duì)應(yīng)的值所占用的內(nèi)存空間較大。舉個(gè)例子,如果值是字符串類型,它可以達(dá)到最大512MB的存儲(chǔ)空間;如果值是列表類型,最多可以存儲(chǔ) 2^32 - 1 個(gè)元素,即 4294967295 個(gè)元素。

根據(jù)數(shù)據(jù)結(jié)構(gòu)的不同,我們可以將bigkey進(jìn)一步分為字符串類型的bigkey和非字符串類型的bigkey。

字符串類型的bigkey:這種bigkey指的是在Key-Value數(shù)據(jù)庫(kù)中,鍵對(duì)應(yīng)的字符串值所占用的內(nèi)存空間較大。一般來說,當(dāng)一個(gè)值超過10KB時(shí),就可以被認(rèn)為是字符串類型的bigkey。但需要注意的是,這個(gè)閾值可以根據(jù)具體的業(yè)務(wù)需求和系統(tǒng)的OPS(每秒操作次數(shù))進(jìn)行調(diào)整,不同的環(huán)境可能會(huì)有不同的定義。

非字符串類型的bigkey:這種bigkey指的是鍵對(duì)應(yīng)的值是其他非字符串類型(例如哈希、列表、集合、有序集合等),而這些數(shù)據(jù)結(jié)構(gòu)中的元素?cái)?shù)量多到足以被認(rèn)為是bigkey。例如,當(dāng)一個(gè)哈希表、列表、集合或有序集合中的元素?cái)?shù)量超過較大的閾值時(shí),可以被視為非字符串類型的bigkey。

bigkey在Redis中具有不友好的空間復(fù)雜度和時(shí)間復(fù)雜度,以下是它的危害。

bigkey的危害

bigkey的危害體現(xiàn)在三個(gè)方面:

1、內(nèi)存空間不均勻(平衡):特別是在Redis Cluster中,bigkey可能導(dǎo)致節(jié)點(diǎn)的內(nèi)存空間使用不均勻。當(dāng)某個(gè)節(jié)點(diǎn)存儲(chǔ)了大量的bigkey時(shí),該節(jié)點(diǎn)的內(nèi)存占用會(huì)增加,并且可能超出其他節(jié)點(diǎn)的內(nèi)存使用量。這樣就破壞了集群的負(fù)載均衡,導(dǎo)致一些節(jié)點(diǎn)承受了過多的負(fù)載,而其他節(jié)點(diǎn)卻相對(duì)空閑。

2、超時(shí)阻塞:由于Redis的單線程特性,操作bigkey可能會(huì)耗費(fèi)較長(zhǎng)的時(shí)間,這也意味著Redis被阻塞的可能性增大。

3、網(wǎng)絡(luò)擁塞:獲取bigkey時(shí)產(chǎn)生的網(wǎng)絡(luò)流量較大,可能引起網(wǎng)絡(luò)擁塞問題。

假設(shè)一個(gè)bigkey的大小為1MB,每秒訪問量為1000個(gè)請(qǐng)求,那么每秒產(chǎn)生的流量將達(dá)到1000MB。對(duì)于普通的千兆網(wǎng)卡(以字節(jié)計(jì)算約為128MB/s)的服務(wù)器來說,這將帶來巨大的網(wǎng)絡(luò)負(fù)載,甚至可能導(dǎo)致災(zāi)難性的影響。尤其是在采用單機(jī)多實(shí)例的方式部署服務(wù)器時(shí),一個(gè)大型bigkey的影響最終會(huì)波及到其他實(shí)例上,后果不堪設(shè)想。

bigkey的存在并非完全致命:

如果一個(gè)bigkey存在但幾乎不被頻繁訪問,那么主要的問題可能是內(nèi)存空間的不均衡分布,相對(duì)于其他問題來說,這個(gè)問題的重要性和緊急性可能較低。然而,如果這個(gè)bigkey是一個(gè)熱點(diǎn)key(頻繁被訪問),那么它所帶來的危害就不容忽視。當(dāng)一個(gè)熱點(diǎn)bigkey的訪問量特別大時(shí),它可能會(huì)對(duì)Redis服務(wù)器和其他實(shí)例產(chǎn)生嚴(yán)重的性能影響。

因此,在實(shí)際的開發(fā)和運(yùn)維過程中,密切關(guān)注bigkey的存在是非常重要的。特別是對(duì)于熱點(diǎn)bigkey,需要采取相應(yīng)的策略來應(yīng)對(duì),例如數(shù)據(jù)分片、緩存或其他優(yōu)化措施,以確保系統(tǒng)的高性能和穩(wěn)定運(yùn)行。及時(shí)監(jiān)控和處理bigkey問題,有助于維護(hù)整體的系統(tǒng)性能和用戶體驗(yàn)。

發(fā)現(xiàn)bigkey

使用命令redis-cli --bigkeys可以統(tǒng)計(jì)和查看bigkey的分布情況。

image.png

在生產(chǎn)環(huán)境中,開發(fā)和運(yùn)維人員通常希望能夠自定義bigkey的大小,并且找到真正的bigkey,以便能夠定位、解決和優(yōu)化相關(guān)問題。

為了判斷一個(gè)key是否為bigkey,可以執(zhí)行DEBUG OBJECT key命令并查看serializedlength屬性,它表示key對(duì)應(yīng)的value序列化后的字節(jié)數(shù)。通過檢查這個(gè)屬性,我們可以確定一個(gè)key是否為bigkey。

image.png

當(dāng)需要遍歷多個(gè)key時(shí),應(yīng)避免使用keys命令,而是采用SCAN命令來減輕Redis服務(wù)器的壓力。

scan

自Redis 2.8版本以后,引入了SCAN命令來高效地解決KEYS命令存在的問題。不同于KEYS命令一次性遍歷所有鍵的方式,SCAN采用漸進(jìn)式遍歷的方式,以解決可能引起阻塞的問題。要完全實(shí)現(xiàn)KEYS命令的功能,需要執(zhí)行多次SCAN命令??梢詫⑵湎胂鬄橹鸩綊呙枳值渲械囊徊糠宙I,直到所有鍵都遍歷完成。

SCAN命令使用方法如下:

SCAN?cursor?[MATCH?pattern]?[COUNT?number]

  • ??cursor是必需的參數(shù),實(shí)際上是一個(gè)游標(biāo)。第一次遍歷時(shí),游標(biāo)值為0,每次執(zhí)行完SCAN命令后,會(huì)返回當(dāng)前游標(biāo)的值,直到游標(biāo)值為0,表示遍歷已結(jié)束。

  • ??MATCH pattern是可選參數(shù),用于指定鍵名的模式匹配,類似于KEYS命令的模式匹配功能。

  • ??COUNT number是可選參數(shù),用于指定每次要遍歷的鍵的數(shù)量,其默認(rèn)值為10,如果需要可以適當(dāng)增大此參數(shù)。

image.png

可以觀察到,使用SCAN 0命令的第一次執(zhí)行結(jié)果包含兩部分:

第一部分是下一次執(zhí)行SCAN命令所需的游標(biāo)值(通常是一個(gè)整數(shù))。

第二部分是返回的10個(gè)鍵。

接下來可以繼續(xù)執(zhí)行SCAN命令,并使用上一次返回的游標(biāo)值作為參數(shù),直到游標(biāo)值變?yōu)?,表示所有鍵都已經(jīng)遍歷完畢。

除了SCAN命令,Redis還提供了針對(duì)哈希類型、集合類型和有序集合類型的掃描遍歷命令,分別是HSCANSSCANZSCAN。它們的作用是解決類似于HGETALL、SMEMBERS、ZRANGE等可能導(dǎo)致阻塞的操作。這些命令的用法類似于SCAN命令,請(qǐng)參考Redis官方文檔獲取更多信息。

image.png

漸進(jìn)式遍歷確實(shí)可以有效解決KEYS命令可能產(chǎn)生的阻塞問題,但并非完美無瑕。在使用SCAN命令進(jìn)行遍歷過程中,如果鍵空間有變化(增加、刪除、修改),可能會(huì)遇到以下問題:新增的鍵可能沒有被遍歷到,或者遍歷結(jié)果中可能包含重復(fù)的鍵。因此,在開發(fā)過程中需要考慮這些潛在的情況。

當(dāng)鍵值個(gè)數(shù)較多時(shí),使用SCAN命令結(jié)合DEBUG OBJECT執(zhí)行速度可能較慢,此時(shí)可以考慮利用Redis的Pipeline機(jī)制來提高性能。對(duì)于元素個(gè)數(shù)較多的數(shù)據(jù)結(jié)構(gòu),DEBUG OBJECT命令執(zhí)行速度較慢,并且可能導(dǎo)致Redis阻塞。因此,如果存在從節(jié)點(diǎn),可以考慮在從節(jié)點(diǎn)上執(zhí)行這些操作。

解決bigkey

解決大鍵(bigkey)的主要思路是拆分,將存儲(chǔ)在大鍵中的數(shù)據(jù)(大值)進(jìn)行拆分,分成多個(gè)小的值(value1,value2...valueN)進(jìn)行存儲(chǔ)。

例如,如果大值是一個(gè)大的JSON對(duì)象,可以通過使用MSET命令將該鍵的內(nèi)容拆分存儲(chǔ)到各個(gè)實(shí)例中,或者使用哈希表(hash),其中每個(gè)字段代表一個(gè)具體屬性??梢允褂?code>HGET、HMGET命令來獲取部分值,使用HSET、HMSET命令來更新部分屬性。

同樣地,如果大值是一個(gè)大的列表(list),可以將其拆分為多個(gè)小的列表(list_1,list_2,list_3...list_N)進(jìn)行存儲(chǔ)。

對(duì)于其他數(shù)據(jù)類型也可以采用類似的拆分策略。

通過拆分大鍵,可以將大的值分割為小的部分,這樣可以更好地利用Redis的內(nèi)存和性能。這種拆分策略可以根據(jù)實(shí)際情況進(jìn)行調(diào)整,以滿足存儲(chǔ)和訪問的需求。


2023-06-21:redis中什么是BigKey?該如何解決?的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
余江县| 司法| 抚远县| 息烽县| 石狮市| 汶上县| 静安区| 太仓市| 黑龙江省| 广饶县| 安阳市| 赣州市| 青铜峡市| 黄大仙区| 瓮安县| 冷水江市| 灵璧县| 吕梁市| 甘泉县| 洪湖市| 兴安盟| 西宁市| 淮滨县| 铁岭县| 阿拉尔市| 龙山县| 志丹县| 融水| 南木林县| 苏尼特左旗| 乐安县| 班玛县| 博白县| 武乡县| 汝南县| 称多县| 吉木萨尔县| 津市市| 巴楚县| 东乌珠穆沁旗| 巴中市|