You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下Quarkus测试中嵌入式Redis临时文件堆积问题求助

解决方案:清理嵌入式Redis测试后的Windows临时文件

针对你遇到的RedisQFork_*.dat文件堆积占用磁盘空间的问题,以下是几种可行的解决办法:

1. 指定自定义临时目录,测试后自动清理

默认情况下嵌入式Redis会将临时文件存在系统默认目录,你可以手动指定测试专属的临时目录,避免污染系统目录,同时利用自动机制清理:

方式A:使用JUnit 5的@TempDir自动管理(推荐)

import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.io.TempDir;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.File;

public class RedisTest {
    private static RedisServer redisServer;
    @TempDir
    static File tempRedisDir;

    @BeforeAll
    public static void setUp() throws Exception {
        redisServer = RedisServer.builder().port(6379)
                .setting("maxmemory 128mb")
                .setting("maxmemory-policy allkeys-lru")
                .setting("appendonly no")
                .setting("save \"\"")
                // 指定Redis工作目录为临时目录
                .setting("dir " + tempRedisDir.getAbsolutePath())
                .build();
        redisServer.start();
        assertTrue(redisServer.isActive());
    }

    @AfterAll
    public static void cleanUp() {
        if (redisServer != null) {
            redisServer.stop();
        }
        // JUnit会自动删除@TempDir标记的目录,无需手动处理
    }
}

方式B:手动创建并删除临时目录

import java.io.File;
import java.nio.file.Files;

public class RedisTest {
    private static RedisServer redisServer;
    private static File tempRedisDir;

    @BeforeAll
    public static void setUp() throws Exception {
        // 创建测试专属临时目录
        tempRedisDir = Files.createTempDirectory("embedded-redis-test").toFile();
        
        redisServer = RedisServer.builder().port(6379)
                .setting("maxmemory 128mb")
                .setting("maxmemory-policy allkeys-lru")
                .setting("appendonly no")
                .setting("save \"\"")
                .setting("dir " + tempRedisDir.getAbsolutePath())
                .build();
        redisServer.start();
        assertTrue(redisServer.isActive());
    }

    @AfterAll
    public static void cleanUp() {
        if (redisServer != null) {
            redisServer.stop();
        }
        // 递归删除临时目录及内部文件
        deleteDirectory(tempRedisDir);
    }

    private static void deleteDirectory(File directory) {
        File[] files = directory.listFiles();
        if (files != null) {
            for (File file : files) {
                deleteDirectory(file);
            }
        }
        directory.delete();
    }
}

2. 测试结束后手动清理默认目录的临时文件

如果不想修改Redis工作目录,可以在@AfterAll中添加删除RedisQFork_*.dat文件的逻辑:

@AfterAll
public static void cleanUp() {
    if (redisServer != null) {
        redisServer.stop();
    }
    // 清理系统默认Redis临时目录下的QFork文件
    File redisDefaultDir = new File(System.getProperty("user.home") + "\\AppData\\Local\\Redis");
    if (redisDefaultDir.exists()) {
        File[] qForkFiles = redisDefaultDir.listFiles((dir, name) -> 
            name.startsWith("RedisQFork_") && name.endsWith(".dat")
        );
        if (qForkFiles != null) {
            for (File file : qForkFiles) {
                file.delete();
            }
        }
    }
}

3. 升级或替换嵌入式Redis依赖

你当前使用的it.ozimov:embedded-redis:0.7.3版本发布于2017年,可能存在Windows平台下临时文件未清理的bug。可以替换为更活跃的维护分支库:

<dependency>
    <groupId>com.github.kstyrc</groupId>
    <artifactId>embedded-redis</artifactId>
    <version>0.11.0</version> <!-- 可使用最新稳定版 -->
    <scope>test</scope>
</dependency>

新版本通常会修复旧版本的兼容性问题,可能自动处理临时文件的清理逻辑。

内容的提问来源于stack exchange,提问作者Dev-tools

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:43:11