RuoYi-Cloud-Plus一些坑

1、RedisUtils工具类
在 RuoYi-Cloud-Plus 的多租户模式下,RedisUtils.getClient().set 和 RedisUtils.setCacheObject 对 key 的处理确实不一样,前者不会自动拼接租户 ID。

🔍 两者的区别

RedisUtils.getClient().set(key, value)

  • 这是直接使用底层的 RedissonClient 操作 Redis。
  • 不经过框架的 TenantKeyPrefixHandler 处理,所以 key 不会被拼接租户前缀。
  • 适合存储全局共享数据,比如系统级配置、跨租户的计数等。

RedisUtils.setCacheObject(key, value)

  • 这是框架封装的方法,会走 TenantKeyPrefixHandler
  • 它会自动检查当前上下文有没有租户 ID。如果有,就会把 key 变成 tenantId:原始key 的形式存储。
  • 适合存储租户隔离数据,比如每个租户自己的配置、用户会话等。

💡 框架的全局 key 机制

RuoYi-Cloud-Plus 也考虑到了存全局数据的需求,所以如果你希望用 setCacheObject 存全局数据,可以在 key 里加上 GlobalConstants.GLOBAL_REDIS_KEY 前缀。这样 TenantKeyPrefixHandler 会识别并跳过租户拼接。

🎯 怎么选

  • 需要租户隔离(比如天气接口缓存,每个租户查自己的):用 RedisUtils.setCacheObject(),让它自动拼租户前缀。
  • 需要全局共享(比如系统配置、全站统计):用 RedisUtils.getClient().set(),这样就不会有租户前缀了。

如果想设置全局的缓存?

原理:TenantKeyPrefixHandler.map() 检测到 key 包含 "global:" 时直接跳过租户前缀拼接:

if (StringUtils.contains(name, GlobalConstants.GLOBAL_REDIS_KEY)) {
    return super.map(name);  // 不加租户前缀
}

例:

key 从 "uas:detected:icao24" 改为 "global:uas:detected:icao24" 后,无论有无租户上下文,Redis 中实际 key 始终是 global:uas:detected:icao24,三个访问点天然一致,不需要 TenantHelper.dynamic 包裹。

posted @ 2026-09-22 10:10  没有烦恼的猫猫  阅读(55)  评论(0)    收藏  举报