一、redisTemplate简介
“简化 Redis 数据访问代码的助手类。”在redisTemplate的官方API中是这样介绍的。 它的中心方法是execute,支持Redis访问代码实现RedisCallback接口。它提供了RedisConnection处理,因此RedisCallback实现和调用代码都不需要明确关心检索/关闭 Redis 连接或处理连接生命周期异常。对于典型的单步操作,有各种方便的方法。他底层是通过jedis或者lettuce两种连接器实现的。
二、创建连接
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
这时可直接注入一个redisTemplate实例超值redis,但是此时连接地址是local,端口是6379,如果需要配置其他地址可以在配置文件中配置
spring:
redis:
host: 192.168.1.12
port: 6379
测试
@Resource
RedisTemplate redisTemplate;
@Test
public void redisTemplateConnectionRedisTest(){
redisTemplate.opsForValue().set("aaa","fff");
System.out.println(redisTemplate.opsForValue().get("aaa"));
}
测试结果 连接成功并且能够操作redis,我们再通过redis客户端去看一眼,发现好像事情不太对,在redis客户端中显示的key和value前面多了一串字节符号 我们通过控制台执行get命令也获取不到value 这是因为RedisTemplate默认采用的是jdk的序列化策略,存入的是字节数组,如果只需要用到redis的字符串类型,这时可以使用stringRedisTemplate,它采用的是String的序列化策略,存入的是字符串
@Resource
StringRedisTemplate stringRedisTemplate;
@Test
void contextLoads() {
stringRedisTemplate.opsForValue().set("bbb","sss");
}
再通过redis客户端查看,发现这好像是我们预期的样子 那如果我们不只使用redis的string类型,还想使用其他类型怎么办呢,那我们只能修改redisTemplate的序列化策略了 我们这里使用Jackson2JsonRedisSerializer来序列化,因为这种形式的序列化效率较高,并且可以存储对象, 配置RedisTemplate使用Jackson2序列化配置类
@Configuration
public class RedisConfig_JacksonSerializer {
@Resource
RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisTemplate<String, Object> jsonRedisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
template.setKeySerializer(stringRedisSerializer);
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.registerModule(new JavaTimeModule());
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
template.setValueSerializer(jackson2JsonRedisSerializer);
return template;
}
}
测试一下
@Resource(name="jsonRedisTemplate")
RedisTemplate jsonRedisTemplate;
@Test
public void redisTemplateConnectionRedisTest_JacksonSerializer(){
jsonRedisTemplate.opsForValue().set("ddd","sss");
User user = new User(1,"阿布");
jsonRedisTemplate.opsForValue().set("as",user);
User as = (User) jsonRedisTemplate.opsForValue().get("as");
System.out.println(as);
}
测试结果,能够正常序列化与反序列化,并且序列化的时候可以存储类的路径,方便反序列化 注意:实体类必须实现无参构造器,否则无法反序列化 这时我们发现存入对象没有问题,但是我们再来看看我们顺手存进去的字符串,发现多存了一对引号 那我们再写一段代码看一眼这样会不会有什么问题 发现好像没什么问题,就是有点犯强迫症,查了写资料也没解决双引号这个问题,那我们存字符串的时候就用StringRedisTemplate,需要存储对象或者使用redis的map数据类型的时候用自己设置了序列化方式的RedisTemplate,也希望有大神能指教一下这个问题出在哪,比较有问题找不到原因心里挺膈应的
RedisTemplet的集群连接方式和连接池配置
咳咳,还没研究完,下次再发
|