diff --git a/src/main/java/com/knowledge/base/infrastructure/cache/RedisFileCacheService.java b/src/main/java/com/knowledge/base/infrastructure/cache/RedisFileCacheService.java index 4dc6a90..683787b 100644 --- a/src/main/java/com/knowledge/base/infrastructure/cache/RedisFileCacheService.java +++ b/src/main/java/com/knowledge/base/infrastructure/cache/RedisFileCacheService.java @@ -6,7 +6,9 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; +import java.util.HashSet; import java.util.Optional; +import java.util.Set; import java.util.concurrent.TimeUnit; /** @@ -23,8 +25,10 @@ public class RedisFileCacheService implements FileCacheService { private final StringRedisTemplate redisTemplate; + private static final String FILE_CACHE_PREFIX = "kb-file"; + private String key(String prefix, String key) { - return String.format("kb:file:%s:%s", prefix, key); + return String.format(FILE_CACHE_PREFIX + ":%s:%s", prefix, key); } @Override @@ -66,7 +70,32 @@ public class RedisFileCacheService implements FileCacheService { @Override public void clearAll() { - // 不清理 Redis 所有数据,仅为接口保留占位符 - log.warn("清空 Redis 文件缓存未实现,请手动清理前缀为 kb:file 的数据。"); + log.warn("正在清空 Redis 文件缓存,前缀: {}", FILE_CACHE_PREFIX); + Set keysToDelete = scanKeys(FILE_CACHE_PREFIX + "*"); + if (keysToDelete.isEmpty()) { + log.info("没有需要清理的文件缓存 Key。"); + return; + } + redisTemplate.delete(keysToDelete); + log.info("已清空 Redis 文件缓存 Key 数量: {}", keysToDelete.size()); } + + /** + * 用 scan 命令遍历所有带 prefix 的 key(推荐,不会阻塞大 Redis) + */ + private Set scanKeys(String pattern) { + Set keySet = new HashSet<>(); + // 采用 scan,分批遍历,安全高效 + redisTemplate.execute((connection) -> { + try (var cursor = connection.scan(org.springframework.data.redis.core.ScanOptions.scanOptions() + .match(pattern) + .count(1000) + .build())) { + cursor.forEachRemaining(item -> keySet.add(new String(item))); + } + return null; + }, false, true); + return keySet; + } + }