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
|
REDIS_HOST="localhost" REDIS_PORT="6379" REDIS_PASSWORD="xxx"
KEY_PATTERN="*user"
OUTPUT_DIRECTORY="output/"
mkdir -p "$OUTPUT_DIRECTORY"
keys=$(./redis-cli -h $REDIS_HOST -p $REDIS_PORT -a "$REDIS_PASSWORD" KEYS "$KEY_PATTERN")
index=0 for key in $keys; do 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对应的文件得到文件