网上购物看到自己喜欢的东西加入购物车然后付款,但是在付款的突然不想要了 … 往往这个订单会给一个30分钟的支付时间,时间一到就自动关闭了 所以这是怎么做到的呢?
1.实现方式
- 轮询
1
脚本每隔一定时间就去数据表检查一下状态,是否过期需要关闭。
- 定时器
1
创建订单时开始计时,计时结束后直接处理关闭订单。
- 数据库事件+存储过程
1
数据库建立检查事件,每隔一定时间去执行一次存储过程。
- Key事件通知
1
对于更改任何Redis Key的每个操作,都可以配置Redis将消息发布到Pub/Sub,然后订阅这些通知。
2.数据库事件+存储过程
不多说,直接上SQL
订单表
1
2
3
4
5
6
7CREATE TABLE `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`good_id` int(11) NOT NULL,
`status` tinyint(1) NOT NULL COMMENT '0:待付款,1:已付款,-1:订单关闭',
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = Compact;创建存储过程,处理关闭订单。
1
2
3
4CREATE PROCEDURE job_proce()
BEGIN
update orders set status = -1 where time_to_sec(timediff(now(), created_at)) > 1800 and status = 0;
END创建事件,调用存储过程。
1
2
3
4
5
6SET GLOBAL event_scheduler = 1;
CREATE EVENT IF NOT EXISTS job_event
ON SCHEDULE EVERY 1 SECOND # 1秒检查一次
ON COMPLETION PRESERVE
DO CALL job_proce();开启事件。
1
ALTER EVENT job_event ON COMPLETION PRESERVE ENABLE;
这样
job_event
事件就会以1秒/次的频率去执行job_proce
存储过程执行数据检查。
3. Key事件通知
Key事件通知(Redis Keyspace Notifications)机制自2.8版本以后出现,该机制默认是关闭的。可通过配置redis.conf
进行开启
1 | notify-keyspace-events Ex # E表示Key事件通知,x代表Key过期行为。 |
修改配置开启Key事件通知以后,当Redis在删除过期Key的时候会向指定channel(过期行为的channel:__keyevent@0__:expired
) publish消息,该消息可以使用subscribe/psubscribe进行订阅。
1 | 127.0.0.1:6379> PSUBSCRIBE __keyevent@0__:expired |
所以我们只需要写个程序执行redis->psubscribe()进行监听即可。
最后
emmmm…