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

Redis中對(duì)大Key進(jìn)行處理方式

 更新時(shí)間:2025年06月21日 16:51:08   作者:一個(gè)追夢(mèng)的少年  
這篇文章主要介紹了Redis中對(duì)大Key進(jìn)行處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

什么是大key

很多鐵子可能會(huì)認(rèn)為大key,是這個(gè)key的值很大其實(shí)不是,而是key的value值很大一般對(duì)于下面這些我們可以稱為大key.

  • String 類型值大于10KB。
  • Hash、List、Set、Zset類型元素個(gè)數(shù)超過(guò)5000個(gè)。

大key會(huì)造成什么影響

這個(gè)大key主要會(huì)帶來(lái)下面這幾種影響:

  • 阻塞工作線程:如果我們使用del命令刪除大key,會(huì)阻塞工作線程這樣就沒(méi)有辦法處理其他客戶端發(fā)過(guò)來(lái)的命令了。
  • 內(nèi)存分布不均: 集群模型在slot分片均勻情況下會(huì)出現(xiàn)數(shù)據(jù)和查詢傾斜的情況,部分有大key的Redis結(jié)點(diǎn)占用內(nèi)存較多。
  • 客戶端超時(shí)阻塞: Redis的工作線程只有一個(gè),操作這個(gè)大key會(huì)比較耗時(shí)會(huì)阻塞Redis在客戶端看來(lái)就說(shuō)很久很久沒(méi)有響應(yīng)。
  • 引發(fā)網(wǎng)絡(luò)阻塞: 每次獲取大key產(chǎn)生的網(wǎng)絡(luò)流量比較大,這對(duì)于網(wǎng)卡比較小的服務(wù)器是災(zāi)難性的。

如何找到大key

1.我們可以通過(guò)redis客戶端提供的命令 redis-cli --bigkeys.來(lái)查看

[root@VM-4-17-centos redis]# redis-cli --bigkeys

# Scanning the entire keyspace to find biggest keys as well as
# average sizes per key type.  You can use -i 0.1 to sleep 0.1 sec
# per 100 SCAN commands (not usually needed).

[00.00%] Biggest string found so far '"k1"' with 2 bytes
[00.00%] Biggest hash   found so far '"ksyi"' with 100 fields

-------- summary -------

Sampled 2 keys in the keyspace!
Total key length in bytes is 6 (avg len 3.00)

Biggest   hash found '"ksyi"' has 100 fields
Biggest string found '"k1"' has 2 bytes

0 lists with 0 items (00.00% of keys, avg size 0.00)
1 hashs with 100 fields (50.00% of keys, avg size 100.00)
1 strings with 2 bytes (50.00% of keys, avg size 2.00)
0 streams with 0 entries (00.00% of keys, avg size 0.00)
0 sets with 0 members (00.00% of keys, avg size 0.00)
0 zsets with 0 members (00.00% of keys, avg size 0.00)

注意:

  • 在使用這個(gè)命令來(lái)查詢大key時(shí),最好在從節(jié)點(diǎn)上執(zhí)行。如果在主節(jié)點(diǎn)上執(zhí)行會(huì)阻塞從節(jié)點(diǎn)。
  • 如果沒(méi)有這個(gè)從節(jié)點(diǎn),那么我們可以選擇在Redis業(yè)務(wù)壓力比較輕的時(shí)候執(zhí)行避免影響正常的業(yè)務(wù)功能;或者我們可以使用**-i選項(xiàng)**來(lái)控制掃描間隔避免長(zhǎng)時(shí)間掃描降低Redis的性能。

這個(gè)方式其實(shí)也有缺點(diǎn),他之只能返回每種類型最大的那個(gè)bigkey,無(wú)法獲得大小在前N位的bigkey。

