它主要是用了redis的发布订阅机制,redis的notify-keyspace-events 会自动发布一个频道,频道的名称有固定的格式,这里我们监听键的失效事件,的订阅频道名是 __keyevent@0__:expired,订阅了这个频道,当redis的 第0号数据库中有键名失效时,就会收到一个推送,我们就利用这个特点来完成功能!
我们找到 redis的配置文件, 修改配置!
配置:这果在 redis.conf中 设置监听,键的失效事件 notify-keyspace-events Ex
配置好后,重启redis的服务端
首先, 我们存入一个带过期时间的key;10后过期
1 2 3 4 5 6 7 8 9 10 11 |
<?php /** * Created by PhpStorm. * User: iyahe@qq.com (天明) * Date: 2019/9/11 0011 * Time: 下午 17:52 */ $redis = new \redis(); $redis->connect("127.0.0.1",6379); $redis->setex("order_420682198105122517",10,"xxx"); print_r($redis->get('order_420682198105122517')); |
然后, 启动一个监听
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
<?php /** * Created by PhpStorm. * User: iyahe@qq.com (天明) * Date: 2018/12/17 0017 * Time: 下午 13:39 */ //这一句是说长连接不超时,如果没有的话,这个文件会在运行一段时间后自动停止,一定不能少 ini_set('default_socket_timeout', -1); $redis = new \Redis(); $redis->connect("127.0.0.1", 6379); $redis->subscribe(["__keyevent@0__:expired"], function ($redis, $event, $key) { var_dump($redis, $event, $key); }); |
这里只是大至代码,在 function($redis,$event,$key)的函数体中,就可以写上订单作废的逻辑,还有返还库存的逻辑,$redis,$event,$key是 phpredis自动会给我们加上的参数,
$redis 是一个redis对象,
$event 是事件的名称,也就是 __keyevent@0__:expired,
$key 就是失效的键的名称,们就可以用它来做逻辑操作了
等待 10s 之后,
object(Redis)#1 (0) {}
string(22) “__keyevent@0__:expired”
string(24) “order_420682198105122517”
string(24) “order_420682198105122517”
收到了数据, 这样我们可以用这种方法来处理一些特殊的数据,比如订单超时提醒,等待~~