有一些场景需要用到延迟操作,比如订单未支付取消,订单成交几天后默认好评等等。如果没有专业的消息队列延迟消息服务如RabbitMQ、ActiveMQ,可以利用监控redis的key失效进行回调操作,再结合crontab定时操作作为补充即可实现。

优点:实现简单,实时性较高。但是redis也有丢数据或者服务宕机的风险,所以需要配合crontab定时操作作为补充方案。

了解keyspace事件通知

Keyspace事件通知允许客户端通过订阅Pub/Sub通道的方式,以便接收以某种方式影响Redis数据集的事件。实现了实时监控redis的键和值的变化。

1.开启redis的keyspace的事件通知

修改redis.conf

notify-keyspace-events Ex

2.重启redis-server

3.客户端订阅相应的事件通知

127.0.0.1:6379> PSUBSCRIBE keyevent@*:expired

4.php客户端订阅相应的事件通知示例

$redis->psubscribe(array('keyevent@0:expired'), 'callback');

// 回调函数,这里写处理逻辑 function callback($redis, $pattern, $chan, $msg){}

参考: 实时监控redis的键和值的变化 https://redis.io/docs/manual/keyspace-notifications/