Redis发现BigKey,利用scan扫描工具类
- Redis
- 时间:2023-01-05 20:54
- 3534人已阅读
简介
我们知道Redis的BigKey的发现,有三种方法,其中一种就是使用scan命令来扫描的。scan命令:使用scan命令示例:scan命令调用完之后,每次返回2个元素,第一个是下一次迭代的光标,第一个光标会设置为0,当最一次scan返回的光标等于0的时候,表示整个scan遍历完成了。第二个返回的是list,一个匹配的key的数组。根据这些,自己可以手动写一个工具类型。import org
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
我们知道Redis的BigKey的发现,有三种方法,其中一种就是使用scan命令来扫描的。
scan命令:
使用scan命令示例:
scan命令调用完之后,每次返回2个元素,第一个是下一次迭代的光标,第一个光标会设置为0,当最一次scan返回的光标等于0的时候,表示整个scan遍历完成了。第二个返回的是list,一个匹配的key的数组。
根据这些,自己可以手动写一个工具类型。
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(); } } }