2.使用memory usage命令進(jìn)行查詢

  • MEMORY USAGE命令給出一個(gè)key和它的值在RAM中所占用的字節(jié)數(shù)。返回的結(jié)果是key的值以及為管理該key分配的內(nèi)存總字節(jié)數(shù)。
  • 對(duì)于嵌套數(shù)據(jù)類型,可以使用選項(xiàng)SAMPLES,其中count表示抽樣的元素個(gè)數(shù),默認(rèn)值為5。當(dāng)需要抽樣所有元素時(shí),使用SAMPLES 0 。

其語(yǔ)法如下:

MEMORY USAGE key [SAMPLES count]

下面我們來(lái)演示一下

127.0.0.1:6379> memory usage ksyi
(integer) 496

3.通過(guò)scan命令來(lái)查找大key

  • 我們可以先使用scan命令對(duì)數(shù)據(jù)庫(kù)進(jìn)行掃描,然后用type命令返回每一個(gè)key的類型。
  • 對(duì)于String類型,我們可以直接使用strlen命令獲取字符串的長(zhǎng)度,也就是占用內(nèi)存的字節(jié)數(shù)。

如何刪除大key

如果我們一下子釋放大量的內(nèi)存,空閑內(nèi)存塊鏈表操作時(shí)間會(huì)增加,相應(yīng)地就會(huì)造成Redis主線程阻塞,如果redis主線程發(fā)生了阻塞其他客戶端的請(qǐng)求可能會(huì)超時(shí),如果超時(shí)的連接越來(lái)越多會(huì)造成各自異常問(wèn)題。

因此我們刪除大key這一個(gè)動(dòng)作我們要特別的小心具體要怎么做這里給出兩種方法:

  • 漸進(jìn)式刪除
  • 異步刪除(unlink)

漸進(jìn)式刪除

1.對(duì)于string類型

對(duì)于這個(gè)String類型的大key我們可以使用del直接刪除如果這個(gè)他確實(shí)很大我們可以使用unlink來(lái)進(jìn)行異步刪除 。這個(gè)特別簡(jiǎn)單在這里就不演示了。

2.對(duì)于Hash類型

對(duì)于刪除大的Hash類型,我們可以使用hscan命令每次獲取100個(gè)字段,這個(gè)個(gè)數(shù)根據(jù)業(yè)務(wù)來(lái)確定然后我們?cè)谑褂胔del命令每次刪除一個(gè)字段即可。

  • 對(duì)應(yīng)golang代碼
package main

import (
	"fmt"
	"github.com/go-redis/redis"
)

func DelBigHashKey(conn *redis.Client) {
	bigKey := "xxx"
	cursor := uint64(0)
	for {

		ScanRet := conn.HScan(bigKey, cursor, "", 100)
		keys, c, err := ScanRet.Result()
		if err != nil {
			panic(err)
		}
		fmt.Println(keys)
		for i := 0; i < len(keys); i++ {
			conn.HDel(bigKey, keys[i])
		}
		if c == 0 {
			break
		}
		cursor = c
	}
}
func main() {
	conn := redis.NewClient(&redis.Options{
		Addr:     "101.35.98.26:6379", // url
		Password: "",                  //redis密碼
		DB:       0,                   // 0號(hào)數(shù)據(jù)庫(kù)
	})
	_, err := conn.Ping().Result()
	if err != nil {
		fmt.Println("ping err :", err)
		return
	}

	DelBigHashKey(conn)

}

3.對(duì)應(yīng)刪除大的List,通過(guò)ltrim命令每次迭代刪除少量元素

// DelBigListKey 刪除大的Listkey
func DelBigListKey(conn *redis.Client) {
	bigKey := "xxx" //要?jiǎng)h除的大key
	for conn.LLen(bigKey).Val() > 0 {
		conn.LTrim(bigKey, 0, -101) //每次刪除最右邊100個(gè)元素
	}
}

4.刪除大的Set 可以先使用sscan獲取部分元素,比如每次掃描集合當(dāng)中100個(gè)元素在用srem命令每次刪除一個(gè)鍵

