最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Redis中big?keys發(fā)現(xiàn)與解決過(guò)程

 更新時(shí)間:2026年04月07日 08:49:16   作者:小碼A夢(mèng)  
文章從bigkeys的定義、產(chǎn)生原因、危害、如何發(fā)現(xiàn)以及處理方法等方面詳細(xì)介紹了Redis中bigkeys的問(wèn)題,bigkeys會(huì)導(dǎo)致請(qǐng)求響應(yīng)慢、網(wǎng)絡(luò)卡頓、數(shù)據(jù)丟失等問(wèn)題,需要通過(guò)異步刪除、拆分key等方法進(jìn)行處理

在使用 Redis 時(shí),可能會(huì)出現(xiàn)請(qǐng)求響應(yīng)慢、網(wǎng)絡(luò)卡頓、數(shù)據(jù)丟失的情況。排查問(wèn)題的時(shí)候,發(fā)現(xiàn)是 big keys 的問(wèn)題。

什么是 big keys

在 Redis 中,一個(gè)字符串類(lèi)型最大可以達(dá)到 512MB,其他非字符串類(lèi)型的集合類(lèi)型(list、set、hash、zset等)可以存儲(chǔ) 40 億個(gè)(2^32-1),但在實(shí)際業(yè)務(wù)場(chǎng)景中,并不需要這么大的內(nèi)存。而且對(duì)于一個(gè)請(qǐng)求量大的互聯(lián)網(wǎng)軟件,對(duì)數(shù)據(jù)的大小要求更加的嚴(yán)格。如果達(dá)到如下標(biāo)準(zhǔn),就可以認(rèn)定是 big keys 了:

  • String 類(lèi)型的 key 對(duì)應(yīng)的值超過(guò) 5 MB。
  • list、set、hash、zset等集合類(lèi)型,集合元素個(gè)數(shù)超過(guò) 2000。

以上對(duì) big keys 的判斷標(biāo)準(zhǔn)并不是唯一,只是一個(gè)大題的標(biāo)準(zhǔn)。在實(shí)際業(yè)務(wù)開(kāi)發(fā)中,對(duì) big keys 的判斷是需要根據(jù)具體的使用場(chǎng)景做不同的判斷。比如操作某個(gè) key 導(dǎo)致請(qǐng)求響應(yīng)時(shí)間變慢,那么這個(gè) key 就可以判定成 big keys。

big keys 是如何產(chǎn)生的

一般來(lái)說(shuō),big keys 的產(chǎn)生都是由于程序的設(shè)計(jì)不當(dāng),或者對(duì)數(shù)據(jù)的規(guī)模沒(méi)有一個(gè)大體的估算。比如:

  • 統(tǒng)計(jì)類(lèi):例如統(tǒng)計(jì)某個(gè)網(wǎng)站的訪問(wèn)用戶(hù)信息,網(wǎng)站的訪問(wèn)量越來(lái)越多,這個(gè) key 的元素也會(huì)越來(lái)越大。變成了 big keys。
  • 社交類(lèi):例如某個(gè)大V微博粉絲量很大,如果不做合理的設(shè)計(jì),也是 big keys。
  • 緩存類(lèi):一般緩存類(lèi)的信息訪問(wèn)都比較頻繁,是將從數(shù)據(jù)庫(kù)查詢(xún)出來(lái)的數(shù)據(jù)序列化到Redis緩存中,這里的緩存如果設(shè)計(jì)不當(dāng),或者為了方便,把所有的數(shù)據(jù)都存在一個(gè) key 下,或者隨著業(yè)務(wù)的擴(kuò)大,對(duì)應(yīng)的緩存也增多,也是形成 big keys。

以上幾種類(lèi)型都是在實(shí)際運(yùn)維中遇到的。在開(kāi)發(fā)中需要根據(jù)預(yù)估的數(shù)據(jù)大小來(lái)合理的設(shè)計(jì)緩存數(shù)據(jù)。

big keys 的危害

在系統(tǒng)中如果存在 big keys,會(huì)導(dǎo)致請(qǐng)求數(shù)據(jù)響應(yīng)變慢、請(qǐng)求超時(shí)或者系統(tǒng)不穩(wěn)定。

1、響應(yīng)變慢、超時(shí)阻塞

  • Redis 是單線(xiàn)程工作的,同一時(shí)間只能處理一個(gè)請(qǐng)求,操作 big keys 時(shí)比較耗時(shí),請(qǐng)求響應(yīng)也變慢。
  • 其他請(qǐng)求也處于阻塞狀態(tài),導(dǎo)致請(qǐng)求超時(shí)。
  • 除了查詢(xún) big keys 比較耗時(shí),刪除 big keys 也會(huì)導(dǎo)致一樣的問(wèn)題。

