继续发现功能强大的Redis功能集,值得一提的是对发布/订阅消息的开箱即用支持。

发布/订阅消息传递是许多软件体系结构的重要组成部分。 某些软件系统要求消息传递解决方案提供高性能,可伸缩性,队列持久性和持久性,故障转移支持,事务以及许多其他令人敬畏的功能,在Java世界中,大多数情况下总是导致使用JMS实现之一提供者。 在我以前的项目中,我一直积极使用Apache ActiveMQ (现在转向Apache ActiveMQ Apollo )。 尽管这是一个很好的实现,但有时我只需要简单的排队支持,而Apache ActiveMQ看上去就显得过于复杂了。

备择方案? 请欢迎Redis pub / sub! 如果您已经在使用Redis作为键/值存储,那么很少的其他配置行将立即将发布/订阅消息传递到您的应用程序。

Spring Data Redis项目很好地抽象了Redis pub / sub API,并为使用Spring功能与JMS集成的每个人提供了如此熟悉的模型。

与往常一样,让我们​​从POM配置文件开始。 这是相当小的,简单的,包括必要的春天的依赖, 春天Redis的数据和Jedis ,伟大的Java客户端Redis的 。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelversion>4.0.0</modelversion><groupid>com.example.spring</groupid><artifactid>redis</artifactid><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><properties><project.build.sourceencoding>UTF-8</project.build.sourceencoding><spring.version>3.1.1.RELEASE</spring.version></properties><dependencies><dependency><groupid>org.springframework.data</groupid><artifactid>spring-data-redis</artifactid><version>1.0.1.RELEASE</version></dependency><dependency><groupid>cglib</groupid><artifactid>cglib-nodep</artifactid><version>2.2</version></dependency><dependency><groupid>log4j</groupid><artifactid>log4j</artifactid><version>1.2.16</version></dependency><dependency><groupid>redis.clients</groupid><artifactid>jedis</artifactid><version>2.0.0</version><type>jar</type></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-core</artifactid><version>${spring.version}</version></dependency><dependency><groupid>org.springframework</groupid><artifactid>spring-context</artifactid><version>${spring.version}</version></dependency></dependencies><build><plugins><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><version>2.3.2</version><configuration><source>1.6<target>1.6</target></configuration></plugin></plugins></build>
</project>

继续配置Spring上下文,让我们了解为了使发布者发布一些消息并让消费者使用它们而需要的内容。 了解有关JMS的相应Spring抽象将对此有很大帮助。

  • 我们需要连接工厂-> JedisConnectionFactory
  • 我们需要一个模板供发布者发布消息-> RedisTemplate
  • 我们需要一个消息监听器供使用者使用消息-> RedisMessageListenerContainer

使用Spring Java配置,让我们描述一下上下文:

package com.example.redis.config;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.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;
import org.springframework.data.redis.listener.adapter.MessageListenerAdapter;
import org.springframework.data.redis.serializer.GenericToStringSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.scheduling.annotation.EnableScheduling;import com.example.redis.IRedisPublisher;
import com.example.redis.impl.RedisMessageListener;
import com.example.redis.impl.RedisPublisherImpl;@Configuration
@EnableScheduling
public class AppConfig {@BeanJedisConnectionFactory jedisConnectionFactory() {return new JedisConnectionFactory();}@BeanRedisTemplate< String, Object > redisTemplate() {final RedisTemplate< String, Object > template =  new RedisTemplate< String, Object >();template.setConnectionFactory( jedisConnectionFactory() );template.setKeySerializer( new StringRedisSerializer() );template.setHashValueSerializer( new GenericToStringSerializer< Object >( Object.class ) );template.setValueSerializer( new GenericToStringSerializer< Object >( Object.class ) );return template;}@BeanMessageListenerAdapter messageListener() {return new MessageListenerAdapter( new RedisMessageListener() );}@BeanRedisMessageListenerContainer redisContainer() {final RedisMessageListenerContainer container = new RedisMessageListenerContainer();container.setConnectionFactory( jedisConnectionFactory() );container.addMessageListener( messageListener(), topic() );return container;}@BeanIRedisPublisher redisPublisher() {return new RedisPublisherImpl( redisTemplate(), topic() );}@BeanChannelTopic topic() {return new ChannelTopic( 'pubsub:queue' );}
}

非常简单明了。 @EnableScheduling批注不是必需的,并且仅对于我们的发布者实现是必需的:发布者将每100毫秒发布一次字符串消息。

package com.example.redis.impl;import java.util.concurrent.atomic.AtomicLong;import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.listener.ChannelTopic;
import org.springframework.scheduling.annotation.Scheduled;import com.example.redis.IRedisPublisher;public class RedisPublisherImpl implements IRedisPublisher {private final RedisTemplate< String, Object > template;private final ChannelTopic topic; private final AtomicLong counter = new AtomicLong( 0 );public RedisPublisherImpl( final RedisTemplate< String, Object > template, final ChannelTopic topic ) {this.template = template;this.topic = topic;}@Scheduled( fixedDelay = 100 )public void publish() {template.convertAndSend( topic.getTopic(), 'Message ' + counter.incrementAndGet() + ', ' + Thread.currentThread().getName() );}
}

最后是我们的消息侦听器实现(仅在控制台上打印消息)。

package com.example.redis.impl;import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;public class RedisMessageListener implements MessageListener {@Overridepublic void onMessage( final Message message, final byte[] pattern ) {System.out.println( 'Message received: ' + message.toString() );}
}

太棒了,只有两个小类,一个配置用于将事物连接在一起,并且我们的应用程序中具有完整的发布/订阅消息支持! 让我们以独立方式运行应用程序…

