Spring Data Redis 介绍

1,397 阅读5分钟

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战


Spring Data RedisSpring整合的Redis访问库。 Spring Data Redis消除应用程序与Redis交互所需的冗余的样板代码,提供了简单的调用方式。Spring Data Redis使应用程序与Redis交互像Spring Data Jpa与数据库交互一样简单。

client(客户端)

Spring Data Redis整合了LettuceJedis两种连接访问Redis的client。

  • Lettuce Lettuce基于Netty实现,在多线程并发访问时线程安全.同时具有可伸缩性,即连接实例不够时可以按需增加连接实例

  • Jedis Jedis直连redis server,多线程环境下非线程安全,除非使用连接池为每个Jedis实例增加物理连接

RedisConnection(连接)

Spring Data Redis使用RedisConnectionFactory(连接工厂)创建安全的RedisConnectionRedisConnectionFactory(连接工厂)支持连接单节点的redis、哨兵模式的redis和集群模式的redis。此外,RedisConnectionFactory(连接工厂)还继承了PersistenceExceptionTranslator支持异常转换,例如将持久性框架抛出的运行时异常转换为DataAccessException层次结构中的相应异常。

image.png

使用RedisConnectionFactory最简单的方法是通过IoC容器配置适当的连接器,并在使用的时候注入

模板工具

Spring Data Redis提供了两个模板工具类:RedisTemplateStringRedisTemplate。这两个类封装了常用了Redis命令,只需要调用相应的方法就可完成对Redis的访问。同时这两个类还提供了回调方法,以便完成特殊的访问需求。

RedisTemplateStringRedisTemplate提供了同样的功能,区别在于序列化的方式不同。RedisTemplate支持多种序列化方式,而StringRedisTemplate只支持StringRedisSerializer

RedisTemplate

操作接口

接口描述
key 类型操作 (redis 各种数据类型对应的操作)
GeoOperationsGeo类型的相关操作
HashOperationshash 类型的相关操作
HyperLogLogOperationsHyperLogLog 类型的相关操作
ListOperationslist 类型的相关操作
SetOperationsset 类型的相关操作
ValueOperationsstring 类型的相关操作
ZSetOperationszset 类型的相关操作
StreamOperationsStream 的相关操作
Key 绑定操作 (绑定Key后返回操作这个key的工具类)
BoundGeoOperations绑定geo类型的key提供的操作
BoundHashOperations绑定hash类型的key提供的操作
BoundKeyOperations绑定hash类型的key提供的操作
BoundStreamOperations绑定Stream类型的key提供的操作
BoundSetOperations绑定set类型的key提供的操作
BoundValueOperations绑定string类型的key提供的操作
BoundZSetOperations绑定zset类型的key提供的操作

执行命令

RedisTemplateStringRedisTemplate中的execute相关方法提供了一个回调RedisCallback参数,RedisCallback运行应用程序直接通过Redis命令操作Redis。

当使用StringRedisTemplate时,回调将接收StringRedisConnection的实例

序列化

RedisTemplate中的序列化涉及到keyvalue hashKey hashValue。在RedisTemplate中有keySerializervalueSerializerhashKeySerializerhashValueSerializer属性分别代表 keyvalue hashKey hashValue的序列化方式,如下图: image.png

Spring Data Redis默认提供了byteArrayjavajsonstring类型的序列化。可以通过RedisSerializer对应的方法获取 image.png

发布/订阅消息

Reids的发布/订阅是实时的,即在订阅者只能接收到订阅之后发布者发布的消息,接收不到订阅之前订阅者发布的消息

发布消息

可以使用两种方式发布消息:RedisConnection#publishRedisTemplate#convertAndSend。这两种方式的区别使RedisConnection需要原始数据(字节数组),RedisTemplate允许将任意对象作为消息传入

image.png

image.png

订阅消息

在接收端,可以通过channel名或使用模式匹配channel的方式订阅一个或多个channel。在Spring Data Redis中订阅消息主要使用RedisMessageListenerContainerMessageListener

  • MessageListener: 消息监听器 每次新消息到达时,都会调用回调并通过onMessage方法运行用户代码。该接口不仅允许访问实际消息,还允许访问已通过的通道以及订阅用于匹配通道的模式(如果有)

MessageListener有一个默认的实现类MessageListenerAdapter,通过MessageListenerAdapter可以将消息处理委托给其他对象的的方法处理

  • RedisMessageListenerContainer:消息监听器容器 RedisMessageListenerContainer用于从Redis接收消息,并将消息转发给MessageListener处理。

RedisMessageListenerContainer允许多个MessageListener共享一个连接和一个线程,即使它们订阅不同的channel

RedisMessageListenerContainer允许更改运行时配置,以便您可以在应用程序运行时添加或删除MessageListener,而无需重新启动。

RedisMessageListenerContainer使用延迟订阅方法,仅在需要时使用重新连接。如果所有的MessageListener都已取消订阅,RedisMessageListenerContainer会自动执行清理,并释放线程。

事务

Redis通过watchunwatchmultiexecdiscard命令提供事务支持。这些操作在RedisTemplate中都有对应的方法。RedisTemplate不能保证使用相同的连接运行事务中的所有操作。如果想要使用相同的连接运行事务中的所有操作可以使用execute相关方法。

image.png

默认情况下,RedisTemplate不开启事务,开启事务可以使用setEnableTransactionSupport(true)方法显式启用事务。

Pipelining (管道)

Redis提供了对管道的支持,即在连续向服务器发送多个命令,最后统一读取响应结果。使用管道可以很好的提高性能。 RedisTemplate中可以使用execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline)方法将pipeline参数传递true开启管道操作。也可以使用executePielined方法在管道中使用RedisCallbackSessionCallback执行操作并返回结果