Redis自定义键空间事件创建方法及Redisson中基于Streams TOUCH操作的ObjectListner自定义监听器实现方案
在Redis中创建自定义键空间事件 & Redisson实现Streams TOUCH操作监听器
一、Redis中配置键空间事件(捕获TOUCH操作)
Redis本身没有“完全自定义”键空间事件的说法,但你可以通过开启特定的事件通知规则,来捕获包括TOUCH在内的目标操作。具体步骤如下:
开启事件通知:
Redis默认关闭键空间事件通知,需要通过notify-keyspace-events参数开启,有两种配置方式:修改
redis.conf配置文件(永久生效):notify-keyspace-events "Kg"参数说明:
K:监听键空间事件(格式为__keyspace@<db>__:<key>,消息会携带触发操作的键名)g:监听通用操作类事件,其中就包含TOUCH操作
如果需要同时监听“操作类型维度”的事件(格式为__keyevent@<db>__:<event>,消息携带操作类型),可以把参数设为"Keg"。
运行时动态配置(重启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
相关产品推荐
相关产品推荐

