- 内容提要
- 序
- 前言
- 第一部分 背景知识
- 第 1 章 Spring Data 项目
- 第 2 章 Repository:便利的数据访问层
- 第 3 章 使用 Querydsl 实现类型安全的查询
- 第二部分 关系型数据库
- 第 4 章 JPA Repository
- 第 5 章 借助 Querydsl SQL 实现类型安全的 JDBC 编程
- 第三部分 NoSQL
- 第 6 章 MongoDB: 文档存储
- 第 7 章 Neo4j:图数据库
- 第 8 章 Redis:键/值存储
- 第四部分 快速应用开发
- 第 9 章 使用 Spring Roo 实现持久层
- 第 10 章 REST Repository 导出器
- 第五部分 大数据
- 第 11 章 Spring for Apache Hadoop
- 第 12 章 使用 Hadoop 分析数据
- 第 13 章 使用 Spring Batch 和 Spring Integration 创建大数据管道
- 第六部分 数据网格
- 第 14 章 分布式数据网格:GemFire
- 关于封面
8.6 发布/订阅功能
使用 Redis 的另一个重要好处在于其简单快速的发布/订阅功能( http://redis.io/topics/pubsub )。尽管它并没有完整消息代理(message broker)等高级特性,但是 Redis 的发布/订阅功能可以用来创建轻量级和灵活的事件总线。Spring Data Redis 提供了一些帮助类,让这个功能使用起来特别容易。
8.6.1 对信息进行监听和响应
遵循 JMS MessageListenerAdapter 的模式,Spring Data Redis 有一个 MessageListenerAdapter 的抽象,它们的工作方式基本上是相同的,如示例 8-13 所示。按照 JMS,如果你不想与特定的接口绑定的话,那么在所能接受的监听器种类方面,MessageListenerAdapter 是很灵活的。可以传递进来一个带有 handleMessage 方法的 POJO,这个方法的第一个参数可以是 org.springframework.data.redis.connection.Message、String、byte[],或者如果使用了对应的 RedisSerializer,它也可以是任意可转换的类型。可以定义可选的第二个参数,它是触发这次调用的通道(channel)或模式。如果想避免基于反射进行调用(当传递进来 POJO 的时候,会这样做),那么还可以实现 MessageListener 接口,从而为你的 Bean 实现固定的协议。
示例 8-13 使用 JavaConfig 添加简单的 MessageListener
Spring Data Redis 允许你在 MessageListenerAdapter 上使用 POJO,容器将会使用你所提供的转换器将传入的信息转换为你所自定义的类型,如示例 8-14 所示。
示例 8-14 搭建 MessageListenerAdapter 以及使用 POJO 的简单信息监听器
BeanMessageListener 如示例 8-15 所示,是一个简单的 POJO,它有一个名为 handleMessage 的方法定义,其第一个参数类型为 BeanMessage(为这个示例任意创建的一个类)。它只有一个名为 message 的属性。我们的 RedisSerializer 会把这个 String 的内容存储为字节。
示例 8-15 使用 JavaConfig 添加 POJO 监听器
当事件触发时,真正负责调用监听器的组件是 org.springframework.data.redis.listener. RedisMessageListenerContainer。如示例 8-16 所示,它的配置需要 RedisConnectionFactory 和一组监听器。如果在 ApplicationContext 创建它的话,这个容器本身会有生命周期方法,这些方法会被 Spring 容器调用。如果以编码的形式创建这个容器的话,需要手动调用 afterPropertiesSet() 和 start() 方法。但是需要记住的一点是,要在调用 start() 方法之前设置监听器,否则的话,处理方法不能被调用到,这是因为装配已经在 start() 中完成了。
示例 8-16 配置 RedisMessageListenerContainer
8.6.2 在 Redis 中使用 Spring 的缓存抽象
Spring 3.1( http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html /cache.html )引入了通用且可重用的缓存抽象。这样,可以很容易地将方法调用的结果缓存到 POJO 中,而无需明确地管理某些处理过程,如检查缓存条目是否存在、加载新的数据以及过期旧的缓存条目等。在完成这些功能方面,Spring 3.1 为使用各种不同的后端缓存技术提供了帮助。
Spring Data Redis 通过 org.springframework.data.redis.cache.RedisCacheManager 支持了这种通用的缓存抽象。为了将 Redis 指定为缓存后端并在 Spring 中使用缓存的注解,需要在 ApplicationContext 中定义 RedisCacheManager Bean,然后就可以像以往那样对 POJO 添加注解,在想缓存的方法上使用 @Cacheable 注解。
RedisCacheManager 的构造器中需要一个配置好的 RedisTemplate。在本例中,我们让缓存抽象层生成唯一的整数作为缓存的键值。关于缓存管理器如何存储结果方面,有很多的可选项。可以在 @Cacheable 的方法上添加适当的注解( http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/cache.html#cache-annotations )来配置这些行为。在示例 8-17 中,我们对键使用了整数序列化器并对值使用了内置的 JdkSerializationRedisSerializer,原因是我们并不知道所要存储的是什么。使用 JDK 的序列化,就可以缓存任意实现了 Serializable 接口的 Java 对象。
在使用 JavaConfig 时,为了在 ApplicationContext 中启用缓存拦截器,只需在 @Configuration 注解之上再添加 @EnableCaching 就可以了。
示例 8-17 使用 RedisCacheManager 配置缓存
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论