1 前提准备
1.1 创建一个springboot项目
技巧01:本博文基于springboot2.0创建
1.2 安装redis
1.2.1 linux版本
1.2.2 windows版本
到redis官网下载windows版本的后,解压即可
1.3 redis使用
本博文以window版本为例子,
1.3.1 开启服务端
》进入到解压后的redis根目录
》执行 redis-server.exe
1.3.2 开启客户端
进入到redis解压目录 -> 执行 redis-cli.exe
1.3.3 测试redis服务端和客户端的通信
在redis客户端执行 ping,如果返回了 PONG 就表明redis前后端通信正常
1.3.4 关闭
客户端和服务端都用 Ctrl + C 就可以关闭了
2 SpringBoot 集成 Redis
2.1 创建一个SpringBoot项目
技巧01:创建时引入 spring-boot-starter-web 和 spring-boot-starter-data-redis
4.0.0 cn.xiangxu redis_pub_sub 0.0.1-SNAPSHOT jar redis_pub_sub Demo project for Spring Boot org.springframework.boot spring-boot-starter-parent 2.0.3.RELEASE UTF-8 UTF-8 1.8 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-devtools true org.projectlombok lombok 1.18.0 org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-maven-plugin true
2.2 配置redis服务器
技巧01:springboot的启动包已经给我们配置好了redis相关的配置类,所以我们只需要在配置文件中对redis服务器进行相关的配置即可
2.3 使用redis服务器
坑01:外部的redis客户端在连接redis服务器时需要关闭redis服务器的守护进程,否则会出现连接失败;修改redis.conf配置文件即可,windows版本的redis配置文件在根目录下的 redis.windows.conf 中;将配置文件中protected-mode 配置值从 yes 改为 no 即可。
技巧01:因为springboot已经为我们配置好了一切,所以我们直接调用 RedisTemplate 或者 StringRedisTemplate 的相关API就可以对redis服务器进行相关的操作了
》依赖注入 RedisTemplate 或者 StringRedisTemplate
》利用依赖注入的 RedisTemplate 或者 StringRedisTemplate 对象进行操作即可
package cn.xiangxu.redis_pub_sub.web;import lombok.extern.slf4j.Slf4j;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.test.context.junit4.SpringRunner;import static org.junit.Assert.*;@RunWith(SpringRunner.class)@SpringBootTest@Slf4jpublic class TestControllerTest { /** * 依赖注入RedisTemplate,直接利用RedisTemplate操作redis即可 */ @Autowired private RedisTemplateredisTemplate; @Test public void test01(){ log.info("Hello Boy"); // 设置数据 redisTemplate.opsForValue().set("age", "33"); // 获取数据 String result = redisTemplate.opsForValue().get("name"); System.out.println(result.toString());// System.out.println(redisTemplate.getClientList());; }}
3 SpringBoot 利用 Redis 实现队列的效果
3.1 流程介绍
3.2 源代码
package cn.xiangxu.redis_pub_sub.domain;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import java.util.concurrent.CountDownLatch;/** * @author 王杨帅 * @create 2018-07-09 16:13 * @desc **/@Slf4jpublic class Receiver { private CountDownLatch latch; @Autowired public Receiver(CountDownLatch latch) { this.latch = latch; } public void receiveMessage(String message) { log.info("Received <" + message + ">"); latch.countDown(); }}
package cn.xiangxu.redis_pub_sub;import cn.xiangxu.redis_pub_sub.domain.Receiver;import lombok.extern.slf4j.Slf4j;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;import java.util.concurrent.CountDownLatch;@SpringBootApplication@Slf4jpublic class RedisPubSubApplication { /* * Redis消息监听器容器 * 这个容器加载了RedisConnectionFactory和消息监听器 */ @Bean RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter){ RedisMessageListenerContainer container = new RedisMessageListenerContainer(); container.setConnectionFactory(connectionFactory); container.addMessageListener(listenerAdapter, new PatternTopic("sprinboot-redis-messaage")); return container; } /* * 将Receiver注册为一个消息监听器,并指定消息接收的方法(receiveMessage) * 如果不指定消息接收的方法,消息监听器会默认的寻找Receiver中的handleMessage这个方法作为消息接收的方法 */ @Bean MessageListenerAdapter listenerAdapter(Receiver receiver){ return new MessageListenerAdapter(receiver, "receiveMessage"); } /* * Receiver实例 */ @Bean Receiver receiver(CountDownLatch latch){ return new Receiver(latch); } @Bean CountDownLatch latch(){ return new CountDownLatch(1); } /* * Redis Template 用来发送消息 */ @Bean StringRedisTemplate template(RedisConnectionFactory connectionFactory){ return new StringRedisTemplate(connectionFactory); } public static void main(String[] args) { ApplicationContext ctx = SpringApplication.run(RedisPubSubApplication.class, args); StringRedisTemplate template = ctx.getBean(StringRedisTemplate.class);// CountDownLatch latch = ctx.getBean(CountDownLatch.class); log.info("Sending message......"); template.convertAndSend("sprinboot-redis-messaage", "Hello, SpringBoot redis message!!!!");// latch.wait();// System.exit(0); }}
3.3 效果测试
3.3.1 利用redis服务器中的客户端测试发布订阅效果
3.3.2 启动springBoot项目
在redis服务器中发布的消息会自动打印到控制台上