网站首页 > java教程 正文
当你做一个小型项目时,需要实现消息队列模式,但是却不想引用常见的MQ,因为它们实在是太重了,引入它们会给项目带来复杂度。而redis作为一个轻量级框架,主要作为缓存使用,而你正好可以通过redis实现消息的发布订阅。
一、如何使用
以SpringBoot项目为模板,来举例说明redis如何在Java中实现。
1.1 首先引入redis的jar包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
1.2 配置redis连接池
@Configuration
public class JedisPoolFactory {
@Bean
public JedisPool redisFactory(){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(10);
jedisPoolConfig.setMaxWaitMillis(-1);
jedisPoolConfig.setMinIdle(0);
return new JedisPool(jedisPoolConfig, "127.0.0.1", 6379);
}
}
1.3 发布消息
@Component
public class Publisher{
@Autowired
private JedisPool jedisPool;
@Autowired
private ObjectMapper objectMapper;
// 调用run方法传参,实现消息的发布
public void run(StudentBean studentBean) {
Jedis jedis = jedisPool.getResource();
try {
String value = objectMapper.writeValueAsString(studentBean);
// 从mychannel的频道上推送消息
jedis.publish("mychannel", value);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
}
1.4 消费者订阅
- 订阅线程
@Slf4j
public class SubscribeThread extends Thread {
private final JedisPool jedisPool;
private final Subscriber subscriber = new Subscriber();
private final String channel = "mychannel";
public SubscribeThread(JedisPool jedisPool) {
this.jedisPool = jedisPool;
}
@Override
public void run() {
Jedis jedis = null;
try {
//从redis连接池中取出一个连接
jedis = jedisPool.getResource();
//通过subscribe 的api去订阅,入参是订阅者和频道名
log.info("subscribe redis, channel: {}, thread will be blocked", channel);
jedis.subscribe(subscriber, channel);
} catch (Exception e) {
log.error("subsrcibe channel error: {}", e.getMessage());
} finally {
if (jedis != null) {
jedis.close();
}
}
}
}
- 业务处理,需要继承JedisPubSub,然后实现其发布订阅
public class Subscriber extends JedisPubSub {
/**
* 收到消息会调用
* @param channel
* @param message
*/
@Override
public void onMessage(String channel, String message) {
// 收到message处理业务
System.out.printf("received redis published message, channel: %s, message: %s%n",channel, message);
// TODO message
}
/**
* 订阅了频道会调用
* @param channel
* @param subscribedChannels
*/
@Override
public void onSubscribe(String channel, int subscribedChannels) {
System.out.printf("subscribe redis channel success, channel %s, subscribedChannels %d%n",
channel, subscribedChannels);
}
/**
* 取消订阅会调用
* @param channel
* @param subscribedChannels
*/
@Override
public void onUnsubscribe(String channel, int subscribedChannels) {
System.out.printf("unsubscribe redis channel, channel %s, subscribedChannels %d%n",
channel, subscribedChannels);
}
}
二、总结
2.1 不能保证消息的可靠性
当发布一条消息时,如果没有订阅者或者订阅者断线时,那么这条消息就会被丢失,订阅者再次启动时无法获得该消息。
2.2 轻量级服务
如果在小型服务里面,只用到redis,而没有用到其它MQ中间件,那么可以用redis来实现消息队列,避免中间件的引入及安装。
猜你喜欢
- 2025-05-28 学习笔记:深入浅出redis
- 2025-05-28 Vue3 + Nest 实现权限管理系统 后端篇:如何在 NestJS 中使用 redis
- 2025-05-28 Redis 中地理位置功能 Geospatial 了解一下?
- 2025-05-28 推荐几个好用Redis图形化客户端工具
- 2025-05-28 因为不会Redis的scan命令,我被开除了
- 2025-05-28 Redis中9种基本数据类型及常用操作命令和应用场景
- 2025-05-28 一连问了好几个大佬,竟然都不知道Redis为什么默认16个数据库?
- 2025-05-28 快!做对这 10 点,让你的 Redis 性能更上一层楼
- 2025-05-28 字节三面远程,Java+Redis+网络+数据库+算法,轻松反杀面试官?
- 2025-05-28 Java Redis配置与优化
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)