Springboot 实现Redis消息队列

Springboot 实现Redis 消息队列
之前被面试官问到怎么实现Redis的消息队列,我人麻了,当时一个劲的摇头,娘的,欺负我那时知识少,恶心啊
 最近看到一个Demo,然后随笔记录了一篇,以便记录自己的成长过程。

一、废话不多bb,直接上干货
1、IDEA新建一个Springboot工程,取名为RedisQuene

2、导入依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

    </dependencies>

3、修改 application.yml 配置

spring:
  redis:
    host: 127.0.0.1
    database: 0
    port: 6379
    jedis:
      pool:
        max-active: 256
        max-idle: 8
        min-idle: 1

server:
  port: 8080
  tomcat:
    uri-encoding: utf-8

4、新建一个config包,导入Redis配置

@Configuration
public class RedisConfig {
    @Autowired
    private RedisConnectionFactory redisConnectionFactory;

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new StringRedisSerializer());
        template.afterPropertiesSet();
        return template;
    }
}

5、新建一个service包,写一个接口

public interface MQService {

    void produce(String string);

    void consume();

    void blockingConsume();

}

5、写一个该接口的实现类,实现业务代码

@Service
public class MQServiceImpl implements MQService {
    private static Logger log = LoggerFactory.getLogger(MQServiceImpl.class);

    private static final String MESSAGE_KEY = "message:queue";

//    blpop 是阻塞式列表的弹出原语。当给定列表内没有任何元素可供弹出的时候, 连接将被 blpop 命令阻塞。
//    直到有另一个客户端对给定的这些 key 的任意一个执行 lpush 或 rpush 命令为止。
//    当给定多个 key 参数时,按参数 key 的先后顺序依次检查各个列表,弹出第一个非空列表的头元素

    //brpop超时时间 Jessica 2021-11-05
    private static final  int TIME_OUT=10;

    @Resource
    private RedisTemplate redisTemplate;

    @Override
    public void produce(String string) {
        redisTemplate.opsForList().leftPush(MESSAGE_KEY, string);
    }

    @Override
    public void consume() {
        String string = (String) redisTemplate.opsForList().rightPop(MESSAGE_KEY);
        log.info("consume : {}", string);
    }

    public void blockingConsume() {
        List<Object> obj = redisTemplate.executePipelined(new RedisCallback<Object>() {
            @Nullable
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                //队列没有元素会阻塞操作,直到队列获取新的元素或超时
                return connection.bLPop(TIME_OUT, MESSAGE_KEY.getBytes());
            }
        },new StringRedisSerializer());

        for (Object str: obj) {
            log.info("blockingConsume : {}", str);
        }
    }

}

5、新建一个controller包,controller调用service方法

@RestController
@RequestMapping(value="/api")
public class MQController {

    @Resource
    private MQService mQService;

    @RequestMapping(value = "/produce", method= RequestMethod.GET)
    public void produce(@RequestParam(name = "key") String key) {
        mQService.produce(key);
    }

    @RequestMapping(value="/consume", method=RequestMethod.GET)
    public void consume() throws Exception{
        //第一种,没有参数的Redis 队列,会不停连接,连接失败会自动断开 Jessica 2021-11-05
//            while (true) {
//                mQService.consume();
//            }

       //第二种,即使没有参数,会陷入阻塞阶段
            mQService.blockingConsume();

    }


}

7、开启windows的Redis,没有安装包可以去官网下载一个,这里要强调一下,Redis是CS架构的,我们下载Redis安装包(必须是Windows版)后,需要先启动Redis,进入Redis安装的根目录,然后输入命令,启动服务端

E:\DevelopTools\redis>redis-server.exe redis.windows.conf

8、然后我们启动RedisQuene工程,在浏览器输入key=1,生产消息
在这里插入图片描述

9、在另外一个浏览器窗口消费一个消息
在这里插入图片描述
10、在IDEA控制台,我们可以查看消息接收完成,OK
在这里插入图片描述
总结:brpop帮助我们在没有数据的情况下,不会陷入重复连接的情况,很好的处理数据的请求。

各位观众老爷们,创作不易,麻烦点赞、关注、收藏,谢谢!

你可能感兴趣的:(Redis,redis,spring,boot,java)