ZSET在订单支付与统计中的应用

本文探讨了支付业务中的两大场景:延迟支付与支付成功率及耗时统计。通过运用Redis的ZSET数据结构,有效地解决了高铁票延迟支付的座位占用及支付渠道的异常监测问题,展示了ZSET在时间敏感型数据处理上的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景1 延迟支付

在购买高铁票时,用户下单会有一个30min内支付都有效的情景,如果超过30min未支付或主动取消,会释放占座信息

解决方案:使用ZSET保存下单信息,订单号作为key,下单unix时间戳作为score

1 可以方便获取订单下单时间,计算还剩多少有效支付时间

2 用户在30min内支付或主动取消订单,可以快速移除订单

3 释放占座定时任务,只需获取zset中的第一条记录,即最早时间下单数据,如果该记录未超时支付,剩下的订单必然未超时

场景2 支付成功率及支付耗时统计

在支付业务中需要统计某一渠道在一段时间内的支付成功率和支付耗时,便于监测支付渠道是否出现异常,及时做应对策略

解决方案:使用ZSET保存下单信息,订单号作为key,unix时间戳作为score

实现步骤(这里设定一个渠道只尝试支付一次,不考虑重试支付的情况):

1 记录数据:使用两个ZSET记录数据,A记录订单申请支付时间,B记录订单支付成功时间(由于会有支付失败的情况,A中的订单,可能不会出现在B中)。使用到的命令ZADD

2 筛选数据:筛选出一段时间内,A和B中的订单集合a和b。具体筛选策略是,找到要查找时间区间(score值)(x,y)的邻近区间(x-1,y+1),将x-1和y+1插入A中,根据score取出中间的数据,即要找的数据(最后需要从订单集合中移除x-1和y+1,避免对订单数据有污染)。使用到的命令ZADD,ZRANGEBYSCORE,ZREM

3 处理边界数据:由于支付耗时,同一订单B中的score必然大于A中的,存在时间延迟,所以需要处理这部分订单数据。分两种情况处理:a有的而b没有的(时间片段结尾尝试支付的订单),需要尝试从B中get,并放入b;b有的而a没有的(时间片段开始前尝试支付的订单),需要从b中移除。使用到的命令ZSCORE,ZADD,ZREM,,ZINTERSTORE,ZRANK,ZREMRANGEBYRANK

4 订单计数统计支付成功率。使用到的命令ZCARD

5 找出a和b的交集,即求出成功支付的订单,计算订单耗时(这里需要注意求交集/并集时使用SUM策略的权重)。使用到的命令ZINTERSTORE,ZUNIONSTORE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值