java-redis java使用redisTemplate连接操作单台Redis

一、redisTemplate简介

“简化 Redis 数据访问代码的助手类。”在redisTemplate的官方API中是这样介绍的。
它的中心方法是execute,支持Redis访问代码实现RedisCallback接口。它提供了RedisConnection处理,因此RedisCallback实现和调用代码都不需要明确关心检索/关闭 Redis 连接或处理连接生命周期异常。对于典型的单步操作,有各种方便的方法。他底层是通过jedis或者lettuce两种连接器实现的。

二、创建连接

导入依赖

<!--Redis-->
<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 对象
        RedisTemplate<String, Object> template = new RedisTemplate<>();

        template.setConnectionFactory(redisConnectionFactory);

        //首先解决key的序列化方式
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        template.setKeySerializer(stringRedisSerializer);

        //解决value的序列化方式
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        ObjectMapper objectMapper = new ObjectMapper();
        
        //序列化结果中添加类路径,方便反序列化
        objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);

        // 解决jackson2无法反序列化LocalDateTime的问题
        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的集群连接方式和连接池配置

咳咳,还没研究完,下次再发


版权声明:本文为m0_46394124原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。