1.启动方式一:docker默认启动redis
1、拉取镜像
docker pull redis:lastest (若不使用版本号,如docker pull redis,默认拉取最新镜像)
docker pull redis
Using default tag: latest
docker pull redisUsing default tag: latestlatest: Pulling from library/redisb4d181a07f80: Pull complete86e428f79bcb: Pull completeba0d0a025810: Pull completeba9292c6f77e: Pull completeb96c0d1da602: Pull complete5e4b46455da3: Pull completeDigest: sha256:b6a9fc3535388a6fc04f3bdb83fb4d9d0b4ffd85e7609a6ff2f0f731427823e3Status: Downloaded newer imageforredis:latestdocker.io/library/redis:latest
2、启动redis server,启动时设置端口,以便外部访问
docker run -it -d --name myredis -p 6379:6379 redis
docker run -it -d --name myredis -p 6379:6379 redis
61cb870059af6b7da7af44065af9673dc7934ad8e6e6fec6bff81edf93b88924
说明: -it : 让容器的标准输入保持打开,并分配一个伪终端并绑定到容器的标准输入上
-d : 启动容器并在后台运行
创建 Redis 消息接收器
Receiver.java
package com.example.messagingredis;
import java.util.concurrent.atomic.AtomicInteger;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Receiver {
private static final LoggerLOGGER = LoggerFactory.getLogger(Receiver.class);
private AtomicIntegercounter =new AtomicInteger();
public void receiveMessage(String message) {
LOGGER.info("Received <" + message +">");
counter.incrementAndGet();
}
public int getCount() {
return counter.get();
}
}
定义一个MessagingRedisApplication.java
package com.example.messagingredis;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.listener.PatternTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
@SpringBootApplication
public class MessagingRedisApplication {
private static final LoggerLOGGER = LoggerFactory.getLogger(MessagingRedisApplication.class);
@Bean
RedisMessageListenerContainercontainer(RedisConnectionFactory connectionFactory,
MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container =new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new PatternTopic("chat"));
return container;
}
@Bean
MessageListenerAdapterlistenerAdapter(Receiver receiver) {
return new MessageListenerAdapter(receiver, "receiveMessage");
}
@Bean
Receiverreceiver() {
return new Receiver();
}
@Bean
StringRedisTemplatetemplate(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
}
public static void main(String[] args)throws InterruptedException {
ApplicationContext ctx = SpringApplication.run(MessagingRedisApplication.class, args);
StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class);
Receiver receiver = ctx.getBean(Receiver.class);
while (receiver.getCount() ==0) {
LOGGER.info("Sending message...");
template.convertAndSend("chat", "\n说明:-it :让容器的标准输入保持打开,并分配一个伪终端并绑定到容器的标准输入上\n" +
"-d : 启动容器并在后台运行\n" +
"容器运行起来后,若想进入容器内部,并进行命令行操作");
Thread.sleep(500L);
}
System.exit(0);
}
}
template.convertAndSend("chat","\n说明:-it :让容器的标准输入保持打开,并分配一个伪终端并绑定到容器的标准输入上\n"+"-d : 启动容器并在后台运行\n"+"容器运行起来后,若想进入容器内部,并进行命令行操作");Thread.sleep(500L);}System.exit(0);}}
在 listenerAdapter 方法中定义的 bean 在容器中定义的消息侦听器容器中注册为消息侦听器,并将侦听聊天主题上的消息。由于 Receiver 类是一个 POJO,因此需要将其包装在实现 MessageListener 接口(addMessageListener() 所需)的消息侦听器适配器中。消息侦听器适配器还配置为在消息到达时调用 Receiver 上的 receiveMessage() 方法。
连接工厂和消息侦听器容器 bean 是侦听消息所需的全部。要发送消息,您还需要一个 Redis 模板。在这里,它是一个配置为 StringRedisTemplate 的 bean,它是 RedisTemplate 的一个实现,专注于 Redis 的常见用法,其中键和值都是 String 实例。
main() 方法通过创建 Spring 应用程序上下文来启动一切。然后应用程序上下文启动消息侦听器容器,消息侦听器容器 bean 开始侦听消息。 main() 方法然后从应用程序上下文中检索 StringRedisTemplate bean 并使用它从 Redis 发送一个 "说明....."关于聊天主题的消息。最后,它关闭 Spring 应用程序上下文,应用程序结束。
运行
2021-07-15 17:00:11.828 INFO 54244 --- [ main] c.e.m.MessagingRedisApplication : Sending message...
2021-07-15 17:00:11.840 INFO 54244 --- [ container-2] com.example.messagingredis.Receiver : Received <
说明:-it :让容器的标准输入保持打开,并分配一个伪终端并绑定到容器的标准输入上
-d : 启动容器并在后台运行
容器运行起来后,若想进入容器内部,并进行命令行操作>
Process finished with exit code 0
网友评论