文档章节

Springboot2 之 Spring Data Redis 实现消息队列——发布/订阅模式

Simonton
 Simonton
发布于 06/22 00:00
字数 668
阅读 1046
收藏 17

一般来说,消息队列有两种场景,一种是发布者订阅者模式,一种是生产者消费者模式,这里利用redis消息“发布/订阅”来简单实现订阅者模式。

实现之前先过过 redis 发布订阅的一些基础概念和操作。

- Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式(Topic):发送者(pub)发送消息,订阅者(sub)接收消息。Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:

当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:

接下来我们通过 Redis-cli 来简单看看效果:

1)通过 publish 来发布 topic message 

2)通过 subscribe 来订阅 topic 

接下来用springboot2 + spring data redis 来实现来简单实现订阅者模式:

spring data redis实现发布与订阅需要配置以下信息:

  • - Topic
  • - MessageListener
  • - RedisMessageListenerContainer

1). 用到的 starter 只有 spring data redis starter: 

dependencies {
	compile group: 'org.springframework.boot', name: 'spring-boot-starter-redis', version: '1.4.7.RELEASE'
	testCompile('org.springframework.boot:spring-boot-starter-test')
}

2). 配置 spring data redis: 

package com.example.demo.redis.listener.redis.config;

import com.example.demo.redis.listener.ConsumerRedisListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;

@Configuration
public class RedisConfig {

    @Autowired
    private JedisConnectionFactory jedisConnectionFactory;

    @Bean
    public ConsumerRedisListener consumerRedis() {
        return new ConsumerRedisListener();
    }

    @Bean
    public ChannelTopic topic() {
        return new ChannelTopic("string-topic");
    }

    @Bean
    public RedisMessageListenerContainer redisMessageListenerContainer() {

        RedisMessageListenerContainer container = new RedisMessageListenerContainer();
        container.setConnectionFactory(jedisConnectionFactory);

        container.addMessageListener(consumerRedis(),topic());
        return container;

    }

}

3) 实现一个String类型的 topic MessageListener 

package com.example.demo.redis.listener;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.data.redis.core.StringRedisTemplate;

public class ConsumerRedisListener implements MessageListener {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void onMessage(Message message, byte[] pattern) {
        doBusiness(message);
    }

    /**
     * 打印 message body 内容
     * @param message
     */
    public void doBusiness(Message message) {
        Object value = stringRedisTemplate.getValueSerializer().deserialize(message.getBody());
        System.out.println("consumer message: " + String.valueOf(value));
    }
}

4) 其它:

记得配置上 redis 相关的配置,最简单的application.properties配置如下:

spring.redis.host=127.0.0.1

spring.redis.port=6379

通过上面四步,简单的订阅者就做好了,通过以下代码可以发布一个消息,同时可以查看到控制台会有订阅者消费信息打印出来:

	@Autowired
	private StringRedisTemplate stringRedisTemplate;

	@Test
	public void testRedisStringOps() {
		stringRedisTemplate.convertAndSend("string-topic","hello world");

	}

最后总结下:

用 spring data redis 来实现 redis 订阅者,本质上还是Listener模式,只需要配置Topic, MessageListener 和 RedisMessageListenerContainer就可以了。同时,发布时,只需要使用 redisTemplate 的 convertAndSend方法即可topic来发布message。

© 著作权归作者所有

共有 人打赏支持
Simonton
粉丝 11
博文 20
码字总数 10207
作品 0
浦东
高级程序员
加载中

评论(2)

Simonton
Simonton

引用来自“轻描_看花开2016”的评论

这代码,排版可真是...
唉,踩到坑了,调了好几个版本,手机上还是乱的。。。
轻描看花开
轻描看花开
这代码,排版可真是...
Redis实现消息队列

基于Redis消息队列-实现短信服务化 1.Redis实现消息队列原理 常用的消息队列有RabbitMQ,ActiveMQ,个人觉得这种消息队列太大太重,本文介绍下基于Redis的轻量级消息队列服务。 一般来说,消息...

voole
2016/08/07
2.1K
2
Spring Data Redis实现一个订阅/发布系统

Redis是一个key-value的存储系统,提供的key-value类似与Memcached而数据结构又多于memcached,而且性能优异.广泛用于缓存,临时存储等.而我今天这个例子是使用Redis实现一个订阅/发布系统,而不...

震秦
2012/10/26
0
11
介绍Spring Cloud Stream与RabbitMQ集成

Spring Cloud Stream是一个建立在Spring Boot和Spring Integration之上的框架,有助于创建事件驱动或消息驱动的微服务。在本文中,我们将通过一些简单的例子来介绍Spring Cloud Stream的概念...

RaiseHead
05/13
0
0
Spring Boot与消息(JMS、AMQP、RabbitMQ)

1.概述。 大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力。 消息服务中两个重要概念: 消息代理(message broker)和目的地(destination)。 当消息发送者发送消息以后...

llsydn
09/12
0
0
SpringMVC中配置RabbitMQ

RabbitMQ是工作在amqp协议(advanced message queue protocal,高级消息队列协议)上的一个消息中间件。它通过一个生产者消费者模型来处理应用中产生的消息。 除了生产者和消费者,此模型中另...

AlphaGo
2016/03/26
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

redis-hash

哈希类型是指健值本身又是一个键值对结构 基本命令: hset key field value 设置值 hget(获取),hdel(删除),hlen(计算field个数),hmget(批量设置),hexists(是否存在),hkeys(获取所有的...

拐美人
20分钟前
1
0
简单的svm例子

数据来源:https://github.com/oumiga1314/Coursera-ML-AndrewNg-Notes/blob/master/code/ex6-SVM/data/ex6data1.mat import pandas as pd import numpy as np import scipy.io as sio impor......

南桥北木
24分钟前
0
0
android 关于View的一些整理

1、Button text的值为英文时,会自动转换成大写。如需取消,设置android:textAllCaps="false" 2、控件的可见性 可以在layout的配置文件中,配置android:visibility属性 调用setVisibility()...

西米小娅
34分钟前
0
0
Spring JDBC数据源分析

Spring数据源分析 分析这样一段代码: package com.jason.spring.datasource.jdbc;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.springframew......

宸明
42分钟前
1
0
FatJar:适用于sdk多module打包和合并多个jar的gradle插件

usage: 1.下载fatJar.gradle放置于project根目录 2.在project的build.gradle中添加依赖和配置: apply from: 'fatJar.gradle'buildscript { dependencies { classpath 'xyz......

SuShine
59分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部