func DelBigSetKey(conn *redis.Client) {
	bigKey := "xxx"     //要?jiǎng)h除的大key
	cursor := uint64(0) //游標(biāo)
	for {
		keys, c, err := conn.SScan(bigKey, cursor, "", 100).Result()
		if err != nil {
			panic(err)
		}
		cursor = c
		for i := 0; i < len(keys); i++ {
			fmt.Println(conn.SRem(bigKey, keys[i]).Val())
		}
		if c == 0 {
			//刪除完畢
			break
		}
	}
}

對(duì)于刪除Zset,使用zremrangebyrank命令每次刪除top 100元素

func DelBigZsetKey(conn *redis.Client) {
	bigKey := "xxx"
	for conn.ZCard(bigKey).Val() > 0 {
		conn.ZRemRangeByRank(bigKey, 0, 99)
	}
}

以上就是針對(duì)大key刪除的方案。

異步刪除

除了上面的刪除方案我們可以采用異步刪除的方式可以使用unlink命令代替del來(lái)刪除這樣就不會(huì)阻塞主線程。

如何禁用keys*、flushdb 、flushall等命令

如果我們想要禁用這些命令我們可以在redis.conf 默認(rèn)配置文件,找到 SECURITY 區(qū)域,如以下所示:

這樣這些命令就被禁用了。

Redis有兩個(gè)原語(yǔ)來(lái)刪除鍵。一種稱為DEL,是對(duì)象的阻塞刪除。這意味著服務(wù)器停止處理新命令,以便以同步方式回收與對(duì)象關(guān)聯(lián)的所有內(nèi)存。如果刪除的鍵與一個(gè)小對(duì)象相關(guān)聯(lián),則執(zhí)行DEL命令所需的時(shí)間非常短,可與大多數(shù)其他命令相媲美

Redis 中的O(1)或O(log_N)命令。但是,如果鍵與包含數(shù)百萬(wàn)個(gè)元素的聚合值相關(guān)聯(lián),則服務(wù)器可能會(huì)阻塞很長(zhǎng)時(shí)間(甚至幾秒鐘)才能完成操作。

基于上述原因,Redis還提供了非阻塞刪除原語(yǔ),例如UNLINK(非阻塞DEL)以及FLUSHALL和FLUSHDB命令的ASYNC選項(xiàng),以便在后臺(tái)回收內(nèi)存。這些命令在恒定時(shí)間內(nèi)執(zhí)行。另一個(gè)線程將盡可能快地逐步釋放后臺(tái)中的對(duì)象。

FLUSHALL和FLUSHDB的DEL、UNLINK和ASYNC選項(xiàng)是用戶控制的。這取決于應(yīng)用程序的設(shè)計(jì),以了解何時(shí)使用其中一個(gè)是個(gè)好主意。然而,作為其他操作的副作用,Redis服務(wù)器有時(shí)不得不刪除鍵或刷新整個(gè)數(shù)據(jù)庫(kù)。具體而言,Redis在以下場(chǎng)景中獨(dú)立于用戶調(diào)用刪除對(duì)象:

我們可以將配置文件當(dāng)中的這些參數(shù)設(shè)置為yes,也就是懶釋放

總結(jié)

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

