Redis 本身无 RPatternTopic,它是 Redisson 对 PSUBSCRIBE 的封装,底层使用 glob 模式(如 logs:*)而非正则;Java 项目可用因其客户端实现了模式订阅与消息封装,但需注意单机连接、初始化时机及 channel 命名约束。

Redis 本身不提供 RPatternTopic 或任何原生的模式匹配订阅机制。 这个名字是 Redisson 客户端(Java)对 Redis Pub/Sub 模式订阅功能的封装,底层依赖 PSUBSCRIBE 命令。直接在 Redis CLI 或其他语言客户端里搜 RPatternTopic,什么都找不到。
为什么 Java 项目里能用 RPatternTopic?
因为 Redisson 在客户端做了两层工作:
- 调用 Redis 的
PSUBSCRIBE pattern1 pattern2发起模式订阅(支持*和?,但不支持正则) - 把收到的
message和pattern封装成RPatternTopic对象,提供addListener()、publish()等易用接口
注意:Redis 的模式匹配仅支持 glob 风格,比如 logs:*.error 或 user:?,不支持 logs:\d+\.error 这类正则表达式。
实际使用 RPatternTopic 的关键配置点
如果你正在用 Redisson,这几个地方最容易出错:
-
Config.useSingleServer().setAddress("redis://127.0.0.1:6379")必须启用,集群模式下PSUBSCRIBE行为不可靠,官方明确不推荐 - 订阅必须在连接建立后、事件循环启动前完成;否则监听器收不到消息(常见于 Spring Bean 初始化顺序问题)
- 同一个 JVM 内多次调用
getPatternTopic("logs:*")返回的是不同实例,但底层共用一个PSUBSCRIBE连接 —— 所以添加多个监听器没问题,但别反复创建 topic 对象 - 发布端不能用
RPatternTopic.publish(),它只是个“接收端抽象”;发布必须走RBucket或原生redisTemplate.convertAndSend(),发到匹配的 channel 名(如logs:api.error)
替代方案:不用 Redisson 怎么做模式订阅?
如果项目是 Python/Go/Node.js,或想绕过 Redisson 直接控制行为:
- Python:用
redis-py的pubsub.psubscribe("logs:*"),然后手动解析message["pattern"]和message["channel"] - Go:用
github.com/go-redis/redis/v9的pubsub.PSubscribe(ctx, "logs:*"),注意返回的*redis.PSubscription才支持模式匹配 - 陷阱:所有客户端都要求订阅连接保持长连,且不能复用普通命令连接;很多 HTTP 框架默认复用连接池,会导致
PSUBSCRIBE失败或阻塞
真正麻烦的不是写法,而是当你要匹配 logs:2024-06-*.error 这种带日期前缀的场景时,Redis 的 glob 不支持范围或通配符嵌套 —— 你得提前规划 channel 命名结构,或者在应用层做二次过滤。


















