通过 Redis 定时执行脚本

方法一

之前我在简书上写过 通过监听redis的key失效事件,来定时进行业务逻辑操作。具体我这不在重复说明了-传送门

方法二

第一种方式由于很吃Redis的稳定性,万一Redis的服务可不用那么,将有一部分的数据丢失,所以改进一下Redis使用方式-有序集合。

  1. 加入队列
    const LISTEN_REDIS_NAME = 'eeop:axb:bind_log';//定时解绑做判断处理
    const AUTO_TIMEOUT = 60;//自动解绑60s
    //加入队列 有序队列
    $this->redis::zadd(self::LISTEN_REDIS_NAME, time() + self::AUTO_TIMEOUT, $this->bind_id);

    2.解绑服务

    $list = $this->redis::ZRANGEBYSCORE(self::LISTEN_REDIS_NAME,0,time());
    foreach ($list as $value){
        $this->redis::zrem(self::LISTEN_REDIS_NAME, $value);
    }

    PS:之后要是数据量大的话 可以通过集群的方式的进行稳定扩容

本作品采用《CC 协议》,转载必须注明作者和本文链接
快乐就是解决一个又一个的问题!
CrazyZard
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
讨论数量: 8
绝缘体菜狗

:see_no_evil:为啥不用队列哦,队列才是干这事的。不担心多个 worker 一起处理同一条数据吗?如果只有一个 worker 的情况,确定 60 秒内能搞完吗。

4年前 评论
CrazyZard

@一穷二白 如果用队列 如何保证先把优先级高的数据先执行???这个是类似定时脚本 不是及时消费的逻辑

4年前 评论
绝缘体菜狗 4年前
CrazyZard (作者) (楼主) 4年前
CrazyZard

@lovecn 我好像 我也打不开了

4年前 评论
颠倒的玉石

方法二需要不停的查redis是否到了某个时间节点,这样会不会更浪费资源呢

4年前 评论
CrazyZard

@颠倒的玉石 任何一个功能都是要根据业务逻辑来的 ,这个方法其实已经很节省资源了!

4年前 评论

实现优先级我自己用的是:延迟队列+业务控制,举例:下单生成订单A,加入延迟队列10分钟后自动取消,1分钟的时候促发支付流程,订单数据写入延迟时间+30分钟,队列执行时判断当前时间和订单的延迟时间是否吻合,推迟了则重新加入延迟队列即可。

4年前 评论
CrazyZard

@ab0029 其他都是好的 但是你每次取的时候 都是要判断系统判断一遍,然后在重新加入队列,但是肯定没有redis有序队列的快,直接少了网络开销

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!