热点账户问题
乐观锁
账户数据使用版本号,保证数据变更不出现覆盖情况
数据更新
我们把热点账户按照金额变动方向分为加频账户(余额增加频繁)、减频账户(余额扣减频繁)、双频账户(余额增加扣减均频繁)。
- 加频账户处理
准实时更新余额。先将金额变动插入临时表中,由定时任务按照一定频率汇总发生额,并更新账户余额,而后删除临时记录。当加频账户减钱余额不足时,主动去汇总发生额。这里需要考虑主动汇总发生额和定时任务处理的并发情况,我们在该定时任务执行时设置 redis 锁,防止并发,主动汇总时会去判断这个 redis 锁是否存在,如存在证明定时任务正在执行,无需主动汇总,可能是真的余额不足。主动汇总同样会设置 redis 锁,定时任务同样会判断。
- 减频账户处理
将减频账户拆分多个子账户,减频子账户设置金额报警,如果某个减频子账户余额不足触发报警,会对该子账户做资金归集,将其他子账户余额归集到该子账户(每个子账户设置可归集金额限制)。如在交易过程中发现该子账户余额不足,转向使用其他子账户记账。由于拆分子账户,余额查询时需要汇总各个子账户余额返回;记录主账户流水需要记账后余额,这里需要异步计算汇总。当减频账户加钱时,需要平均分配入账到不通的子账户。
- 双频账户处理
将双频账户拆分多个子账户。加钱时,准实时更新余额,先将子账户金额变动插入临
数据缓存
通过异步任务动态统计热点数据
- 访问量统计区间,通过统计一定内的访问数据量决定是否为热点数据
- 数据失效时间,缓存的数据设置失效时间,每次访问后都更新缓存的失效时间,一定时间之后缓存未访问,缓存数据主动失效
Simple is Awesome