Redis Keyspace Notifications

一、Redis介绍

最近在做到项目的时候需要一个难题,因为用户需要建立一个量级的计时器用于功能使用。可是通过Linux系统的Crontab达到的效果不佳不适合长期使用。

举个列子证明一下,比如1个用户建立1个定时任务。那我2个用户建立2个,要是1000个用户那就要建立1000个定时任务。这样子Crontab就不可能做到或者说不应该这么去做,会消耗浪费大量的资源。于是乎我只能找寻其他的方法来解决这个问题。我想到了redis的key可以限定时间消失。so在消失的时候能否回调消息以方便进行处理。

然后我去redis官网找有没有这些方面的功能或者插件。所以最终找到了redis>2.8.0版本,推出的一个新的特性--键值空间消息,也就是Redis Keyspace Notifications。

二、Redis Keyspace Notifications介绍

这个究竟是什么东西呢,比如Redis里面有一些事件的发生。就好比如键值到期,键值删除。然后可以配置一些东西好让我们知道Redis一旦触发某些特定的事件返回给我们这些消息。

所以我们的流程呢就是给Redis的db设置过期事件回调,然后我这边写回调通知后的消费逻辑就好了。

三、如何使用

默认情况下键值空间通知功能默认是处于关闭状态下的,所以你需要打开。

打开有两种方式,比如

1.是通过修改redis.conf文件
2.使用CONFIG SET命令还开启功能

notify-keyspace-events可以与任意表中字符组合,指定了服务器应该发送哪些类型的通知
![1583227939583.jpg][1]

输入的参数中至少要有一个K或者E,否则的话,不管其余的参数是什么 都不会有任何通知被分发。将参数设为字符串 "AKE" 表示发送所有类型的通知。监听过期事件需要设置Redis 配置文件notify-keyspace-events "Ex"

四、代码中使用

$ redis-cli config set notify-keyspace-events KEA//先设置打开回调通知

监听器psubscribe.php


<?php
/**
* Created by PhpStorm.
* Author: ctexthuang
* Date: 2019/9/6
* Time: 11:21 上午
* FileName: psubscribe.php
*
*
*      ┌─┐       ┌─┐
*   ┌──┘ ┴───────┘ ┴──┐
*   │                 │
*   │       ───       │
*   │   >        <    │
*   │                 │
*   │   ...  ⌒  ...   │
*   │                 │
*   └───┐         ┌───┘
*       │         │
*       │         │
*       │         │
*       │         └──────────────┐
*       │                        │
*       │                        ├─┐
*       │                        ┌─┘
*       │                        │
*       └─┐  ┐  ┌───────┬──┐  ┌──┘
*         │ ─┤ ─┤       │ ─┤ ─┤
*         └──┴──┘       └──┴──┘
*                神兽保佑
*               代码无BUG!
*/
class Redisv{
private $redis;
//redis connect function
public function __construct($host = '127.0.0.1',$port = 6379,$password = 545593){
    $this->redis = new Redis();
    $this->redis->connect($host,$port,$password);
}

//To subscribe to function
public function psubscribe($patterns = array(), $callback)
{
    $this->redis->psubscribe($patterns, $callback);
}

//Detection timeout function
public function setOption()
{
    $this->redis->setOption(\Redis::OPT_READ_TIMEOUT, -1);
}

}
//require_once './Redis.class.php';
$redis = new \Redisv();
// 解决Redis客户端订阅时候超时情况
$redis->setOption();
$redis->psubscribe(array('__keyevent@0__:expired'), 'keyCallback');
// 回调函数,这里写处理逻辑
function keyCallback($redis, $pattern, $chan, $msg)
{
echo "Pattern: $pattern\n";
echo "Channel: $chan\n";
echo "Payload: $msg\n\n";
}



<!--more-->

本文为ctexthuang原创文章,转载请注明来自[ctexthuang_blog][2] 


  [1]: https://qncdn.ctexthuang.com/2020/03/2001208272.jpg
  [2]: https://ctexthuang.com
tag(s): none
show comments · back · home
Edit with markdown
召唤看板娘