Redis发现BigKey,利用scan扫描工具类

  • 作者: 凯哥Java(公众号:凯哥Java)
  • Redis
  • 时间:2023-01-05 20:54
  • 2954人已阅读
简介 我们知道Redis的BigKey的发现,有三种方法,其中一种就是使用scan命令来扫描的。scan命令:使用scan命令示例:scan命令调用完之后,每次返回2个元素,第一个是下一次迭代的光标,第一个光标会设置为0,当最一次scan返回的光标等于0的时候,表示整个scan遍历完成了。第二个返回的是list,一个匹配的key的数组。根据这些,自己可以手动写一个工具类型。import org

🔔🔔好消息!好消息!🔔🔔

 如果您需要注册ChatGPT,想要升级ChatGPT4。凯哥可以代注册ChatGPT账号代升级ChatGPT4

有需要的朋友👉:微信号 kaigejava2022

我们知道Redis的BigKey的发现,有三种方法,其中一种就是使用scan命令来扫描的。

scan命令:

436d3bb9a5af0c4d849d63536c65b412.png

使用scan命令示例:

a88503af014d4c4cc7c338449450f854.png

scan命令调用完之后,每次返回2个元素,第一个是下一次迭代的光标,第一个光标会设置为0,当最一次scan返回的光标等于0的时候,表示整个scan遍历完成了。第二个返回的是list,一个匹配的key的数组。

fdd825d8954b91f4e68bcf73d7d530bf.png

根据这些,自己可以手动写一个工具类型。

import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanResult;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class JedisTest {
    private Jedis jedis;

    @BeforeEach
    void setUp() {
        // 1.建立连接
         jedis = new Jedis("192.168.150.101", 6379);
       // jedis = JedisConnectionFactory.getJedis();
        // 2.设置密码
        jedis.auth("123321");
        // 3.选择库
        jedis.select(0);
    }

    final static int STR_MAX_LEN = 10 * 1024;
    final static int HASH_MAX_LEN = 500;

    @Test
    void testScan() {
        int maxLen = 0;
        long len = 0;

        String cursor = "0";
        do {
            // 扫描并获取一部分key
            ScanResult<String> result = jedis.scan(cursor);
            // 记录cursor
            cursor = result.getCursor();
            List<String> list = result.getResult();
            if (list == null || list.isEmpty()) {
                break;
            }
            // 遍历
            for (String key : list) {
                // 判断key的类型
                String type = jedis.type(key);
                switch (type) {
                    case "string":
                        len = jedis.strlen(key);
                        maxLen = STR_MAX_LEN;
                        break;
                    case "hash":
                        len = jedis.hlen(key);
                        maxLen = HASH_MAX_LEN;
                        break;
                    case "list":
                        len = jedis.llen(key);
                        maxLen = HASH_MAX_LEN;
                        break;
                    case "set":
                        len = jedis.scard(key);
                        maxLen = HASH_MAX_LEN;
                        break;
                    case "zset":
                        len = jedis.zcard(key);
                        maxLen = HASH_MAX_LEN;
                        break;
                    default:
                        break;
                }
                if (len >= maxLen) {
                    System.out.printf("Found big key : %s, type: %s, length or size: %d %n", key, type, len);
                }
            }
        } while (!cursor.equals("0"));
    }
    
    @AfterEach
    void tearDown() {
        if (jedis != null) {
            jedis.close();
        }
    }

}


TopTop