Files
hzdyjs/docs/变更管理/code-adjust-record-2025-01-18-wuzhen-redis-compatibility-fix.md
T

3.9 KiB

代码调整记录 - 2025-01-18 - wuzhen - Redis工具类兼容性修复

📋 变更概述

变更时间: 2025-01-18 09:45:00
变更人员: wuzhen
变更类型: 编译错误修复
影响范围: 后端 - 统计缓存服务

🔧 修复内容

问题描述

在编译ruoyi-xg-xx模块时出现以下编译错误:

  1. 类型转换错误: Collection<String>无法转换为Set<String>
  2. 方法调用错误: RedisUtils.getExpire()方法不存在

根本原因

  • RedisUtils.keys()方法: 返回类型为Collection<String>,不是Set<String>
  • RedisUtils时间方法: 正确的方法名为getTimeToLive(),不是getExpire()

修复方案

1. 修复文件:XgStatisticsCacheServiceImpl.java

修复类型转换错误:

// 修复前
Set<String> keys = RedisUtils.keys(CACHE_PREFIX + "*");

// 修复后  
Collection<String> keys = RedisUtils.keys(CACHE_PREFIX + "*");

修复方法调用错误:

// 修复前
Long expire = RedisUtils.getExpire(key);

// 修复后
Long expire = RedisUtils.getTimeToLive(key);

修复导入语句:

// 移除
import java.util.Set;

// 添加
import java.util.Collection;

2. 具体修复位置

位置1: clearAllCache()方法 (第119行、第125行)

  • 修复:Set<String> keys → Collection<String> keys
  • 修复:Set<String> statsKeys → Collection<String> statsKeys

位置2: getCacheStatistics()方法 (第153行、第188行)

  • 修复:Set<String> keys → Collection<String> keys
  • 修复:RedisUtils.getExpire(key) → RedisUtils.getTimeToLive(key)

位置3: getCacheExpire()方法 (第237行)

  • 修复:RedisUtils.getExpire(fullKey) → RedisUtils.getTimeToLive(fullKey)

位置4: deleteCacheByPattern()方法 (第251行)

  • 修复:Set<String> keys → Collection<String> keys
  • 修复:Collectors.toSet() → Collectors.toList()

✅ 验证结果

编译验证

  • 类型转换错误已解决
  • 方法调用错误已解决
  • 导入语句已更新
  • 代码逻辑功能不变

功能验证

  • 缓存清除功能正常
  • 缓存统计功能正常
  • 缓存过期时间获取正常
  • 批量删除缓存功能正常

📊 影响评估

正面影响

  • ✅ 解决编译错误,项目可以正常构建
  • ✅ 保持原有功能逻辑不变
  • ✅ 提高代码与框架的兼容性

风险评估

  • ⚠️ 低风险: 仅修复API调用,不改变业务逻辑
  • ⚠️ 兼容性: 从Set改为Collection,向上兼容,不影响使用

🔍 技术细节

RedisUtils API分析

// 实际方法签名
public static Collection<String> keys(final String pattern)
public static <T> long getTimeToLive(final String key)

// 错误调用
public static Set<String> keys(final String pattern)     // 不存在
public static Long getExpire(final String key)           // 不存在

集合类型兼容性

// Collection是Set的父接口,向上兼容
Collection<String> keys = RedisUtils.keys("*");   // ✅ 正确
Set<String> keys = RedisUtils.keys("*");          // ❌ 编译错误

// 在遍历和删除操作中,Collection和Set行为一致
for (String key : keys) { ... }                   // ✅ 都支持
RedisUtils.deleteObject(keys);                    // ✅ 都支持

📚 相关文档

  • RedisUtils源码: ruoyi-common-redis/src/main/java/org/dromara/common/redis/utils/RedisUtils.java
  • 统计缓存服务: ruoyi-xg-xx/src/main/java/org/dromara/xg/service/impl/XgStatisticsCacheServiceImpl.java

🎯 后续建议

  1. 代码审查: 检查其他模块是否存在类似的API调用错误
  2. 单元测试: 为统计缓存服务添加单元测试
  3. 文档更新: 更新RedisUtils使用指南,避免类似错误

修复完成时间: 2025-01-18 09:45:00
编译状态: ✅ 通过
功能状态: ✅ 正常