php-redis监听-key失效并触发事件(解决订单超时,定时器)键空间通知,附php代码
拿订单超时来举例:
需求:下单之后三十分钟之后订单超时,释放商品,订单取消,和扣除积分。
下单时设置用expire命令设置key的过期时间,使用发布订阅,可以接收到key的过期提醒,当key过期时触发事件,处理业务逻辑。
所用:
1.Redis Expire 命令用于设置 key 的过期时间。
注意:这里需要配置 notify-keyspace-events 的参数为 “Ex”,并重启服务。
查询配置命令:CONFIG GET notify-keyspace-events
设置命令:CONFIG SET notify-keyspace-events Ex
2.Redis Psubscribe 订阅一个或多个符合给定模式的频道。
监听:psubscribe __keyevent@0__:expired
键空间通知使得客户端可以通过订阅频道或模式
另开启个 redis 客户端
设置key,并设置过期时间:setEx redis 1 1
收到过期通知消息:
3.thinkphp的命令行模式
实行redis的监听 :php think redis
以下是为代码文件:
command/Redis.php:
class Redis extends Command
{
protected function configure()
{
$this->setName('redis')
->setDescription('redis');
}
protected function execute(Input $input, Output $output)
{
ini_set('default_socket_timeout', -1);
$config = config("redis.");
$redis = new \Redis();
$redis->connect($config['host'],$config['port']);
$redis->auth($config['password']);
$redis->psubscribe(["__keyevent@0__:expired"], function($rediss, $pattern, $chan, $msg) use($config) {
try {
//处理业务逻辑
} catch (\Exception $e) {
}
});
}
}
RedisService.php
class RedisService
{
///设置rediskey
public function setRedisKey($config,$key,$value,$outtime){
$redis = new \Redis();
$redis->connect($config['host'],$config['port']);
$redis->auth($config['password']);
$redis->set($key,$value,$outtime);
return $redis;
}
删除rediskey
public function delRedisKey($config,$key){
$redis2 = new \Redis();
$redis2->connect($config['host'],$config['port']);
$redis2->auth($config['password']);//登录验证密码,返回【true | false】
$res = $redis2 -> del($key);
return $res;
}
}
调用:
app('RedisService')->setRedisKey(config("redis."), 'key','value', 10);
app('RedisService')->delRedisKey(config("redis."), 'key');