redis除了常用的当做缓存外,还可以当做简单的消息中间件,实现消息发布订阅

spring集成redis,可以使用spring-data-redis

首先引入相关maven依赖(此处我spring相关版本是4.3.13.RELEASE,具体版本对应大家可自行查看官网文档),如下:

  1. <dependency>
  2. <groupId>org.springframework.data</groupId>
  3. <artifactId>spring-data-redis</artifactId>
  4. <version>1.4.2.RELEASE</version>
  5. </dependency>
  6.  
  7. <dependency>
  8. <groupId>redis.clients</groupId>
  9. <artifactId>jedis</artifactId>
  10. <version>2.6.2</version>
  11. </dependency>

下面开始进行spring相关配置,此处采用xml配置。配置如下:

1、pub端配置,消息发送主要通过RedisTemplate的convertAndSend方法,官网样例如下:

发送demo:

  1. // send message through connection RedisConnection con = ...
  2. byte[] msg = ...
  3. byte[] channel = ...
  4. con.publish(msg, channel); // send message through RedisTemplate
  5. RedisTemplate template = ...
  6. template.convertAndSend("hello!", "world"); //第一个参数是chanel名称, 第二个参数是发送的消息
  1. <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
  2. <property name="maxTotal" value="1000"/> <!-- 控制一个pool可分配多少个jedis实例 -->
  3. <property name="maxIdle" value="200" /> <!-- 控制一个pool最多有多少个状态为idle(空闲)的jedis实例 -->
  4. <property name="maxWaitMillis" value="2000" /> <!-- 表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException -->
  5. <property name="testOnBorrow" value="true" /> <!-- 在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的 -->
  6. </bean>
  7.  
  8. <bean id="jedisConnFactory"
  9. class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
  10. p:use-pool="true" p:hostName="192.168.1.116" p:port="6379" p:password="" p:pool-config-ref="poolConfig"/>
  11.  
  12. <!-- redis template definition -->
  13. <bean id = "redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
  14. <property name="connectionFactory" ref="jedisConnFactory"/>
  15. <property name="keySerializer">
  16. <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"></bean>
  17. </property>
  18. </bean>

2、sub端配置

  1.     <bean id="messageListener" class="org.springframework.data.redis.listener.adapter.MessageListenerAdapter">
  2. <constructor-arg ref="redisMessageListener"/>
  3. </bean>
  4.  
  5. <bean id="redisContainer" class="org.springframework.data.redis.listener.RedisMessageListenerContainer">
  6. <property name="connectionFactory" ref="jedisConnFactory"/>
  7. <property name="messageListeners">
  8. <map>
  9. <entry key-ref="messageListener">
  10. <list>
                  <!--监听的chanel列表-->
  11. <bean class="org.springframework.data.redis.listener.ChannelTopic">
  12. <constructor-arg value="product_bank"/>
  13. </bean>
  14. <bean class="org.springframework.data.redis.listener.ChannelTopic">
  15. <constructor-arg value="product_trust"/>
  16. </bean>
  17. </list>
  18. </entry>
  19. </map>
  20. </property>
  21. </bean>
  1. com.tianwen.dcdp.redis.RedisMessageListener.java 代码如下:
  1. package com.tianwen.dcdp.redis;
  2.  
  3. import java.io.Serializable;
  4.  
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.data.mongodb.core.MongoTemplate;
  9. import org.springframework.data.mongodb.core.query.Criteria;
  10. import org.springframework.data.mongodb.core.query.Query;
  11. import org.springframework.data.redis.connection.Message;
  12. import org.springframework.data.redis.connection.MessageListener;
  13. import org.springframework.data.redis.core.RedisTemplate;
  14. import org.springframework.stereotype.Component;
  15.  
  16. import com.tianwen.dcdp.common.CollectionEnum;
  17. import com.tianwen.dcdp.finance.task.BankProfTask;
  18. import com.tianwen.dcdp.finance.task.TrustProfTask;
  19. import com.tianwen.dcdp.pojo.FinanceBankWithBLOBs;
  20. import com.tianwen.dcdp.pojo.FinanceTrustWithBLOBs;
  21. import com.tianwen.dcdp.service.impl.TaskServiceImpl;
  22.  
  23. @Component("redisMessageListener")
    //实际处理消息的类
  24. public class RedisMessageListener implements MessageListener {
  25.  
  26. @Autowired
  27. private RedisTemplate<Serializable, Serializable> redisTemplate;
  28.  
  29. @Autowired
  30. private MongoTemplate mongoTemplate;
  31.  
  32. private Logger logger = LoggerFactory.getLogger(RedisMessageListener.class);
  33.  
  34. @Override
  35. public void onMessage(Message message, byte[] pattern) {
  36. byte[] bodyByte = message.getBody(); //消息内容
  37. byte[] channelByte = message.getChannel(); //监听的chanel
  38. String channel = redisTemplate.getStringSerializer().deserialize(channelByte); //消息反序列变化时,需要与消息发送时的redisSerializer一致
  39. String body = (String) redisTemplate.getValueSerializer().deserialize(bodyByte);
  40. logger.debug("received message : {} , from channel : {}", new Object[] {body, channel});
  41. if(channel.equalsIgnoreCase("product_bank")) {
  42. FinanceBankWithBLOBs bank = mongoTemplate.findOne(Query.query(Criteria.where("_id").is(body)),
  43. FinanceBankWithBLOBs.class, CollectionEnum.BANK.name());
  44. //计算产品特性
  45. if(bank != null) {
  46. TaskServiceImpl.ext.execute(new BankProfTask(mongoTemplate, bank));
  47. }
  48. } else if(channel.equalsIgnoreCase("product_trust")) {
  49. FinanceTrustWithBLOBs trust = mongoTemplate.findOne(Query.query(Criteria.where("_id").is(body)),
  50. FinanceTrustWithBLOBs.class, CollectionEnum.TRUST.name());
  51. //计算产品特性
  52. if(trust != null) {
  53. TaskServiceImpl.ext.execute(new TrustProfTask(mongoTemplate, trust));
  54. }
  55. }
  56. }
  57.  
  58. }

