欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Redis 大Key的刪除的實(shí)現(xiàn)策略

 更新時(shí)間:2025年07月25日 11:03:48   作者:喜歡代碼的新之助  
在Redis中,刪除大key是一項(xiàng)需要謹(jǐn)慎處理的操作,本文主要介紹了Redis 大Key的刪除的實(shí)現(xiàn)策略,具有一定的參考價(jià)值,感興趣的可以了解一下

1 定義

Redis大Key其實(shí)不是指的是Key,而是指Key對(duì)應(yīng)的Value。

Redis的String類型,最大可以存512MB的值,List、Hash、Set、ZSet等,可以存儲(chǔ)232個(gè)元素(大約42億多點(diǎn)),那么多大的Key算大Key呢?

一般來(lái)說(shuō),我們String需要控制在10KB以下,而集合類型的控制元素個(gè)數(shù)在5000個(gè)以下。

2 如何導(dǎo)致的大Key

一種,比如社交類的場(chǎng)景,如粉絲數(shù)增多,另外一種,可能由于報(bào)表等常年累月的積累,有可能導(dǎo)致大Key。

我們知道,由于Redis工作線程是單線程的,大Key刪除會(huì)導(dǎo)致網(wǎng)絡(luò)瀏覽阻塞、超時(shí)等一系列問(wèn)題,那么我們就應(yīng)該去防止大KEY的產(chǎn)生

3 如何檢測(cè)大Key

一般來(lái)說(shuō),有兩種方法:

  • 使用--bigkeys:掃描所有的鍵,給出每種數(shù)據(jù)結(jié)構(gòu)Top 1 bigkey
[root@localhost ~]# redis-cli -a Redis密碼 --bigkeys
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.

# 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 '"k5889"' with 5 bytes
[00.00%] Biggest string found so far '"k607267"' with 7 bytes
[00.00%] Biggest string found so far '"k1802564"' with 8 bytes
[50.00%] Sampled 1000000 keys so far
[100.00%] Sampled 2000000 keys so far

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

Sampled 2000000 keys in the keyspace!
Total key length in bytes is 14888896 (avg len 7.44)

Biggest string found '"k1802564"' has 8 bytes

0 lists with 0 items (00.00% of keys, avg size 0.00)
0 hashs with 0 fields (00.00% of keys, avg size 0.00)
2000000 strings with 14888896 bytes (100.00% of keys, avg size 7.44)
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)
  • 使用Memery Usage:獲取一個(gè)鍵的所占內(nèi)存
127.0.0.1:6379> MEMORY USAGE k10000
(integer) 64

4 大Key的刪除

4.1 String類型

String類型一般用Del即可,如果過(guò)于龐大可以使用Unlink

4.2 Hash類型

使用hscan每次獲取少量field-value,再使用hdel刪除每個(gè)field

public void delBigHash(String bigHashKey) {
    ScanParams scanParams = new ScanParams().count(100);
    String cursor = "0";
    do {
        ScanResult<Entry<String, String>> scanResult = jedis.hscan(bigHashKey, cursor, scanParams);
        List<Entry<String, String>> entryList = scanResult.getResult();
        if (CollectionUtils.isNotEmpty(entryList)) {
            for (Entry<String, String> entry : entryList) {
                jedis.hdel(bigHashKey, entry.getKey());
            }
        }
        cursor = scanResult.getCursor();
    } while (!"0".equals(cursor));
    jedis.del(bigHashKey);
}

4.3 List類型

使用ltrim漸進(jìn)式逐步刪除,直到全部刪除完成

public void delBigList(String bigListKey){
    long llen = jedis.llen(bigListKey);
    int counter = 0;
    int left = 100;
    while (counter < llen) {
        jedis.ltrim(bigListKey, left, llen);
        counter += left;
    }
    jedis.del(bigListKey);
}

4.4 Set類型

使用sscan每次獲取部分元素,再使用srem命令刪除每個(gè)元素

public void delBigSet(String bigSetKey){
    ScanParams scanParams = new ScanParams().count(100);
    String cursor = "0";
    do {
        ScanResult<String> scanResult = jedis.sscan(bigSetKey, cursor, scanParams);
        List<String> memberList = scanResult.getResult();
        if (CollectionUtils.isNotEmpty(memberList)) {
            for (String member : memberList) {
                jedis.srem(bigSetKey, member);
            }
        }
        cursor = scanResult.getCursor();
    } while (!"0".equals(cursor));
    jedis.del(bigSetKey);
}