2、網(wǎng)絡(luò)擁塞

  • 請(qǐng)求單個(gè) big keys 產(chǎn)生的網(wǎng)絡(luò)流量比較大,假設(shè)一個(gè) big keys 為 1MB,客戶(hù)端每秒訪問(wèn)量是 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 keys

Redis4.0 后提供了 --bigkeys命令,比如:

./redis-cli --bigkeys

獲取每個(gè)數(shù)據(jù)類(lèi)型最大的 big keys,同時(shí)給出每個(gè)類(lèi)型鍵的個(gè)數(shù)和平均大小。因?yàn)?Redis 是單線(xiàn)程工作的,為了減少對(duì)線(xiàn)上請(qǐng)求的影響,執(zhí)行--bigkeys命令需要注意一下幾點(diǎn):

  • 最好在 slave 節(jié)點(diǎn)執(zhí)行,因?yàn)?--bigkeys 也是掃描數(shù)據(jù),會(huì)造成其他線(xiàn)程阻塞。
  • 使用 --i 參數(shù),降低掃描的執(zhí)行速度,比如 --i 0.1 表示 100 毫秒執(zhí)行一次。
  • 只能統(tǒng)計(jì)每個(gè)數(shù)據(jù)類(lèi)型最大的數(shù)據(jù)。

big keys 處理

異步刪除 big keys

找到 big keys 之后,首先需要?jiǎng)h除對(duì)應(yīng)的big keys,但是使用 del 命令刪除 big keys 是比較耗時(shí)的。Redis4.0 后可以使用 unlink 刪除,和 del 命令相比,unlink 是非阻塞的異步刪除。

非字符串的 big keys,使用 hscan、sscan、zscan 方式漸進(jìn)式刪除,同時(shí)要注意防止big keys 過(guò)期時(shí)間自動(dòng)刪除問(wèn)題(例如一個(gè) 200 萬(wàn)的 zset 設(shè)置1小時(shí)過(guò)期,會(huì)觸發(fā)del操作,造成阻塞)。

big key 拆分

字符串類(lèi)型的數(shù)據(jù)是減少字符串的長(zhǎng)度,將一個(gè)字符串拆成幾個(gè)小的字符串。非字符串的是減少元素?cái)?shù)量。這些都是講一個(gè) key 拆成多個(gè) key,比如:

  • 字符串類(lèi)型的數(shù)據(jù),根據(jù)數(shù)據(jù)的屬性拆分。比如商品信息,根據(jù)的類(lèi)別拆分 key。
  • 非字符串類(lèi)型的數(shù)據(jù),根據(jù)數(shù)據(jù)的屬性拆分,可以按照日期拆分,比如每天登錄人的集合,按照日期拆分,key20220101、key20220102.

如果 big keys 無(wú)法避免,那獲取數(shù)據(jù)盡量不要把所有的數(shù)據(jù)都取出來(lái),就使用分段的方式取出數(shù)據(jù)。刪除的方式也類(lèi)似,分段刪除數(shù)據(jù)。

總結(jié)

  • big keys 會(huì)造成請(qǐng)求變慢、網(wǎng)絡(luò)阻塞、數(shù)據(jù)丟失的問(wèn)題。
  • big keys 是字符串字節(jié)達(dá)到很大的數(shù)量(比如 5MB),非字符串類(lèi)型元素類(lèi)型達(dá)到 1000 個(gè)都可以判定成 big keys,具體還需要看具體的場(chǎng)景。
  • big keys 的產(chǎn)生可能由于設(shè)計(jì)不合理或者對(duì)數(shù)據(jù)大小估算錯(cuò)誤,導(dǎo)致數(shù)據(jù)偏大。
  • 解決 big keys 先緊急使用異步刪除 unlink 命令刪除緩存。然后將單個(gè) key 拆分成多個(gè)小 key。
  • 如果無(wú)法避免 big keys,就使用分段查詢(xún)的方式查詢(xún)數(shù)據(jù)。