package com.example.redis;import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import com.example.redis.config.AppConfig;public class RedisPubSubStarter {public static void main(String[] args) {new AnnotationConfigApplicationContext( AppConfig.class );}
}

…并在控制台中查看以下输出:

...
Message received: Message 1, pool-1-thread-1
Message received: Message 2, pool-1-thread-1
Message received: Message 3, pool-1-thread-1
Message received: Message 4, pool-1-thread-1
Message received: Message 5, pool-1-thread-1
Message received: Message 6, pool-1-thread-1
Message received: Message 7, pool-1-thread-1
Message received: Message 8, pool-1-thread-1
Message received: Message 9, pool-1-thread-1
Message received: Message 10, pool-1-thread-1
Message received: Message 11, pool-1-thread-1
Message received: Message 12, pool-1-thread-1
Message received: Message 13, pool-1-thread-1
Message received: Message 14, pool-1-thread-1
Message received: Message 15, pool-1-thread-1
Message received: Message 16, pool-1-thread-1
...

大! Redis pub / sub可以做很多事情, Redis官方网站上提供了出色的文档 。

参考:我们的JCG合作伙伴 Andrey Redko在Andriy Redko {devmind}博客上使用Spring从Redis发布/ 订阅 。

翻译自: https://www.javacodegeeks.com/2012/10/redis-pubsub-using-spring.html

使用Spring Redis发布/订阅相关推荐

  1. Spring Boot 使用Redis发布订阅模式处理消息

    Spring Boot 使用Redis发布订阅模式 1. Redis发布订阅模式 2. Spring Boot中订阅消息 2.1 Redis监听器容器配置 2.2 创建通道监听器 2.3 测试订阅功能 ...

  2. google的api key调用次数是多少_Sprint Boot如何基于Redis发布订阅实现异步消息系统的同步调用?...

    前言 在很多互联网应用系统中,请求处理异步化是提升系统性能一种常用的手段,而基于消息系统的异步处理由于具备高可靠性.高吞吐量的特点,因而在并发请求量比较高的互联网系统中被广泛应用.与此同时,这种方案也 ...

  3. Redis发布订阅模式

    使用银行卡消费的时候,银行往往会通过微信.短信或邮件通知用户这笔交易的信息,这便是一种发布订阅模式,这里的发布是交易信息的发布,订阅则是各个渠道.这在实际工作中十分常用,Redis 支持这样的一个模式 ...

  4. 5.Redis 发布订阅

    转自:http://www.runoob.com/redis/redis-tutorial.html Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub ...

  5. python redis订阅_Python -- Redis 发布订阅

    一.前言 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 channel1 ...

  6. 上下文管理、redis发布订阅、RabbitMQ发布订阅、SQLAlchemy

    一.上下文管理 import contextlib @contextlib.contextmanager def work_state(state_list,worker_thread):state_ ...

  7. Redis 发布订阅,小功能大用处,真没那么废材!

    假设我们有这么一个业务场景,在网站下单支付以后,需要通知库存服务进行发货处理. 上面业务实现不难,我们只要让库存服务提供给相关的给口,下单支付之后只要调用库存服务即可. 后面如果又有新的业务,比如说积 ...

  8. Redis发布订阅机制

    1. 什么是Redis Redis是一个开源的内存数据库,它以键值对的形式存储数据.由于数据存储在内存中,因此Redis的速度很快,但是每次重启Redis服务时,其中的数据也会丢失,因此,Redis也 ...

  9. Redis学习---(13)Redis 发布订阅

    Redis 发布订阅 Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息. Redis 客户端可以订阅任意数量的频道. 下图展示了频道 cha ...

最新文章

  1. Java培训找什么样的机构比较好
  2. 《社交网站界面设计(原书第2版)》——1.17 模式还是套话
  3. 双链表嵌套的简单学生信息管理系统
  4. java streamhandler_java中的Lamdba表达式和Stream
  5. Linux之HugePages快速配置
  6. 中关村开发者社区代表向全球发出这样一份倡议!
  7. tensorflow学习笔记(三十四):Saver(保存与加载模型)
  8. 因为计算机丢失d3dx10,Win7打开剑灵游戏提示丢失d3dx10_43.dll怎么解决
  9. python计算球体体积_漫谈超球体的体积公式
  10. 畅购第9天项目总结(Spring Security Oauth2 JWT)
  11. 输入英文句子,导出英语单词个数和英文字母个数 Python
  12. win10 修改用户名
  13. 修真院教学模式三大阶段之真实项目
  14. 华为智慧屏跟Android,华为智慧屏全力打造智慧生活体验 “智慧屏”时代来临
  15. 疫情地图 | 如何制作百色新冠疫情分布行政区地图
  16. 如何使用在线客服转接功能
  17. Spoon系列-概要
  18. 《Cortex-CM3权威指南》——Cortex-CM3基础
  19. 唐骏解禁回IT:十年之内不跳槽
  20. html中td,dd属性,HTML的dl、dt、dd标记制作表格对决Table制作表过

热门文章

  1. nginx停止,平滑重启命令
  2. java中的native关键字有什么作用?(java本地方法)
  3. java泛型程序设计——类型变量限定 + 泛型代码和虚拟机
  4. 基本数据类型与字符串的转换
  5. hibernate在saveOrUpdate时,update报错:a different object with the same identifier value was already assoc
  6. php cdi_CDI和lambda的策略模式
  7. aws fargate_借助Fargate和EKS,AWS甚至可以实现Cloud-ier和Kuberneties-ier
  8. couchbase集群_使用CLI扩展和重新平衡Couchbase集群
  9. lucene学习笔记_学习Lucene
  10. junit测试类叫什么名字_使用Junit测试名称