相關(guān)文章

  • 淺談redission鎖的默認(rèn)失效時(shí)間

    淺談redission鎖的默認(rèn)失效時(shí)間

    Redisson是一個(gè)基于Redis的Java駐留庫(kù),提供了許多分布式對(duì)象和服務(wù),包括分布式鎖,本文主要介紹了淺談redission鎖的默認(rèn)失效時(shí)間, 具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • 詳解Redis分布式鎖的原理與實(shí)現(xiàn)

    詳解Redis分布式鎖的原理與實(shí)現(xiàn)

    在單體應(yīng)用中,如果我們對(duì)共享數(shù)據(jù)不進(jìn)行加鎖操作,會(huì)出現(xiàn)數(shù)據(jù)一致性問(wèn)題,我們的解決辦法通常是加鎖。下面我們一起聊聊使用redis來(lái)實(shí)現(xiàn)分布式鎖
    2022-06-06
  • 使用注解實(shí)現(xiàn)Redis緩存功能

    使用注解實(shí)現(xiàn)Redis緩存功能

    這篇文章主要為大家詳細(xì)介紹了使用注解實(shí)現(xiàn)Redis緩存功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • redis主從切換導(dǎo)致的數(shù)據(jù)丟失與陷入只讀狀態(tài)故障解決方案

    redis主從切換導(dǎo)致的數(shù)據(jù)丟失與陷入只讀狀態(tài)故障解決方案

    這篇文章主要介紹了redis主從切換導(dǎo)致的數(shù)據(jù)丟失與陷入只讀狀態(tài)故障解決方案的相關(guān)資料,需要的朋友可以參考下
    2023-05-05
  • 解決Redis設(shè)置密碼重啟后失效的問(wèn)題

    解決Redis設(shè)置密碼重啟后失效的問(wèn)題

    今天小編就為大家分享一篇解決Redis設(shè)置密碼重啟后失效的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • 使用Redis存儲(chǔ)SpringBoot項(xiàng)目中Session的詳細(xì)步驟

    使用Redis存儲(chǔ)SpringBoot項(xiàng)目中Session的詳細(xì)步驟

    在開(kāi)發(fā)Spring Boot項(xiàng)目時(shí),我們通常會(huì)遇到如何高效管理Session的問(wèn)題,默認(rèn)情況下,Spring Boot會(huì)將Session存儲(chǔ)在內(nèi)存中,今天,我們將學(xué)習(xí)如何將Session存儲(chǔ)從內(nèi)存切換到Redis,并驗(yàn)證配置是否成功,需要的朋友可以參考下
    2024-06-06
  • 基于Redis-Shake實(shí)現(xiàn)Redis實(shí)時(shí)同步的示例代碼

    基于Redis-Shake實(shí)現(xiàn)Redis實(shí)時(shí)同步的示例代碼

    本文主要介紹了基于Redis-Shake實(shí)現(xiàn)Redis實(shí)時(shí)同步的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-11-11
  • redis分布式鎖解決緩存雙寫(xiě)一致性

    redis分布式鎖解決緩存雙寫(xiě)一致性

    這篇文章主要為大家介紹了redis分布式鎖解決緩存雙寫(xiě)一致性示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • Redis批量刪除key的命令詳解

    Redis批量刪除key的命令詳解

    這篇文章主要介紹了Redis批量刪除key的命令詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • 基于Redis實(shí)現(xiàn)的分布式唯一編號(hào)生成工具類

    基于Redis實(shí)現(xiàn)的分布式唯一編號(hào)生成工具類

    這篇文章主要介紹了基于Redis實(shí)現(xiàn)的分布式唯一編號(hào)生成工具類,核心功能是生成格式為 業(yè)務(wù)編碼+日期+3位自增序號(hào)(如 JJ20250826001)的全局唯一編號(hào),適用于分布式系統(tǒng)中需要有序、不重復(fù)編號(hào)的場(chǎng)景(如訂單號(hào)、單據(jù)號(hào)等),以下是詳細(xì)解析,需要的朋友可以參考下
    2025-11-11

最新評(píng)論

盈江县| 仁化县| 都昌县| 西安市| 修武县| 林周县| 永平县| 延川县| 东城区| 曲水县| 兖州市| 缙云县| 孝昌县| 新沂市| 云龙县| 措勤县| 深圳市| 新乐市| 夹江县| 墨江| 梓潼县| 余姚市| 白银市| 金沙县| 依安县| 冷水江市| 砀山县| 德江县| 高雄县| 湘乡市| 泾阳县| 商都县| 西平县| 蒙自县| 曲阜市| 凯里市| 德格县| 屯留县| 黑龙江省| 攀枝花市| 洛南县|