Redis 事件通知


概述



开发让给redis集群加个key过期通知的配置;
特此了解这个配置;

事件通知



redis事件通知(notify-keyspace-events Ex);
Keyspace通知使客户端可以通过订阅频道来接收那些以某种方式改动了Redis数据集的事件;
(触发某些事件后可以向指定的频道发送通知)该功能需 Redis版本大于2.8;

notify-keyspace-events参数

参数可以是以下字符的任意组合,它指定了服务器该发送哪些类型的通知:

//字符    发送的通知
K    键空间通知,所有通知以__keyspace@<db>__ 为前缀
E    键事件通知,所有通知以 __keyevent@<db>__ 为前缀   //key通知
g    DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知
$    字符串命令的通知
l    列表命令的通知
s    集合命令的通知
h    哈希命令的通知
z    有序集合命令的通知
x    过期事件,每当有过期键被删除时发送
e    驱逐事件,每当有键因为maxmemory政策而被删除时发送
A    参数 g$lshzxe 的别名


redis配置新增

#redis.conf
notify-keyspace-events Ex

//查看及设置临时性的
config get notify-keyspace-events
config set notify-keyspace-events Ex


测试通知情况

通过 redis-cli也可以实现 :
127.0.0.1:6379> PSUBSCRIBE  __keyevent@0__:expired
订阅事件;
以下是通过php代码实现;
<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Support\Facades\Redis as Redis;

/**
 * Class RedisExpireListen
 * @package App\Console\Commands
 * @author shidatuo
 * @description redis过期事件监听
 */
class RedisExpireListen extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'redis:expire';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'redis过期事件监听';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        ini_set('default_socket_timeout', -1);

        // 获取redis库
        $cache_db = config('database.redis.default.database');
        $pattern = '__keyevent@'.$cache_db.'__:expired';

        // 订阅事件回调
        Redis::subscribe([$pattern], function ($message,$channel)
        {
            dump($message);
            dump($channel);
        });
    }
}



redis 添加个20秒的key


127.0.0.1:6379> SETEX name4 20 4
OK
127.0.0.1:6379>



控制台打印redis的key过期信息

D:\vbox\niapi>php artisan redis:expire
"name4"
"__keyevent@0__:expired"



小结 , 期间遇到的坑 :


1. Laravel8设置REDIS_PREFIX后订阅消息无效 ?

    我设置了Laravel的REDIS_PREFIX=test_prefix_,
    它在存储key的时候确实自动转化为了test_prefix_key的格式,
    但我也因此不能在应用中使用redis的订阅功能。我将REDIS_PREFIX改为等于空,
    则应用中的订阅也能正常工作

2. redis连接超时问题 ?

    将redis配置项 read_write_timeout 设置成 -1
    ini_set('default_socket_timeout', -1);

史大坨博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论