如何从头开始学习Redisson的订阅分发功能?

2026-06-11 14:226阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计746个文字,预计阅读时间需要3分钟。

如何从头开始学习Redisson的订阅分发功能?

Redisson 作为消息中间件 + 想不到 Redisson 居然还有订阅发布功能,类似 RabbitMQ。以前在用 Redis 的时侯,可以利用 List 这种数据类型的左右进出特性,做消息中间件。不知这次 Re...


一、Redisson作为消息中间件

没想到Redisson居然还有订阅发布功能,类似于RabbitMQ。之前在用Redis的时候,可以利用List这种数据类型的左进右出的特性,能够做消息中间件。不知道这次Redisson的底层是不是这样实现的。Redis实现中间件传送门:第四节 List作为消息中间件

我这里假设把一个用户对象进行推送。实现思路就是前端传一个用户的ID过来。我们在数据库中找到这个用户,然后把这个用户对象塞入Redisson的消息队列中。再编写一个监听器,不断得从队列中获取消息。

二、技术参考要点

技术参考文档。
RTopic topic = redisson.getTopic("anyTopic");
topic.addListener(SomeObject.class, new MessageListener<SomeObject>() {
@Override
public void onMessage(String channel, SomeObject message) {
//...
}
});

// 在其他线程或JVM节点
RTopic topic = redisson.getTopic("anyTopic");
long clientsReceivedMessage = topic.publish(new SomeObject());

实战:生产端代码

核心代码TopicService。方法上接受一个用户对象。然后通过Redisson客户端的getTopic方法获取RTopic对象。最后把我们需要推送的MUser对象,使用RTopic对象的publish方法加入到消息队列中。可参考上面的文档。

package com.tyzhou.redisson.service;

import com.tyzhou.Constant;
import com.tyzhou.mail.modol.MUser;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TopicService {

@Autowired
private RedissonClient redisson;

public void sendEmail(MUser user) {

if (user != null && StringUtils.isNotBlank(user.getEmail())) {
RTopic<MUser> topic = redisson.getTopic(Constant.REDISSON_EMAIL);
topic.publish(user);
}
}
}

实战:消费端代码

为了让我们有一个类似监听器的对象,我们可以实现一个叫做ApplicationRunner接口,然后这个实现类就会一直在内存中。

实现Ordered接口为其制定顺序,因为可能有多个ApplicationRunner接口的实现类。

技术参考文档:
RTopic topic = redisson.getTopic("anyTopic");
topic.addListener(SomeObject.class, new MessageListener<SomeObject>() {
@Override
public void onMessage(String channel, SomeObject message) {
//...
}
});import com.tyzhou.Constant;
import com.tyzhou.mail.modol.MUser;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.redisson.api.listener.MessageListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Service;

@Service
public class TopicListener implements ApplicationRunner, Ordered {
private static final Logger LOGGER = LoggerFactory.getLogger(TopicListener.class);

@Autowired
private RedissonClient redisson;

@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
RTopic<MUser> topic = redisson.getTopic(Constant.REDISSON_EMAIL);
topic.addListener(new MessageListener<MUser>() {
@Override
public void onMessage(CharSequence charSequence, MUser user) {
LOGGER.info("Redisson监听器收到消息:{}", user);
}
});
}

@Override
public int getOrder() {
return 1;
}
}

三、实现效果


如何从头开始学习Redisson的订阅分发功能?

本文共计746个文字,预计阅读时间需要3分钟。

如何从头开始学习Redisson的订阅分发功能?

Redisson 作为消息中间件 + 想不到 Redisson 居然还有订阅发布功能,类似 RabbitMQ。以前在用 Redis 的时侯,可以利用 List 这种数据类型的左右进出特性,做消息中间件。不知这次 Re...


一、Redisson作为消息中间件

没想到Redisson居然还有订阅发布功能,类似于RabbitMQ。之前在用Redis的时候,可以利用List这种数据类型的左进右出的特性,能够做消息中间件。不知道这次Redisson的底层是不是这样实现的。Redis实现中间件传送门:第四节 List作为消息中间件

我这里假设把一个用户对象进行推送。实现思路就是前端传一个用户的ID过来。我们在数据库中找到这个用户,然后把这个用户对象塞入Redisson的消息队列中。再编写一个监听器,不断得从队列中获取消息。

二、技术参考要点

技术参考文档。
RTopic topic = redisson.getTopic("anyTopic");
topic.addListener(SomeObject.class, new MessageListener<SomeObject>() {
@Override
public void onMessage(String channel, SomeObject message) {
//...
}
});

// 在其他线程或JVM节点
RTopic topic = redisson.getTopic("anyTopic");
long clientsReceivedMessage = topic.publish(new SomeObject());

实战:生产端代码

核心代码TopicService。方法上接受一个用户对象。然后通过Redisson客户端的getTopic方法获取RTopic对象。最后把我们需要推送的MUser对象,使用RTopic对象的publish方法加入到消息队列中。可参考上面的文档。

package com.tyzhou.redisson.service;

import com.tyzhou.Constant;
import com.tyzhou.mail.modol.MUser;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class TopicService {

@Autowired
private RedissonClient redisson;

public void sendEmail(MUser user) {

if (user != null && StringUtils.isNotBlank(user.getEmail())) {
RTopic<MUser> topic = redisson.getTopic(Constant.REDISSON_EMAIL);
topic.publish(user);
}
}
}

实战:消费端代码

为了让我们有一个类似监听器的对象,我们可以实现一个叫做ApplicationRunner接口,然后这个实现类就会一直在内存中。

实现Ordered接口为其制定顺序,因为可能有多个ApplicationRunner接口的实现类。

技术参考文档:
RTopic topic = redisson.getTopic("anyTopic");
topic.addListener(SomeObject.class, new MessageListener<SomeObject>() {
@Override
public void onMessage(String channel, SomeObject message) {
//...
}
});import com.tyzhou.Constant;
import com.tyzhou.mail.modol.MUser;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.redisson.api.listener.MessageListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Service;

@Service
public class TopicListener implements ApplicationRunner, Ordered {
private static final Logger LOGGER = LoggerFactory.getLogger(TopicListener.class);

@Autowired
private RedissonClient redisson;

@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
RTopic<MUser> topic = redisson.getTopic(Constant.REDISSON_EMAIL);
topic.addListener(new MessageListener<MUser>() {
@Override
public void onMessage(CharSequence charSequence, MUser user) {
LOGGER.info("Redisson监听器收到消息:{}", user);
}
});
}

@Override
public int getOrder() {
return 1;
}
}

三、实现效果


如何从头开始学习Redisson的订阅分发功能?