记一次从Reids取JDK序列化对象
kael Lv1

1、问题描述

当时场景: 排查问题,需查看看redis的JDK序列化后的对象数据, 不能直联redis

当时思路:
使用redis命令查出对应key的数据get xxx
利用查出来的数据, 直接序列化
一时没有立马解决, 现回顾问题并排除知识盲区

2、解决步骤

1
./redis-cli -a password get user > aa.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class RedisTest {

public static Object deserialize() throws Exception {
FileInputStream fileInputStream = new FileInputStream(new File("aa.txt"));
ObjectInputStream in = new ObjectInputStream(fileInputStream);
Object o = in.readObject();
System.out.println(o);
return o;
}

public static void main(String[] args) throws Exception {
deserialize();
}

}

3、问题盲区

3.1 问题1

redis用命令行取出来的数据 二进制部分数据会被16进制处理来好显示出来

3.2 问题2

序列化ID 其实不是必要的 反序列化会直接提示与对比的结果不同,会直接显示两个不通的序列化ID

4、补充

假如key也被jdk序列化,key在用命令行输入时不好直接输入 或者 输入的方式不对

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

#!/bin/bash

# Redis服务器连接信息
REDIS_HOST="localhost"
REDIS_PORT="6379"
REDIS_PASSWORD="xxx" # 替换为你的Redis密码

# 匹配的键模式
KEY_PATTERN="*user"

# 输出文件目录
OUTPUT_DIRECTORY="output/"

# 创建输出目录
mkdir -p "$OUTPUT_DIRECTORY"

# 使用KEYS命令进行模糊查询
keys=$(./redis-cli -h $REDIS_HOST -p $REDIS_PORT -a "$REDIS_PASSWORD" KEYS "$KEY_PATTERN")

index=0
for key in $keys; do
# 使用GET命令获取键的值
value=$(./redis-cli -h $REDIS_HOST -p $REDIS_PORT -a "$REDIS_PASSWORD" GET "$key")

# 为每个键创建一个单独的文件,以键名命名
file_name="$OUTPUT_DIRECTORY$index.txt"

echo "$key -> $file_name"

# 保存值到文件
echo "$value" > "$file_name"

((index++))
done

echo "Values matching pattern '$KEY_PATTERN' saved to files in '$OUTPUT_DIRECTORY'."

以上脚本更换你要匹配的key值,会将所有可能匹配的key进行数据到文件夹中output/,根据控制开打印key对应的文件得到文件