A 租户的用户看到 B 租户的订单列表,两个用户 id 都是 1001,接口返回的收货地址和手机号完全对不上。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,本地缓存 key 只拼了 userId,没有租户维度,两个租户的同号用户命中同一个 entry。查询本身带了租户条件,缓存层把隔离绕过去了。
「缓存键缺租户」这类改动最怕改一半,回滚脚本先准备好,再动生产。报错里带路径的,先去看那个路径在不在、权限对不对。
String key = tenantId + ":" + userId + ":orders"; cache.get(key, k -> loadOrders(tenantId, userId));
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,key 固定拼 tenantId 在最前面;租户 id 由拦截器注入 业务代码不要手拼;上线前扫一遍现有 key 统计每个前缀的租户分布。
最后用这个标准收尾,两个租户用同一个 userId 并发查询,各自返回自己的订单,交叉抽查 100 次没有串数据。
