Spring Data Redis 包含了多个模板实现, 用来完成 Redis 数据库的数据存取功能。
1 连接到Redis
Spring Data Redis 为四种 Redis 客户端实现提供了连接工厂:
- JedisConnectionFactory
- JredisConnectionFactory
- LettuceConnectionFactory
- SrpConnectionFactory
配置为 bean
@Bean
public RedisConnectionFactory redisCF() {
JedisConnectionFactory cf = new JedisConnectionFactory();
cf.setHostName("redis-server");
cf.setPort(7379);
cf.setPassword("foobared");
return cf;
}
2 使用 RedisTemplate
Spring Data Redis 提供了两个模板:
- RedisTemplate
- StringRedisTemplate
RedisTemplate 简化 Redis 数据访问, 持久化各种类型的 key 和 value。StringRedisTemplate 扩展了 RedisTemplate,只关注 String 类型。
@Bean
public RedisTemplate<String, Product> redisTemplate(RedisConnectionFactory cf) {
RedisTemplate<String, Product> redis = new RedisTemplate<String, Product>();
redis.setConnectionFactory(cf);
return redis;
}
3 使用 key 和 value 的序列化器
Spring Data Redis 提供了多个这样的序列化器, 包括:
- GenericToStringSerializer: 使用 Spring 转换服务进行序列化;
- JacksonJsonRedisSerializer: 使用 Jackson 1, 将对象序列化为 JSON;
- Jackson2JsonRedisSerializer: 使用 Jackson 2, 将对象序列化为 JSON;
- JdkSerializationRedisSerializer: 使用 Java 序列化;
- OxmSerializer: 使用 Spring O/X 映射的编排器和解排器(marshaler 和 unmarshaler) 实现序列化, 用于 XML 序列化;
- StringRedisSerializer: 序列化 String 类型的 key 和 value。
RedisTemplate 会使用 JdkSerializationRedisSerializer,StringRedisTemplate 默认会使用 StringRedisSerializer。setKeySerializer() 和 setValueSerializer() 方法可以分别设置序列化器。
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用 Jackson2JsonRedisSerialize 替换默认序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
// 设置 value 的序列化规则和 key 的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}