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
相关产品推荐
相关产品推荐

