《Redis应用实例》Java实现(2):缓存二进制数据

本章代码通过保存图片到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函数,同样可以设置和读取二进制数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值