计分翻倍:常见于榜单类的直播送礼活动中;含义为赠送特定高额礼物后一段时间窗口内,对榜单的新增分数,按比例加倍计分。加倍时期多次赠送特定礼物,加倍窗口会追加时长。
设计难点:对加倍状态的一致性时序处理。
方案对比
方案一、分布式加锁,保证加倍状态的修改过程串行化处理。
优点:逻辑简单
缺点:性能不足
方案二、编写lua脚本,将判断加倍、更新加倍的处理,编写到lua,交由redis执行
优点:性能优异,拥有足够的原子性
缺点:需要编写lua脚本,编码、调试、扩展难度较高
方案三、不处理并发场景,纯读取、写入redis
优点:逻辑简单
缺点:瞬时多次特定送礼,会丢失加倍次数
方案四、redis ZSet 存储加倍事件,遍历回放判断当前加倍
1、处理特定礼物时,追加写入加倍事件:
2、判断加倍时,回放之前的加倍事件,幂等计算出当前是否加倍,并尝试清除过期加倍事件:
优点:只使用基本的redis结构、命令;写操作与读操作完全隔离开,无需处理原子读写;较及时地清除了过期加倍事件,保证了redis数据量不会过大。
缺点:比较反直觉