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

Redis中BigKey與MoreKey優(yōu)化詳解

 更新時(shí)間:2026年03月24日 10:39:31   作者:微刻時(shí)光  
這篇文章主要介紹了Redis中BigKey與MoreKey優(yōu)化,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.MoreKey

在Redis中,MoreKey問題通常指的是當(dāng)數(shù)據(jù)庫中的key數(shù)量非常多時(shí),使用如KEYS *這樣的命令去檢索所有的key,這會導(dǎo)致Redis服務(wù)阻塞,影響正常業(yè)務(wù)。因?yàn)镽edis是單線程操作的,執(zhí)行這類命令時(shí)會占用大量時(shí)間,從而阻塞其他操作。

keys * 這個(gè)指令有致命的弊端,在實(shí)際環(huán)境中最好不要使用

這個(gè)指令沒有offset、limit 參數(shù),是要一次性吐出所有滿足條件的key,由于redis是單線程的,其所有操作都是原子的,而keys算法是遍歷算法,復(fù)雜度是O(n),如果實(shí)例中有千萬級以上的 key,這個(gè)指令就會導(dǎo)致Redis服務(wù)卡頓,所有讀寫Redis 的其它的指令都會被延后甚至?xí)瑫r(shí)報(bào)錯(cuò),可能會引起緩存雪崩甚至數(shù)據(jù)庫宕機(jī)。

生產(chǎn)上限制 keys * /flushdb/flushall等危險(xiǎn)命令以防止誤刪誤用?

通過配置文件設(shè)置禁用這些命令,redis.conf在SECURITY這一項(xiàng)中

為了避免MoreKey問題,Redis提供了SCAN命令,它是一個(gè)基于游標(biāo)的迭代器,用于以增量的方式迭代數(shù)據(jù)庫中的key。SCAN命令不會像KEYS *那樣一次性返回所有的key,而是返回一個(gè)游標(biāo)和一批key,用戶可以使用返回的游標(biāo)進(jìn)行下一次迭代,直到游標(biāo)返回0,表示迭代結(jié)束。

這種方式可以避免阻塞Redis服務(wù),并且可以自定義每次迭代返回的key數(shù)量,減少一次性返回大量key對性能的影響。

Scan命令用于迭代數(shù)據(jù)庫中的數(shù)據(jù)庫鍵

SCAN命令是一個(gè)基于游標(biāo)的迭代器,每次被調(diào)用之后,都會向用戶返回一個(gè)新的游標(biāo),用戶在下次迭代時(shí)需要使用這個(gè)新游標(biāo)作為SCAN命令的游標(biāo)參數(shù),以此來延續(xù)之前的迭代過程。

SCAN返回一個(gè)包含兩個(gè)元素的數(shù)組

1). 第一個(gè)元素是用于進(jìn)行下一次迭代的新游標(biāo)

2). 第二個(gè)元素則是一個(gè)數(shù)組,這個(gè)數(shù)組中包含了所有被迭代的元素 如果新游標(biāo)返回零表示迭代已結(jié)束

SCAN的遍歷順序

非常特別,它不是從第一維數(shù)組的第零位一直遍歷到末尾,而是采用了高位進(jìn)位加法來遍歷。之所以使用這樣特殊的方式進(jìn)行遍歷,是考慮到字典的擴(kuò)容和縮容時(shí)避免槽位的遍歷重復(fù)和遺漏

在實(shí)際使用中,應(yīng)該避免使用KEYS *這樣的命令,而是采用SCAN及其相關(guān)的迭代命令來處理大量key的情況。

這樣可以有效地避免Redis服務(wù)因處理大量key而造成的阻塞,確保Redis的性能和穩(wěn)定性

2.BigKey

Redis中的BigKey指的是那些值(value)特別大的鍵(key),這可能包括大的字符串或者包含大量元素的集合類型(如list、set、hash、zset等)。

BigKey的存在可能會導(dǎo)致Redis的性能問題,因?yàn)镽edis是單線程操作的,處理BigKey時(shí)可能會阻塞其他操作,影響整體性能。

通常我們說的BigKey,不是在值的Key很大,而是指的Key對應(yīng)的value很大

