zoukankan      html  css  js  c++  java
  • redis键空间通知(keyspace notification)

    一.需求

    在redis中,设置好key和生存时间之后,希望key过期被删除时能够及时的发送一个通知告诉我key,以便我做后续的一些操作.

    二.环境

    系统:windows10  php:7.1  redis:3.2

    三.redis

    键空间通知: redis官方文档 、redis中文文档

    redis2.8.0版本之后推出了键空间通知,如何使用呢?当redis的key被删除时,redis会发送两种不同类型的事件,特定的事件会往特定的频道发送通知,我们只要订阅这个特定的频道等待通知即可.

    两种事件通知:

    PUBLISH __keyspace@0__:mykey del
    PUBLISH __keyevent@0__:del mykey

    keyspace为前缀的频道被称为键空间通知(key-space notification),订阅这个频道 __keyspace@0__:mykey,可以接收0号数据库中所有修改键 mykey 的事件,订阅者将接收到被执行的事件的名字,就是 del;

    而以keyevent为前缀的频道则称为键事件通知(key-event notification),订阅这个频道 __keyevent@0__:del,则可以接收0号数据库中所有执行 del 命令的键,订阅者将接收到被执行事件的键的名字,就是 mykey

    我需要获取key 的名字,所以需要订阅__keyevent@0__:频道.

    四.实现步骤

    (1) 打开redis配置文件redis.conf,找到notify-keyspace-events 将其设为Ex,E代表键事件通知,x代表过期事件,每当有过期键被删除时发送,然后重启redis使配置生效;

    (2) 创建demo.php文件:

     1 <?php 
     2 
     3 class RedisInstance
     4 {
     5     private $redis;
     6 
     7     public function __construct($host = '127.0.0.1', $port = 6379)
     8     {
     9         $this->redis = new Redis();
    10         $this->redis->connect($host, $port);
    11     }
    12 
    13     public function expire($key = null, $time = 0)
    14     {
    15         return $this->redis->expire($key, $time);
    16     }
    17 
    18     public function psubscribe($patterns = array(), $callback)
    19     {
    20         $this->redis->psubscribe($patterns, $callback);
    21     }
    22 
    23     public function setOption()
    24     {
    25         $this->redis->setOption(Redis::OPT_READ_TIMEOUT,-1);
    26     }
    27 
    28 }
    29 
    30  echo "程序开始执行..
    ";
    31 $redis = new RedisInstance();
    32 $redis->setOption();
    33 $redis->psubscribe(array('__keyevent@0__:expired'), 'callback');
    34 //回调
    35 function callback($redis, $pattern, $chan, $msg)
    36 {
    37     echo "$pattern
    ";
    38     echo "$chan
    ";
    39     echo "$msg
    ";
    40       /*业务逻辑*/
    41 }
    View Code

    (3) 使用php运行demo.php文件,首先你的php是否设置环境变量,设置方法:找到我的电脑右键选择属性—高级系统设置—环境变量—找到path变量编辑/没有path变量的可以新建一个—将你的php.exe的绝对路径放进去保存即可,之后就可以直接使用php命令了,其次必须开启了redis拓展,查看是否装有redis拓展:

    php -m

    确认已安装拓展,直接运行文件:

    php demo.php

    (4) 打开一个redis客户端,即运行redis-cli.exe文件或者使用命令 redis-cli.exe -p 6379,创建一个key,并将过期时间设置在五秒,然后观察运行demo.php的窗口:

    五秒之后key过期被删除,php接收通知走进回调方法,这里就可以处理业务逻辑了.

    五.测试通知时效性:

    写一个脚本循环往redis中插入50条记录,且每条记录的过期时间在五秒和十秒随机产生,观察接收到的通知状态:

    注意:redis 使用以下两种方式删除过期的键:

    • 当一个键被访问时,程序会对这个键进行检查,如果键已经过期,那么该键将被删除。
    • 底层系统会在后台渐进地查找并删除那些过期的键,从而处理那些已经过期但是不会被访问到的键。

    也就是说如果一个键过期了但是没有程序访问它,并且底层系统还没有排查到它的时候这个键是不会被删除的,也不会有通知产生,因此,redis 产生 expired 通知的时间为过期键被删除的时候, 而不是键的生存时间变为 0 的时候。

  • 相关阅读:
    Python 类中方法的内部变量,命名加'self.'变成 self.xxx 和不加直接 xxx 的区别
    用foreach遍历 datagridView 指定列所有的内容
    treeView1.SelectedNode.Level
    YES NO 上一个 下一个
    正则 单词全字匹配查找 reg 边界查找 精确匹配 只匹配字符 不含连续的字符
    抓取2个字符串中间的字符串
    sqlite 60000行 插入到数据库只用不到2秒
    将多行文本以单行的格式保存起来 读和写 ini
    将秒转换成时间格式
    richtextbox Ctrl+V只粘贴纯文本格式
  • 原文地址:https://www.cnblogs.com/52lnamp/p/11213239.html
Copyright © 2011-2022 走看看