返回介绍

8.6 发布/订阅功能

发布于 2025-04-22 19:57:20 字数 3342 浏览 0 评论 0 收藏

使用 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

P135a

Spring Data Redis 允许你在 MessageListenerAdapter 上使用 POJO,容器将会使用你所提供的转换器将传入的信息转换为你所自定义的类型,如示例 8-14 所示。

示例 8-14 搭建 MessageListenerAdapter 以及使用 POJO 的简单信息监听器

P135b

BeanMessageListener 如示例 8-15 所示,是一个简单的 POJO,它有一个名为 handleMessage 的方法定义,其第一个参数类型为 BeanMessage(为这个示例任意创建的一个类)。它只有一个名为 message 的属性。我们的 RedisSerializer 会把这个 String 的内容存储为字节。

示例 8-15 使用 JavaConfig 添加 POJO 监听器

P136a

当事件触发时,真正负责调用监听器的组件是 org.springframework.data.redis.listener. RedisMessageListenerContainer。如示例 8-16 所示,它的配置需要 RedisConnectionFactory 和一组监听器。如果在 ApplicationContext 创建它的话,这个容器本身会有生命周期方法,这些方法会被 Spring 容器调用。如果以编码的形式创建这个容器的话,需要手动调用 afterPropertiesSet() 和 start() 方法。但是需要记住的一点是,要在调用 start() 方法之前设置监听器,否则的话,处理方法不能被调用到,这是因为装配已经在 start() 中完成了。

示例 8-16 配置 RedisMessageListenerContainer

P136b

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 配置缓存

P137

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。