有一些场景需要用到延迟操作,比如订单未支付取消,订单成交几天后默认好评等等。如果没有专业的消息队列延迟消息服务如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/