Redis - SpringDataRedis
SpringDataRedis 是 SpringData对 Redis的集成模块叫做SpringDataRedis,SpringData是Spring中数据操作模块,包含了对各种数据库的集成
SpringDataRedis的特点:
- 提供了RedisTemplate统一API来操作Redis
- 提供了对不同Redis客户端的整合(Lettuce和Jedis)
- 支持Reds的发布订阅模型
- 支持Redis哨兵和Redis集群
- 支持基于Lettuce的响应式编程
- 支持基于Redis的JDKCollection实现
- 支持基于JDK,JSON,字符串,Spring对象的数据序列化和反序列化
SpringDataRedis API
-
针对jedis客户端中的api进行了归类封装,将同一类型操作封装为operation接口
- ValueOperations:简单K-V操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:针对list类型的数据操作
-
提供了对key的"bound"(绑定)便携化操作API,可以通过bound封装指定的key,然后进行一系列的操作而无须“显式”的再次指定Key,即BoundKeyOperations:
- BoundValueOperations
- BoundSetOperations
- BoundListOperations
- BoundSetOperations
- BoundHashOperations
-
SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中
API 说明 redisTemplate.opsForValue() 操作String类型数据 redisTemplate.opsForHash() 操作Hash类型数据 redisTemplate.opsForList() 操作List类型数据 redisTemplate.opsForSet() 操作Set类型数据 redisTemplate.opsForZSet() 操作SortedSet类型数据 redisTemplate 操作通用命令
2. 序列化/反序列化
-
JdkSerializationRedisSerializer:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream进行序列化操作,最终redis-server中将存储字节序列,默认的序列化方式,每个要存储的对象都要继续Seriallzable 接口的实现,比较笨重,而且其存储的数据为二进制数据,开发者在维护过程中阅读判断大打折扣
-
StringRedisSerializer:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。
-
Jackson2JsonRedisSerializer:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl工具支持】
-
GenericJackson2JsonRedisSerializer: jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。这种方法不需要指明Class
有了上面对序列化的基本理解,接下来就可以在代码中添加全局的序列化配置
@Bean
public RedisTemplate redisTemplate(){
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}