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:" 时直接跳过租户前缀拼接:
java
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 包裹。