这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
Spring Data Redis是Spring整合的Redis访问库。 Spring Data Redis消除应用程序与Redis交互所需的冗余的样板代码,提供了简单的调用方式。Spring Data Redis使应用程序与Redis交互像Spring Data Jpa与数据库交互一样简单。
client(客户端)
Spring Data Redis整合了Lettuce和Jedis两种连接访问Redis的client。
-
LettuceLettuce基于Netty实现,在多线程并发访问时线程安全.同时具有可伸缩性,即连接实例不够时可以按需增加连接实例 -
JedisJedis直连redis server,多线程环境下非线程安全,除非使用连接池为每个Jedis实例增加物理连接
RedisConnection(连接)
Spring Data Redis使用RedisConnectionFactory(连接工厂)创建安全的RedisConnection。RedisConnectionFactory(连接工厂)支持连接单节点的redis、哨兵模式的redis和集群模式的redis。此外,RedisConnectionFactory(连接工厂)还继承了PersistenceExceptionTranslator支持异常转换,例如将持久性框架抛出的运行时异常转换为DataAccessException层次结构中的相应异常。
使用
RedisConnectionFactory最简单的方法是通过IoC容器配置适当的连接器,并在使用的时候注入
模板工具
Spring Data Redis提供了两个模板工具类:RedisTemplate和StringRedisTemplate。这两个类封装了常用了Redis命令,只需要调用相应的方法就可完成对Redis的访问。同时这两个类还提供了回调方法,以便完成特殊的访问需求。
RedisTemplate和StringRedisTemplate提供了同样的功能,区别在于序列化的方式不同。RedisTemplate支持多种序列化方式,而StringRedisTemplate只支持StringRedisSerializer
RedisTemplate
操作接口
| 接口 | 描述 |
|---|---|
| key 类型操作 (redis 各种数据类型对应的操作) | |
GeoOperations | Geo类型的相关操作 |
HashOperations | hash 类型的相关操作 |
HyperLogLogOperations | HyperLogLog 类型的相关操作 |
ListOperations | list 类型的相关操作 |
SetOperations | set 类型的相关操作 |
ValueOperations | string 类型的相关操作 |
ZSetOperations | zset 类型的相关操作 |
StreamOperations | Stream 的相关操作 |
| Key 绑定操作 (绑定Key后返回操作这个key的工具类) | |
BoundGeoOperations | 绑定geo类型的key提供的操作 |
BoundHashOperations | 绑定hash类型的key提供的操作 |
BoundKeyOperations | 绑定hash类型的key提供的操作 |
BoundStreamOperations | 绑定Stream类型的key提供的操作 |
BoundSetOperations | 绑定set类型的key提供的操作 |
BoundValueOperations | 绑定string类型的key提供的操作 |
BoundZSetOperations | 绑定zset类型的key提供的操作 |
执行命令
RedisTemplate和StringRedisTemplate中的execute相关方法提供了一个回调RedisCallback参数,RedisCallback运行应用程序直接通过Redis命令操作Redis。
当使用StringRedisTemplate时,回调将接收StringRedisConnection的实例
序列化
RedisTemplate中的序列化涉及到key、value hashKey hashValue。在RedisTemplate中有keySerializer、valueSerializer、hashKeySerializer、hashValueSerializer属性分别代表
key、value hashKey hashValue的序列化方式,如下图:
Spring Data Redis默认提供了byteArray、java、json、string类型的序列化。可以通过RedisSerializer对应的方法获取
发布/订阅消息
Reids的发布/订阅是实时的,即在订阅者只能接收到订阅之后发布者发布的消息,接收不到订阅之前订阅者发布的消息
发布消息
可以使用两种方式发布消息:RedisConnection#publish或RedisTemplate#convertAndSend。这两种方式的区别使RedisConnection需要原始数据(字节数组),RedisTemplate允许将任意对象作为消息传入
订阅消息
在接收端,可以通过channel名或使用模式匹配channel的方式订阅一个或多个channel。在Spring Data Redis中订阅消息主要使用RedisMessageListenerContainer和MessageListener
MessageListener: 消息监听器 每次新消息到达时,都会调用回调并通过onMessage方法运行用户代码。该接口不仅允许访问实际消息,还允许访问已通过的通道以及订阅用于匹配通道的模式(如果有)
MessageListener有一个默认的实现类MessageListenerAdapter,通过MessageListenerAdapter可以将消息处理委托给其他对象的的方法处理
RedisMessageListenerContainer:消息监听器容器RedisMessageListenerContainer用于从Redis接收消息,并将消息转发给MessageListener处理。
RedisMessageListenerContainer允许多个MessageListener共享一个连接和一个线程,即使它们订阅不同的channel
RedisMessageListenerContainer允许更改运行时配置,以便您可以在应用程序运行时添加或删除MessageListener,而无需重新启动。
RedisMessageListenerContainer使用延迟订阅方法,仅在需要时使用重新连接。如果所有的MessageListener都已取消订阅,RedisMessageListenerContainer会自动执行清理,并释放线程。
事务
Redis通过watch、unwatch、multi、exec和discard命令提供事务支持。这些操作在RedisTemplate中都有对应的方法。RedisTemplate不能保证使用相同的连接运行事务中的所有操作。如果想要使用相同的连接运行事务中的所有操作可以使用execute相关方法。
默认情况下,
RedisTemplate不开启事务,开启事务可以使用setEnableTransactionSupport(true)方法显式启用事务。
Pipelining (管道)
Redis提供了对管道的支持,即在连续向服务器发送多个命令,最后统一读取响应结果。使用管道可以很好的提高性能。
RedisTemplate中可以使用execute(RedisCallback<T> action, boolean exposeConnection, boolean pipeline)方法将pipeline参数传递true开启管道操作。也可以使用executePielined方法在管道中使用RedisCallback或SessionCallback执行操作并返回结果