Redis在实际开发中有哪些应用场景?
Redis在实际开发中有哪些应用场景?下面我结合Redisson来演示Redis在分布式场景中热点数据缓存、计数器、队列、发布/订阅、分布式锁…等场景下的应用。
发布/订阅
在Redis中可以通过publish和subscriber命令来实现一个简单的消息通信中间件,适合用在需要实时通知或者需要轻量级消息队列的场景。
在使用Redis作为消息中间件之前,需要了解三个概念:
- 1、发布者Publish,就是需要发送消息的客户端,客户端将消息发送给频道Channel。
- 2、订阅者Subscrib,订阅者也可以看做消费者,就是接收处理Channel中的消息。
- 3、频道Channel,消息通道。
Redisson对发布/订阅功能也做了高级封装,下面演示代码,其中代码环境配置参考《Redis应用场景1-热点数据缓存》:
package com.example.redisdemo;
import org.junit.jupiter.api.Test;
import org.redisson.api.RFuture;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import javax.annotation.PostConstruct;
@SpringBootTest
class PubTests {
private static final Logger logger = LoggerFactory.getLogger(PubTests.class);
@Autowired
private RedissonClient redissonClient;
/**
* 发布消息
*
* @param message 消息json
*/
public void publishAsync(RTopic topic, String message) {
// 异步发布消息
RFuture<Long> longRFuture = topic.publishAsync(message);
longRFuture.thenAccept(response -> {
// 处理响应,例如确认消息发送成功
logger.info("Publish===============The message published is: {}", message);
}).exceptionally(e -> {
// 失败策略,这里可以自己实现消息重发,异常记录等功能。
// messageReplay() 消息重发 根据实际情况处理
logger.error("Publish===============Publish message failed, message: {}, error: {}", message, e.getMessage());
return null;
});
}
//这里通过spring boot的@PostConstruct注解,在项目启动时订阅消息
//这里我们订阅了test这个topic,如果有消息发布到这个topic,就会收到消息
@PostConstruct
public void subscribeTest() {
//注册两个订阅者
RTopic test = redissonClient.getTopic("test");
test.addListener(String.class, (channel, msg) -> logger.info("Subscribe11===============Received message: {}", msg));
RTopic test2 = redissonClient.getTopic("test");
test.addListener(String.class, (channel, msg) -> logger.info("Subscribe22===============Received message: {}", msg));
}
@Test
public void publishTest() {
RTopic test = redissonClient.getTopic("test");
// 我们这里循环发消息,每条消息间隔一秒
int count = 0;
while (true) {
publishAsync(test, "hello world" + count);
count++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
}
看一下运行结果:
这里可以看到两个订阅者都收到了消息。
总结
总的来说Redis的发布订阅功能相比于其他传统消息中间件来说,更加轻量级,适用于简单的消息传递场景,消息的实时性更强。在小规模业务场景或者又不想新增消息中间件给系统整体增加风险,使用Redis的发布订阅功能是不错的选择。
当然,相对于专业消息中间件,Redis的功能缺乏一些高级特性,如消息持久化、消息确认、消息重试、消息延迟等。如果需要大数据、持久化、准确性等场景还是建议使用传统消息中间件。