当前位置:   article > 正文

ZSET在订单支付与统计中的应用_zset根据查找第一条记录

zset根据查找第一条记录

转载自:https://blog.csdn.net/jwq201288888888/article/details/86323133

场景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
--------------------- 
作者:Burn 
来源:CSDN 
原文:https://blog.csdn.net/jwq201288888888/article/details/86323133 
版权声明:本文为博主原创文章,转载请附上博文链接!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/201012
推荐阅读
相关标签
  

闽ICP备14008679号