java面试场景题:电商平台中订单未⽀付过期如何实现⾃动关单
以下是润色后的文章版本,内容更紧凑且逻辑清晰:
大规模Redis数据统计的四种高效方法
聚合统计
Redis集合适用于需要交并差计算的场景。例如社交系统中计算共同好友(交集)、新增好友(差集)或总好友数(并集)。使用SINTERSTORE
、SDIFFSTORE
、SUNIONSTORE
命令时需注意:
- 数据量过大可能阻塞Redis,建议在从库执行或客户端计算
- 集群环境下避免主库性能影响
SINTERSTORE user:common user:100 user:200 # 计算用户100和200的共同好友
排序统计
有序集合适合动态排序场景如商品评论:
- List:按插入顺序排序,适合简单分页
- Sorted Set:按权重排序(如时间戳),灵活性更高
ZADD product:comments 1620000000 "好评" # 权重为时间戳
ZRANGE product:comments 0 10 # 获取最新10条评论
二值状态统计
签到等0/1状态场景推荐Bitmap:
- 单用户月签到仅需12MB(1亿用户)
- 支持位运算统计连续签到
SETBIT user:checkin:202311 0 1 # 第1天签到
BITCOUNT user:checkin:202311 # 统计当月签到次数
BITOP AND continuous_20 day1 day2... # 计算20天连续签到
基数统计
UV统计等去重场景的优化方案:
- Set:精确但内存消耗大
- HyperLogLog:误差0.81%,仅需12KB/10^8数据
PFADD page:uv user1 user2 # 记录UV
PFCOUNT page:uv # 统计UV数
订单自动关单的三种实现方案
定时任务扫描
优点:实现简单
缺点:存在时间延迟,数据库压力随数据量增长
适用场景:中小规模业务
JDK延迟队列
优点:无外部依赖
缺点:JVM内存限制,重启丢数据
适用场景:非关键性延迟任务
Redis过期监听
优点:实时性高
缺点:需处理消息丢失情况
适用场景:分布式环境
关键对比总结
统计类型 | 适用数据结构 | 优势 |
---|---|---|
聚合运算 | Set | 原生支持交并差 |
动态排序 | Sorted Set | 灵活权重排序 |
二值状态 | Bitmap | 极致内存优化 |
大数据去重 | HyperLogLog | 低内存消耗 |