ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Redisson RLocalCachedMap 事务缓存一致性完整排查指南

Redisson RLocalCachedMap 事务缓存一致性完整排查指南 Redisson RLocalCachedMap 事务缓存一致性完整排查指南【免费下载链接】redissonRedisson: Valkey Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redisson凌晨 02:14对账任务报警优惠券ACT-618在 Redis 主节点剩余 12 张而三台应用节点的RLocalCachedMap本地缓存仍读到 18。当晚的核销写入都走 Redisson 事务读走本地缓存问题指向事务提交与缓存失效通知之间的时间差。现象长什么样排查入口是让对账任务逐节点比对 Redis 主节点值与本地缓存值再结合事务监控定位窗口期。典型症状有三条值差持续数秒事务提交后本地读出的库存高于主节点值核销场景里偏高即未扣减过一段时间自行收敛节点漂移同一 key 提交后各节点本地值不一致收敛时刻各不相同命中率掩盖问题本地缓存命中率很高常规采样采不到偏差往往靠对账或下游投诉暴露WARN ReconcileJob - couponACT-618 nodeapp-03 redis12 local18 delta6 WARN ReconcileJob - couponACT-618 nodeapp-05 redis12 local15 delta3 INFO TxMonitor - txTX-9912 stateCOMMIT_OK elapsed_ms41机制拆解先说事务侧。Redisson 事务把写入先缓存在客户端的事务对象中提交时以 MULTI/EXEC 形式批量下发隔离级别为READ_COMMITTED详见事务管理官方说明。也就是说EXEC 之前 Redis 里的 key 完全不变写入在 EXEC 那一刻才落地。再说缓存侧。RLocalCachedMap的一致性依赖另一条通道服务端数据变化后向各客户端实例广播失效或更新消息。本地缓存配置支持三种同步策略——INVALIDATE删除对应条目默认值、UPDATE广播完整键值、NONE不主动同步定义见客户端缓存文档的本地缓存小节。时间差由此产生失效消息由服务端真实变更触发而真实变更只发生在 EXEC 之后消息从生成、投递到各实例处理还要再走一个网络往返。窗口期内读请求命中的仍是本地旧值。类似快递延迟——货先走了通知后到。NONE策略连消息都没有INVALIDATE只删条目不回写新值窗口期读要么拿到旧值、要么回源两种表现都不理想。时刻事务侧本地缓存侧T0写入缓存在事务对象未落到 Redis缓存不动读命中旧值T1EXEC 批量提交主节点确认仍持有提交前旧值T2commit 返回写锁释放服务端开始广播失效消息T3—消息在途部分实例尚未收到T4—各实例逐条删除或覆盖条目收敛完成三条修复路径路径一调同步策略让框架收尾适用边界读多写少、多节点部署、能接受完整键值广播的带宽开销。核心是把同步策略切到UPDATE让各节点不必回源即可收敛同时在事务层挂一个提交回调提交成功后主动触发一次本地重算覆盖消息投递窗口。// 本地缓存选项广播完整键值各节点无需回源 LocalCachedMapOptionsString, Integer cacheOptions LocalCachedMapOptions.String, Integerdefaults() .syncStrategy(SyncStrategy.UPDATE) .reconnectionStrategy(ReconnectionStrategy.CLEAR) .cacheSize(2048); RLocalCachedMapString, Integer stockCache redisson.getLocalCachedMap(coupon:stock, cacheOptions); // 事务提交回调commit 成功后主动触发一次本地重算 TransactionSynchronizationManager.registerSynchronization( new TransactionSynchronization() { Override public void afterCommit() { stockCache.recompute(); // 覆盖消息在途的窗口期 } });什么时候别用它值对象很大或写频率极高时不要选它UPDATE每次变更都要广播完整键值带宽和内存放大明显。路径二提交后显式刷新用代码补偿适用边界键数量少、更新频率低、不想动全局同步策略。做法是在事务外持有同名对象commit 成功后立刻对该 key 调refresh从主节点回拉单个键补偿不生效时退化为清空整块本地缓存。RTransaction tx redisson.createTransaction(TransactionOptions.defaults()); RLocalCachedMapString, Integer txStock tx.getLocalCachedMap(coupon:stock, LocalCachedMapOptions.String, Integerdefaults().cacheSize(512)); // 事务内写入核销结果 txStock.put(ACT-618, 11); tx.commit(); // 事务外补偿本地缓存 RLocalCachedMapString, Integer stock redisson.getLocalCachedMap(coupon:stock); Boolean refreshed stock.refresh(ACT-618); if (!Boolean.TRUE.equals(refreshed)) { stock.clearLocalCache(); // 单键刷新未命中时整块清空 }什么时候别用它提交率高且键多时别用每次 commit 都追加补偿请求提交 RT 会被明显抬上去。路径三值内嵌版本号改造数据模型适用边界写并发极高、正确性优先、能接受值结构变更与乐观重试。把值组织成剩余:版本形式写入时比较并交换旧值版本已变就重试保证更新不会被静默覆盖。// 值布局 剩余:版本例如 12:7 String key ACT-618; RLocalCachedMapString, String stock redisson.getLocalCachedMap(coupon:stock); while (true) { String raw stock.get(key); if (raw null) { throw new IllegalStateException(券库存未初始化); } String[] parts raw.split(:); int remaining Integer.parseInt(parts[0]); long version Long.parseLong(parts[1]); if (remaining 0) { throw new CouponExhaustedException(key); } // 比较并交换旧值未变才替换否则重试 if (stock.replace(key, raw, (remaining - 1) : (version 1))) { return; } }什么时候别用它多字段联动更新、或值本身无法自然版本化时别用它重试循环会迅速复杂化且吞吐下降。选型速查路径一致性上限吞吐影响改造成本建议场景UPDATE 提交回调高窗口内框架收敛中完整键值广播低改选项加回调多节点读为主、写较稀疏提交后显式刷新中单点补偿略升逐提交追加请求低业务代码局部改键少、写频率低值内嵌版本号最高写入级正确最低重试串行化中改模型和写链路写并发极高、强正确上线前验证清单✅ 构造并发测试环境起 4 个进程共享同一 map key2 个跑事务写循环、2 个持续读并记录本地与主节点的差值✅ 测窗口每次 commit 后以 100ms 间隔采样本地值记录差值归零耗时对比INVALIDATE与UPDATE的收敛曲线✅ 验刷新显式刷新路径提交后立即读本地值断言与主节点一致✅ 验版本双线程并发替换同一 key断言最终版本增量等于提交总数确认无丢失更新✅ 盯指标缓存命中率、广播消息量、提交 RT p99发布后观察一个完整核销高峰一句话结论事务提交与缓存收敛之间的窗口是物理约束三条路径只是在这个窗口上做出的不同取舍——先测出窗口再决定站在哪一层。进阶阅读事务参数选项与隔离级别客户端侧缓存原生实现Map 本地缓存与数据分区【免费下载链接】redissonRedisson: Valkey Redis Java Client and Real-Time Data Platform. Sync/Async/RxJava/Reactive API. Over 50 Valkey and Redis based Java objects and services: Set, Multimap, SortedSet, Map, List, Queue, Deque, Semaphore, Lock, AtomicLong, Map Reduce, Bloom filter, Spring, Tomcat, Scheduler, JCache API, Hibernate, RPC, local cache..项目地址: https://gitcode.com/GitHub_Trending/re/redisson创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表