Redis发现BigKey,利用scan扫描工具类
- Redis
- 时间:2023-01-05 20:54
- 4017人已阅读
简介
我们知道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();
}
}
}