,到此,配置完毕,当监听的chanel有消息进入时,就会调用上述的onMessage方法。

若实际消息处理类没有实现MessageListener接口,查看MessageListenerAdapter源码发现,可通过为其配置defaultListenerMethod参数,指定具体的消息处理方法名称。

spring 集成 redis -- pub/sub的更多相关文章

  1. Spring集成Redis集群(含spring集成redis代码)

    代码地址如下:http://www.demodashi.com/demo/11458.html 一.准备工作 安装 Redis 集群 安装参考: http://blog.csdn.net/zk6738 ...

  2. Spring Data Redis—Pub/Sub(附Web项目源码)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  3. Spring Data Redis—Pub/Sub(附Web项目源码) (转)

    一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...

  4. spring集成redis

    redis是一种非关系型数据库,与mongoDB不同的是redis是内存数据库,所以访问速度很快.常用作缓存和发布-订阅式的消息队列.redis官方没有提供windows版本的软件.windows版本 ...

  5. spring 集成redis客户端jedis(java)

    spring集成jedis简单实例   jedis是redis的java客户端,spring将redis连接池作为一个bean配置. “redis.clients.jedis.JedisPool”,这 ...

  6. spring集成redis,集成redis集群

    原文:http://chentian114.iteye.com/blog/2292323 1.通过spring-data-redis集成redis pom.xml依赖包 <project xml ...

  7. Spring集成Redis方案(spring-data-redis)(基于Jedis的单机模式)(待实践)

    说明:请注意Spring Data Redis的版本以及Spring的版本!最新版本的Spring Data Redis已经去除Jedis的依赖包,需要自行引入,这个是个坑点.并且会与一些低版本的Sp ...

  8. spring集成redis——主从配置以及哨兵监控

    Redis主从模式配置: Redis的主从模式配置是非常简单的,首先我们需要有2个可运行的redis环境: master node : 192.168.56.101 8887 slave node: ...

  9. Spring集成Redis缓存

    作者:13 GItHub:https://github.com/ZHENFENG13 版权声明:本文为原创文章,未经允许不得转载. 整合Redis 本来以为类似的Redis教程和整合代码应该会很多,因 ...

随机推荐

  1. vector relation

    ::std::vector<> 的存储管理 以下成员函数用于存储管理: void reserve( size_t n ); size_t capacity() const; void re ...

  2. Android TabHost控件 右侧留空并增加按钮

    涉及公司内部程序,部分地方进行模糊处理. 公司Android程序的一个子程序UI要进行改版,最初的UI添加按钮是在内容区,而且TabHost空间是正常的标题平均分布.如下图(其实这是改版的第一版,没有 ...

  3. iOS NSFileManager对沙盒文件及目录添加删除操作

    iOS 使用 NSFileManager对沙盒里面的文件和目录,增加,修改,删除操作: - (void)viewDidLoad { [super viewDidLoad]; self.title = ...

  4. 无比强大!Python抓取cssmoban站点的模版并下载

    Python实现抓取http://www.cssmoban.com/cssthemes站点的模版并下载 实现代码 # -*- coding: utf-8 -*- import urlparse imp ...

  5. iOS 调用音乐播放以及视频播放器

    音乐播放 NSString *path = [[NSBundle mainBundle] pathForResource:@"预谋" ofType:@"mp3" ...

  6. js 常用类型转换简写

    1.字符串转数字 +'666' 2.转换为字符串 ''+666 //'666'

  7. windwos at 以及shutdown使用方法

    at 12:00 shutdown -r如果今天12点没过去,今天12点重启,如果今天12点已经过去,明天12点重启.每天12点重启的命令是at 12:00 /every:Monday,Tuesday ...

  8. struts 简单前台用户名校验

    一个jsp <?xml version="1.0" encoding="GB18030" ?> <%@ page language=" ...

  9. android studio教学视频资源(点开即看)

    android studio教学视频资源(点开即看) 自从Google推出android studio之后.包含github在内的非常多第三方代码库项目很多其它的採用的android studio编译 ...

  10. 忽略警告注解@SuppressWarnings详解

    简介:java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上. 作用:告诉编译器忽略指定的警告 ...