string和二級結(jié)構(gòu)

  • string是value,最大512MB 但是≥10KB就是bigkey
  • list、hash、set和zset,value個(gè)數(shù)超過5000就是bigkey
  • list:一個(gè)列表最多可以包含2^32-1個(gè)元素(4294967295,每個(gè)列表超過40億個(gè)元素)。
  • hash:Redis中每個(gè)hash可以存儲2^32-1個(gè)鍵值對(40多億)
  • set:集合中最大的成員數(shù)為2^32-1(4294967295,每個(gè)集合可存儲40多億個(gè)成員)

3.Bigkey危害、產(chǎn)生與發(fā)現(xiàn)

3.1 危害

  • 內(nèi)存使用不均:在集群模式下可能導(dǎo)致某些節(jié)點(diǎn)內(nèi)存使用過高。
  • 請求阻塞:操作BigKey可能耗時(shí)較長,阻塞其他請求。
  • 網(wǎng)絡(luò)擁塞:BigKey可能會占用大量帶寬,影響其他服務(wù)。
  • 刪除時(shí)阻塞:刪除操作可能會阻塞Redis,尤其是在BigKey設(shè)置了過期時(shí)間后

3.2 產(chǎn)生

  • 社交類 明星粉絲列表,典型案例粉絲逐步遞增,熱點(diǎn)事件
  • 匯總統(tǒng)計(jì) 某個(gè)報(bào)表,日月年經(jīng)年累計(jì)

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

redis-cli --bigkey命令:給出每種數(shù)據(jù)結(jié)構(gòu)Top 1 bigkey。同時(shí)給出每種數(shù)據(jù)類型的鍵值個(gè)數(shù)+平均大小

缺點(diǎn):想查詢大于10kb的所有key,--bigkeys參數(shù)就無能為力了,需要用到memory usage來計(jì)算每個(gè)鍵值的字節(jié)數(shù)

redis-cli --bigkeys -a 111111
redis-cli -h 127.0.0.1 -p 6379 -a 111111 --bigkeys

#加上 -i 參數(shù),每隔100 條 scan指令就會休眠0.1s.ops就不會劇烈抬升,但是掃描的時(shí)間會變長
redis-cli -h 127.0.0.1 -p 7001 --bigkeys -i 0.1

計(jì)算每個(gè)鍵值的字節(jié)數(shù)

memory usage key

4. 大key如何刪除

普通命令

  • String: 一般用del,如果過于龐大使用unlink key 刪除
  • hash: 使用hscan每次獲取少量field-value,再使用hdel刪除每個(gè)field
  • list: 使用ltrim漸進(jìn)式逐步刪除,直到全部刪除完成
  • set: 使用sscan每次獲取部分元素,在使用srem命令刪除每個(gè)元素
  • zset:使用zscan每次獲取部分元素,在使用zremrangebyrank命令刪除每個(gè)元素

5.BigKey生產(chǎn)調(diào)優(yōu)

  • 分割BigKey:將一個(gè)大的key分割成多個(gè)小的key,例如將一個(gè)大的hash分割成多個(gè)小的hash。
  • 清理BigKey:對于不再需要的BigKey,可以直接刪除。在Redis 4.0及以上版本,可以使用UNLINK命令異步刪除key,避免阻塞。
  • 監(jiān)控內(nèi)存:設(shè)置內(nèi)存使用率的監(jiān)控閾值,提前發(fā)現(xiàn)潛在的BigKey問題。
  • 定期清理失效數(shù)據(jù):對于存儲大量數(shù)據(jù)的key,定期清理過期或無效數(shù)據(jù)。
  • 使用合適的數(shù)據(jù)結(jié)構(gòu):避免不必要的復(fù)雜數(shù)據(jù)結(jié)構(gòu),或者使用更高效的數(shù)據(jù)結(jié)構(gòu)來減少內(nèi)存占用

redis.conf配置文件 LAZY FREEING相關(guān)說明

阻塞和非阻塞刪除命令

優(yōu)化配置

lazyfree-lazy-eviction:當(dāng) redis 內(nèi)存達(dá)到閾值 maxmemory 時(shí),將執(zhí)行內(nèi)存淘汰
lazyfree-lazy-expire:當(dāng)設(shè)置了過期 key 的過期時(shí)間到了,將刪除 key
lazyfree-lazy-server-del:這種主要用戶提交 del 刪除指令
replica-lazy-flush:主要用于復(fù)制過程中,全量同步的場景,從節(jié)點(diǎn)需要?jiǎng)h除整個(gè) db
lazyfree-lazy-user-del:修改del命令的默認(rèn)行為,使之與unlink命令一樣