要從幾個(gè)方面分析:

  • big keys 會(huì)帶來(lái)哪些問(wèn)題。
  • big keys 一般怎么產(chǎn)生的,線(xiàn)上如果產(chǎn)生了big key,線(xiàn)上先怎么緊急處理。
  • 有哪些優(yōu)化方案,各自有什么應(yīng)用場(chǎng)景。

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 嵌入式Redis服務(wù)器在Spring Boot測(cè)試中的使用教程

    嵌入式Redis服務(wù)器在Spring Boot測(cè)試中的使用教程

    這篇文章主要介紹了嵌入式Redis服務(wù)器在Spring Boot測(cè)試中的使用,本文通過(guò)實(shí)例代碼場(chǎng)景分析給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-07-07
  • Redis 存取 JSON 數(shù)據(jù)示例操作

    Redis 存取 JSON 數(shù)據(jù)示例操作

    JSON 是我們常用的數(shù)據(jù)類(lèi)型,當(dāng)我們需要在Redis中保存json數(shù)據(jù)時(shí)是怎么存放的呢?一般是用String或者Hash,但還是不太方便,無(wú)法靈活的操作json 數(shù)據(jù),下面通過(guò)本文給大家介紹Redis存取JSON 數(shù)據(jù)示例操作,感興趣的的朋友一起看看吧
    2024-02-02
  • redis和rabbitmq實(shí)現(xiàn)延時(shí)隊(duì)列的示例代碼

    redis和rabbitmq實(shí)現(xiàn)延時(shí)隊(duì)列的示例代碼

    在高并發(fā)場(chǎng)景下,延遲隊(duì)列顯得尤為重要,本文主要介紹了兩種方式,redis和rabbitmq實(shí)現(xiàn)延時(shí)隊(duì)列,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Redis中不同持久化方式的差異對(duì)比

    Redis中不同持久化方式的差異對(duì)比

    大家應(yīng)該都知道,Redis持久化方式主要有兩種:RDB(Redis DataBase)和AOF(Append-only file),但是他們各自存儲(chǔ)了什么內(nèi)容?有什么差異呢?今天我來(lái)給大家做個(gè)小試驗(yàn),需要的朋友可以參考下
    2024-03-03
  • Redis3.2.6配置文件詳細(xì)中文說(shuō)明

    Redis3.2.6配置文件詳細(xì)中文說(shuō)明

    本文為大家分享了Redis3.2.6配置文件詳細(xì)中文說(shuō)明,非常詳細(xì)收藏起來(lái)以后工作有用
    2018-10-10
  • Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制詳析

    Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制詳析

    這篇文章主要給大家介紹了關(guān)于Redis基礎(chǔ)學(xué)習(xí)之管道機(jī)制的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-11-11
  • Linux、Windows下Redis的安裝即Redis的基本使用詳解

    Linux、Windows下Redis的安裝即Redis的基本使用詳解

    Redis是一個(gè)基于內(nèi)存的key-value結(jié)構(gòu)數(shù)據(jù)庫(kù),Redis 是互聯(lián)網(wǎng)技術(shù)領(lǐng)域使用最為廣泛的存儲(chǔ)中間件,這篇文章主要介紹了Linux、Windows下Redis的安裝即Redis的基本使用詳解,需要的朋友可以參考下
    2022-09-09
  • Redis中Bloom filter布隆過(guò)濾器的學(xué)習(xí)

    Redis中Bloom filter布隆過(guò)濾器的學(xué)習(xí)

    布隆過(guò)濾器是一個(gè)非常長(zhǎng)的二進(jìn)制向量和一系列隨機(jī)哈希函數(shù)的組合,可用于檢索一個(gè)元素是否存在,本文就詳細(xì)的介紹一下Bloom filter布隆過(guò)濾器,具有一定的參考價(jià)值,感興趣的可以了解一下
    2022-12-12
  • Redis?key的過(guò)期時(shí)間和永久有效的實(shí)現(xiàn)

    Redis?key的過(guò)期時(shí)間和永久有效的實(shí)現(xiàn)

    在Redis中,鍵可以設(shè)置過(guò)期時(shí)間或被永久保存,`EXPIRE`和`PEXPIRE`命令分別用于設(shè)置鍵的過(guò)期時(shí)間,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • Redis 中的 BitMaps(位圖)命令詳解

    Redis 中的 BitMaps(位圖)命令詳解

    Redis的Bitmaps利用字符串?dāng)?shù)據(jù)類(lèi)型進(jìn)行位操作,提供getbit、setbit、bitcount等命令,適用于簽到統(tǒng)計(jì)、頻率記錄等場(chǎng)景,下面就來(lái)詳細(xì)的介紹一下使用方法
    2025-09-09

最新評(píng)論

库尔勒市| 高雄县| 夹江县| 石林| 临沧市| 葫芦岛市| 丁青县| 衡阳市| 仙桃市| 永吉县| 隆昌县| 敖汉旗| 南江县| 仲巴县| 堆龙德庆县| 南安市| 兰西县| 醴陵市| 武清区| 兴安盟| 三明市| 中宁县| 精河县| 阿勒泰市| 健康| 拉萨市| 邓州市| 澳门| 镇沅| 防城港市| 申扎县| 沾化县| 长岛县| 清苑县| 塔城市| 道孚县| 图木舒克市| 石家庄市| 上思县| 屏东县| 嘉兴市|