通过 Redis 定时执行脚本
方法一
之前我在简书上写过 通过监听redis的key失效事件,来定时进行业务逻辑操作。具体我这不在重复说明了-传送门。
方法二
第一种方式由于很吃Redis的稳定性,万一Redis的服务可不用那么,将有一部分的数据丢失,所以改进一下Redis使用方式-有序集合。
- 加入队列
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 协议》,转载必须注明作者和本文链接
为什么你的几篇文章 都看不了,搬到这里吧
https://www.jianshu.com/p/51674ad04469
https://www.jianshu.com/p/b7a93724a996
:see_no_evil:为啥不用队列哦,队列才是干这事的。不担心多个 worker 一起处理同一条数据吗?如果只有一个 worker 的情况,确定 60 秒内能搞完吗。
@一穷二白 如果用队列 如何保证先把优先级高的数据先执行???这个是类似定时脚本 不是及时消费的逻辑
@lovecn 我好像 我也打不开了
方法二需要不停的查redis是否到了某个时间节点,这样会不会更浪费资源呢
@颠倒的玉石 任何一个功能都是要根据业务逻辑来的 ,这个方法其实已经很节省资源了!
实现优先级我自己用的是:延迟队列+业务控制,举例:下单生成订单A,加入延迟队列10分钟后自动取消,1分钟的时候促发支付流程,订单数据写入延迟时间+30分钟,队列执行时判断当前时间和订单的延迟时间是否吻合,推迟了则重新加入延迟队列即可。
@ab0029 其他都是好的 但是你每次取的时候 都是要判断系统判断一遍,然后在重新加入队列,但是肯定没有redis有序队列的快,直接少了网络开销