本章代码通过保存图片到redis中,演示了如何在redis中保存二进制数据,以及从redis中读取二进制数据。
1:读取图片文件到byte[]变量中
2:保存byte[]到redis中
3:从redis中读取数据到byte[]
4:保存byte[]到文件
✅ 缓存二进制数据实现类
package com.foxbill.redisinaction;
import com.foxbill.redisinaction.util.FileUtil;
import redis.clients.jedis.Jedis;
import java.io.File;
import java.io.IOException;
public class Chapter2 {
public static void start(Jedis jedis) {
try {
binaryData(jedis);
} catch (Exception e) {
System.err.println("执行Redis操作时出错: " + e.getMessage());
}
}
private static void binaryData(Jedis jedis) {
// 测试二进制数据的存取
String imagePath = "d:/a.png"; // 源图片路径
String redisKey = "chapter2:image:a.png"; // Redis中的键名
String savePath = "d:/a_copy.png"; // 保存的图片路径
try{
// 存储二进制数据到Redis
storeBinaryData(jedis, redisKey, imagePath);
// 从Redis读取二进制数据并保存到文件
retrieveBinaryData(jedis, redisKey, savePath);
} catch (Exception e) {
System.err.println("操作过程中出错: " + e.getMessage());
e.printStackTrace();
}
}
/**
* 将二进制文件存储到Redis
* @param jedis Jedis实例
* @param key Redis中的键名
* @param filePath 本地文件路径
*/
private static void storeBinaryData(Jedis jedis, String key, String filePath) throws IOException {
// 检查文件是否存在
File file = new File(filePath);
if (!file.exists() || !file.isFile()) {
throw new IOException("文件不存在: " + filePath);
}
// 读取文件内容为字节数组
byte[] fileData = FileUtil.readFileToByteArray(filePath);
// 将字节数组存储到Redis
jedis.set(key.getBytes(), fileData);
System.out.println("已将文件存储到Redis,键名: " + key + ", 文件大小: " + fileData.length + " 字节");
}
/**
* 从Redis读取二进制数据并保存到文件
* @param jedis Jedis实例
* @param key Redis中的键名
* @param savePath 保存的文件路径
*/
private static void retrieveBinaryData(Jedis jedis, String key, String savePath) throws IOException {
// 从Redis获取字节数组
byte[] fileData = jedis.get(key.getBytes());
if (fileData == null) {
throw new IOException("在Redis中未找到键: " + key);
}
// 将字节数组写入文件
FileUtil.writeByteArrayToFile(fileData, savePath);
System.out.println("已从Redis读取数据并保存到文件,键名: " + key + ", 保存路径: " + savePath + ", 文件大小: " + fileData.length + " 字节");
}
}
✅ 文件读写工具类FileUtil
package com.foxbill.redisinaction.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* @Description 文件读写工具类
*/
public class FileUtil {
/**
* 读取文件内容为字节数组
*/
public static byte[] readFileToByteArray(String filePath) throws IOException {
File file = new File(filePath);
byte[] data = new byte[(int) file.length()];
try (FileInputStream fis = new FileInputStream(file)) {
fis.read(data);
}
return data;
}
/**
* 将字节数组写入文件
*/
public static void writeByteArrayToFile(byte[] data, String filePath) throws IOException {
// 确保目录存在
File file = new File(filePath);
File parentDir = file.getParentFile();
if (parentDir != null && !parentDir.exists()) {
parentDir.mkdirs();
}
try (FileOutputStream fos = new FileOutputStream(file)) {
fos.write(data);
}
}
}
📌 小结
使用jedis的set和get函数,同样可以设置和读取二进制数据
1394

被折叠的 条评论
为什么被折叠?