4.5 ZSet類型

使用zscan每次獲取部分元素,再使用ZREMRANGEBYRANK命令刪除每個(gè)元素

public void delBigZSet(String bigZSetKey){
    ScanParams scanParams = new ScanParams().count(100);
    String cursor = "0";
    do {
        ScanResult<Tuple> scanResult = jedis.zscan(bigZSetKey, cursor, scanParams);
        List<Tuple> tupleList = scanResult.getResult();
        if (CollectionUtils.isNotEmpty(tupleList)) {
            for (Tuple tuple : tupleList) {
                jedis.zrem(bigZSetKey, tuple.getElement());
            }
        }
        cursor = scanResult.getCursor();
    } while (!"0".equals(cursor));
    jedis.del(bigZSetKey);
}

到此這篇關(guān)于Redis 大Key的刪除的實(shí)現(xiàn)策略的文章就介紹到這了,更多相關(guān)Redis 大Key刪除內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 淺析Redis中String數(shù)據(jù)類型及其底層編碼

    淺析Redis中String數(shù)據(jù)類型及其底層編碼

    這篇文章主要介紹?Redis?中?String?數(shù)據(jù)類型及其底層編碼,文中有詳細(xì)的代碼示例,對(duì)大家的工作及學(xué)習(xí)有一定的幫助,需要的朋友可以參考下
    2023-05-05
  • redis實(shí)現(xiàn)計(jì)數(shù)器-防止刷單方法介紹

    redis實(shí)現(xiàn)計(jì)數(shù)器-防止刷單方法介紹

    本文主要向大家介紹了redis實(shí)現(xiàn)計(jì)數(shù)器防止刷單的方法和有關(guān)代碼,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • 解決redis服務(wù)啟動(dòng)失敗的問(wèn)題

    解決redis服務(wù)啟動(dòng)失敗的問(wèn)題

    今天小編就為大家分享一篇解決redis服務(wù)啟動(dòng)失敗的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-05-05
  • redis復(fù)制有可能碰到的問(wèn)題匯總

    redis復(fù)制有可能碰到的問(wèn)題匯總

    這篇文章主要介紹了redis復(fù)制有可能碰到的問(wèn)題匯總,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用

    Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用

    這篇文章主要為大家介紹了Redis做預(yù)定庫(kù)存緩存功能設(shè)計(jì)使用,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Redis大key多key拆分實(shí)現(xiàn)方法解析

    Redis大key多key拆分實(shí)現(xiàn)方法解析

    這篇文章主要介紹了Redis大key多key拆分實(shí)現(xiàn)方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • 基于Redis的分布式鎖的簡(jiǎn)單實(shí)現(xiàn)方法

    基于Redis的分布式鎖的簡(jiǎn)單實(shí)現(xiàn)方法

    這篇文章主要介紹了基于Redis的分布式鎖的簡(jiǎn)單實(shí)現(xiàn)方法,Redis官方給出兩種思路,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • 小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫(kù)管理詳解

    小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫(kù)管理詳解

    這篇文章主要為大家介紹了小白也能看懂的Redis遍歷鍵和數(shù)據(jù)庫(kù)管理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • Redis如何解決BigKey

    Redis如何解決BigKey

    在Redis的使用過(guò)程中,我們經(jīng)常會(huì)遇到BigKey, BigKey的大值會(huì)導(dǎo)致Redis內(nèi)存中產(chǎn)生大量不連續(xù)的碎片,降低內(nèi)存利用效率,本文主要介紹了Redis如何解決BigKey,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-01-01
  • Redis數(shù)據(jù)一致性問(wèn)題的三種解決方案

    Redis數(shù)據(jù)一致性問(wèn)題的三種解決方案

    Redis(Remote?Dictionary?Server?),是一個(gè)高性能的基于Key-Value結(jié)構(gòu)存儲(chǔ)的NoSQL開源數(shù)據(jù)庫(kù),大部分公司采用Redis來(lái)實(shí)現(xiàn)分布式緩存,用來(lái)提高數(shù)據(jù)查詢效率,本文就給大家介紹三種Redis數(shù)據(jù)一致性問(wèn)題的解決方案,需要的朋友可以參考下
    2023-07-07

最新評(píng)論