下单后半小时未付款订单自动取消的实现,延迟队列

类似的需要:
订单的评论如果7天未评价,系统需要自动产生一条评论
订单的15天之后未点击收货,系统需要自动更改为已收货。
。。。

因为是需要一个常驻进程来检查的,我们使用redis存储会更好。

延迟队列
就是需要延迟一段时间后执行。Redis可通过zset来实现。我们可以将有序集合的value 设置为我们的消息任务(orderId),把value的score设置为消息的到期时间,然后轮询获取有序集合的中的到期消息进行处理。

ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。原始返回值:1) "jack"2) "2500"3) "tom"4) "5000"5) "peter"6) "12000"$redis->zrangebyscore返回值:array | null[value1 => score1, value2 => score2]

代码:

<?phpclass RedisCli {protected static $redis;public static function getRedisInstance($conf){if(isset(self::$redis)){return self::$redis;}try{$redis = new \Redis();$re = $redis->connect($conf['host'], $conf['port']);if(!$re){throw new \Exception('connect redis error');}if(isset($conf['auth'])){$re = $redis->auth($conf['auth']);if(!$re){throw new \Exception('redis auth error');}}self::$redis = $redis;return $redis;}catch(\Exception $e){throw new \Exception($e->getMessage());}}public static function addOrder($redis, $key, $orderId){$ttl = time() - 600;$re = $redis->zadd($key, $ttl, $orderId);return $re;} public static function getOrders($redis, $key, $num = 1){/*array(1) {[3334]=>float(1573703310)}*/$orders = $redis->zrangebyscore($key, 0, time(), ['limit'=>[0, $num], 'withscores'=>TRUE]);if(!$orders){return [];}// 移除元素foreach($orders as $k => $v){$redis->zrem($key, $k);}return $orders;}public static function getAndDeleteOrder($redis, $key, $num = 1){$script = " local score= redis.call('ZRANGEBYSCORE', KEYS[1], ARGV[1], ARGV[2], 'WITHSCORES' , 'LIMIT' , ARGV[3] , ARGV[4])if score ~= false and #score ~= 0 thenlocal i = 1while i <= #score doredis.call('ZREM', KEYS[1] , score[i])i=i+2endendreturn score";$result = $redis->eval($script, [$key, 0, time(), 0, $num], 1);/*$redis->eval的返回结果:array(4) {[0]=>string(4) "3334"[1]=>string(10) "1573701647"[2]=>string(4) "3333"[3]=>string(10) "1573702072"}*/$return = [];$count = count($result);if($count > 0){for($i = 0; $i < $count; $i+=2){$return[$result[$i]] = $result[$i + 1];}}/*array(1) {[3334]=>string(10) "1573702856"}*/return $return;}
}$conf = ['host'=>'127.0.0.1', 'port'=>6379, 'auth'=>'123456'];
$redis = RedisCli::getRedisInstance($conf);
$key = 'orderkey';
$orderId = 3334;// 添加
RedisCli::addOrder($redis, $key, $orderId);// 消费,由于可能存在多进程的并发,使用Lua优化版,
while(true){try{// $data = RedisCli::getOrders($redis, $key);$data = RedisCli::getAndDeleteOrder($redis, $key);if(empty($data)){sleep(1);}else{var_dump($data);}}catch(\Exception $e){}
}

下单后半小时未付款订单自动取消的实现,延迟队列相关推荐

  1. Java 中Timer定时器设置订单提交后24小时未付款订单状态为已关闭。

    1. 简单的Timer定时器方法 public class CommTimer {/*** 设置指定24小时后执行*/public static void orderClose() {final Ti ...

  2. 三小时未付款自动取消订单实现

    电商系统中,有这样的需求,用户下单三小时未支付就自动取消,具体如何实现的呢? 一.实现方案 通常实现方案有以下方式: 方式一 使用定时任务不断轮询取消,此种方式实现简单,但是存在一个问题,定时任务设置 ...

  3. Springboot使用DelayQueue实现订单自动取消

    DelayQueue小结 DelayQueue是一个有序的无界BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象在到期时才能从队列中取走. DelayQueue只能添加实现 ...

  4. 未付款订单占用库存的MQ实现方案

    用户下完订单到支付完成期间,需要锁定库存防止超卖,如何不依赖数据库,实现较高负载呢? 常见的方案是频繁的读取数据库中的订单,统计总库存占用,检查是否付款超时.如果系统的负载量较高,这种方案很快将数据库 ...

  5. Java 实现订单未支付超时自动取消

    在电商上购买商品后,如果在下单而又没有支付的情况下,一般提示30分钟完成支付,否则订单自动.比如在京东下单为完成支付: 超过24小时,就会自动取消订单,下面使用 Java 定时器实现超时取消订单功能. ...

  6. 淘宝怎么多个订单一起付款_淘宝未付款订单如何催付?

    淘宝未付款订单如何催付? 很多人只认为运营就是技巧,其实客服也是需要技巧的,客服也是关键的数据支撑. 一个好的客服团队,能够很好地提高转化率.客单价.复购率,有效的降低退款率.纠纷等售后问题. 今天和 ...

  7. 如何实现生成订单30分钟内未支付则自动取消?

    如何实现生成订单30分钟内未支付则自动取消? 数据库轮询 JDK的延迟队列 Quartz 时间轮算法 使用消息队列 数据库轮询 不是很推荐的一种方式,需要定时扫描数据库,借助定时任务工具,如果是多服务 ...

  8. 【项目实战】Redis使用场景之待支付订单自动取消、订单自动收货

    一.使用背景 很多业务场景,例如订单过期自动删除,订单几天后自动好评,这些常用操作可以通过定时任务,数据库轮询做,但是订单量大的情况可能会对数据库产生大的压力. 二.Redis的key过期推送功能原理 ...

  9. SAP 生产订单工序外协对应的工序报工后,对应的采购订单自动入库

    对于工序外协的采购订单,一般不会涉及到库存管理,收货也只是一笔费用,然而对于工序外协的采购订单收货后,一般都需要质检.质检会对合格数量进行确认.我们比较理想的情况就是确认合格数量的时候其对应的采购订单 ...

最新文章

  1. HTML5标签学习之~~~
  2. mysql题目(二学年)
  3. (十四)访问标志 Access_flags
  4. DataScience:风控场景之金融评分卡模型的构建(逻辑回归)开发(转评分卡)、使用过程(线上实现)之详细攻略
  5. [云炬创业基础笔记]第一章创业环境测试3
  6. 简约风车壁纸自动采集小程序源码
  7. MTK 驱动 (70)---MTK Projiectconfig.mk文件详细解释
  8. Ubuntu16.04 Jupyter安装(Ipython Notebook安装)
  9. java rome,ROME - RSS聚合类库 - 组件类库 - JAVA开源项目 - 开源吧
  10. IE DOM中Frame的使用
  11. Perl语言入门(13 perl调试程序)
  12. 计算机服务器硬件组成
  13. PHP写评论模块,uchome2.0 日志评论模块分析(php代码及js代码分析)
  14. 将TIF图像格式转化为PNG或者JPG格式
  15. 什么是PLC的响应时间
  16. (端到端多尺度去雾算法)FAMED-Net: A Fast and Accurate Multi-scale End-to-end Dehazing Network
  17. Android获取CPU使用率的几种方式
  18. 双十一淘宝美妆消费数据分析
  19. 服务器项目命名规则,云服务器命名规范
  20. hadoop 不能加载native-hadoop library问题

热门文章

  1. form表单数字校验(二)——邮箱校验-当前页面
  2. "尼斯湖怪"是大象?英学者称揭开谜团
  3. MSCRM 2011 操作大全
  4. Windows环境下利用FreeNAS组建IP-SAN
  5. 新库上线 | CnOpenData欧洲专利局专利数据
  6. winedt常用快捷键 修改快捷键latex编译按钮
  7. 如何计算计算机的主机地址,子网掩码的主机地址是如何计算的
  8. 中国移动力撑国产5G手机,恐怕也难助它们击败苹果
  9. vmware安装centos将home磁盘合并至root下
  10. 程序问题解决思路及其Python“温度转换”实例思考