在處理BigKey時(shí),應(yīng)該盡量避免在主節(jié)點(diǎn)上進(jìn)行大規(guī)模的掃描或刪除操作,以免影響線上服務(wù)。

可以考慮在從節(jié)點(diǎn)上進(jìn)行這些操作,或者在業(yè)務(wù)低峰期進(jìn)行。

6.總結(jié)

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

相關(guān)文章

  • Redis操作相關(guān)命令之查看、停止、啟動(dòng)命令

    Redis操作相關(guān)命令之查看、停止、啟動(dòng)命令

    這篇文章主要介紹了Redis操作相關(guān)命令之查看、停止、啟動(dòng)命令,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • redis配置standAlone版的jedisPool示例

    redis配置standAlone版的jedisPool示例

    這篇文章主要為大家介紹了redis配置standAlone版的jedisPool示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • Redis實(shí)現(xiàn)訂單過期刪除的方法步驟

    Redis實(shí)現(xiàn)訂單過期刪除的方法步驟

    本文主要介紹了Redis實(shí)現(xiàn)訂單過期刪除的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Redis實(shí)現(xiàn)事物以及鎖的方法

    Redis實(shí)現(xiàn)事物以及鎖的方法

    本文主要介紹了Redis實(shí)現(xiàn)事物以及鎖的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Redis的幾種數(shù)據(jù)類型使用詳解

    Redis的幾種數(shù)據(jù)類型使用詳解

    這篇文章主要介紹了Redis的幾種數(shù)據(jù)類型使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Redis和Lua使用過程中遇到的小問題

    Redis和Lua使用過程中遇到的小問題

    這篇文章主要給大家介紹了關(guān)于Redis和Lua使用過程中遇到的小問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • Redis與MySQL數(shù)據(jù)一致性問題的策略模式及解決方案

    Redis與MySQL數(shù)據(jù)一致性問題的策略模式及解決方案

    開發(fā)中,一般會使用Redis緩存一些常用的熱點(diǎn)數(shù)據(jù)用來減少數(shù)據(jù)庫IO,提高系統(tǒng)的吞吐量,本文將給大家介紹了Redis與MySQL數(shù)據(jù)一致性問題的策略模式及解決方案,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • Redis使用Lua腳本命令詳解

    Redis使用Lua腳本命令詳解

    這篇文章主要為大家介紹了Redis使用Lua腳本命令詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Redis集群(cluster模式)搭建過程

    Redis集群(cluster模式)搭建過程

    文章介紹了Redis集群的概念、使用原因和搭建方法,Redis集群通過分區(qū)實(shí)現(xiàn)數(shù)據(jù)水平擴(kuò)容,提供了一定的可用性,文章詳細(xì)闡述了集群的連接方式,解釋了如何分配節(jié)點(diǎn),并提供了詳細(xì)的集群搭建步驟,包括創(chuàng)建節(jié)點(diǎn)、清空數(shù)據(jù)、修改配置、啟動(dòng)節(jié)點(diǎn)、配置集群等
    2024-10-10
  • Redis利用互斥鎖解決緩存擊穿問題

    Redis利用互斥鎖解決緩存擊穿問題

    使用互斥鎖可以有效防止緩存擊穿的情況發(fā)生,它能夠保證在緩存失效時(shí),只有一個(gè)線程或者進(jìn)程能夠去加載數(shù)據(jù),其余的請求都會等待這個(gè)加載過程完成,雖然這種方式會犧牲一部分性能,但它大大提高了系統(tǒng)的穩(wěn)定性和可用性
    2024-08-08

最新評論

灵台县| 贺州市| 富裕县| 伊通| 玛多县| 永德县| 新干县| 垣曲县| 宁城县| 泸定县| 西畴县| 石嘴山市| 金山区| 赣榆县| 江都市| SHOW| 南和县| 天水市| 石泉县| 措勤县| 阿坝县| 余庆县| 湖南省| 汉川市| 伊春市| 汝南县| 平泉县| 河源市| 迁安市| 永安市| 巩留县| 高陵县| 二手房| 玛曲县| 诸暨市| 重庆市| 丰都县| 阿图什市| 莲花县| 屏东县| 黄大仙区|