You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Redis自定义键空间事件创建方法及Redisson中基于Streams TOUCH操作的ObjectListner自定义监听器实现方案

在Redis中创建自定义键空间事件 & Redisson实现Streams TOUCH操作监听器

一、Redis中配置键空间事件(捕获TOUCH操作)

Redis本身没有“完全自定义”键空间事件的说法,但你可以通过开启特定的事件通知规则,来捕获包括TOUCH在内的目标操作。具体步骤如下:

  • 开启事件通知:
    Redis默认关闭键空间事件通知,需要通过notify-keyspace-events参数开启,有两种配置方式:

    1. 修改redis.conf配置文件(永久生效):

      notify-keyspace-events "Kg"
      

      参数说明:

      • K:监听键空间事件(格式为__keyspace@<db>__:<key>,消息会携带触发操作的键名)
      • g:监听通用操作类事件,其中就包含TOUCH操作
        如果需要同时监听“操作类型维度”的事件(格式为__keyevent@<db>__:<event>,消息携带操作类型),可以把参数设为"Keg"。
    2. 运行时动态配置(重启Redis后失效):
      在Redis客户端执行命令:

      CONFIG SET notify-keyspace-events "Kg"
      
  • 验证事件是否生效:
    打开两个Redis客户端窗口,一个订阅键空间事件:

    PSUBSCRIBE __keyspace@0__:*
    

    另一个执行TOUCH操作:

    TOUCH my_test_stream
    

    订阅窗口会收到类似message __keyspace@0__:my_test_stream touch的消息,说明事件已正常触发。

二、Redisson中为Streams的TOUCH操作实现ObjectListener

Redisson封装了Redis的键空间事件监听能力,要实现针对Stream类型键的TOUCH操作监听,按以下步骤来:

1. 确保Redis已完成事件通知配置

先完成上面第一步的配置,保证notify-keyspace-events包含K和g参数,否则监听器无法收到事件。

2. 初始化Redisson客户端

这里以单机Redis为例,创建RedissonClient实例:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class StreamTouchDemo {
    public static void main(String[] args) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient redisson = Redisson.create(config);
        
        // 后续注册监听器的代码放在这里
    }
}

3. 实现自定义ObjectListener

创建类实现ObjectListener接口,在onEvent方法中过滤出TOUCH事件,并且验证目标键是Stream类型:

import org.redisson.api.ObjectListener;
import org.redisson.api.RKeys;
import org.redisson.api.RedissonClient;
import org.redisson.api.listener.KeyEvent;

public class StreamTouchListener implements ObjectListener {
    private final RedissonClient redisson;

    public StreamTouchListener(RedissonClient redisson) {
        this.redisson = redisson;
    }

    @Override
    public void onEvent(String key, KeyEvent event) {
        // 只处理TOUCH事件
        if (event == KeyEvent.TOUCH) {
            RKeys keys = redisson.getKeys();
            // 验证该键是否为Stream类型
            if (keys.getType(key) == org.redisson.api.Type.STREAM) {
                System.out.println("Stream [" + key + "] 被执行了TOUCH操作!");
                // 在这里添加你的业务逻辑,比如记录操作日志、触发后续处理流程等
            }
        }
    }
}

4. 注册监听器

通过Redisson的RKeys对象注册自定义监听器,指定监听TOUCH事件:

// 在main方法中添加以下代码
RKeys rKeys = redisson.getKeys();
StreamTouchListener touchListener = new StreamTouchListener(redisson);
// 注册监听器,监听所有键的TOUCH事件
rKeys.addListener(touchListener, KeyEvent.TOUCH);

// 保持程序运行,方便测试
try {
    Thread.currentThread().join();
} catch (InterruptedException e) {
    Thread.currentThread().interrupt();
}

// 程序关闭时清理资源
redisson.shutdown();

5. 注意事项

  • 监听器的onEvent方法是异步执行的,不要在其中处理耗时操作,避免阻塞Redisson的事件线程。
  • 不再需要监听时,记得调用rKeys.removeListener(touchListener)手动移除监听器,避免内存泄漏。
  • Redisson客户端关闭时会自动清理所有监听器,但手动清理是更稳妥的做法。

内容的提问来源于stack exchange,提问作者user14141731

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 15:49:11