网上购物看到自己喜欢的东西加入购物车然后付款,但是在付款的突然不想要了 … 往往这个订单会给一个30分钟的支付时间,时间一到就自动关闭了 所以这是怎么做到的呢?
1.实现方式
- 轮询
1
脚本每隔一定时间就去数据表检查一下状态,是否过期需要关闭。
- 定时器
1
创建订单时开始计时,计时结束后直接处理关闭订单。
- 数据库事件+存储过程
1
数据库建立检查事件,每隔一定时间去执行一次存储过程。
- Key事件通知
1
对于更改任何Redis Key的每个操作,都可以配置Redis将消息发布到Pub/Sub,然后订阅这些通知。
2.数据库事件+存储过程
不多说,直接上SQL
- 订单表
1 | CREATE TABLE `orders` ( |
- 创建存储过程,处理关闭订单。
1 | CREATE PROCEDURE job_proce() |
- 创建事件,调用存储过程。
1 | SET GLOBAL event_scheduler = 1; |
- 开启事件。
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…