为什么重写 redisTemplate

为什么重写 redisTemplate

1.安装 redis

  1. 上传 redis 的安装包
  2. tar -xvf redis-5.0.7.tar.gz
  3. yum -y install gcc-c++
  4. make
  5. make PREFIX=/soft/redis install
  6. cd /soft/redis/bin
  7. ./redis-server redis.conf

2. 集成 redisTemplate

maven 依赖

<dependency>
  <groupId>org.springframework.bootgroupId>
  <artifactId>spring-boot-starter-data-redisartifactId>
  <version>2.4.2version>
dependency>

<dependency>
  <groupId>org.apache.commonsgroupId>
  <artifactId>commons-pool2artifactId>
  <version>2.9.0version>
dependency>

<dependency>
  <groupId>com.fasterxml.jackson.coregroupId>
  <artifactId>jackson-annotationsartifactId>
  <version>2.8.5version>
dependency>

<dependency>
  <groupId>com.fasterxml.jackson.coregroupId>
  <artifactId>jackson-databindartifactId>
  <version>2.11.4version>
dependency>

Controller 代码

@RestController
public class TestController {

    @Resource
    private RedisTemplate redisTemplate;

    @GetMapping("/testRedis")
    public void testRedis() {
        redisTemplate.opsForValue().set("name", "jichi");
    }
}

application.yaml 配置文件

spring: 
 redis:
    host: localhost
    port: 6379
    password: password
    database: 0
    # 指定 redis 连接池,有两种:1.lettuce 2.jedis
    lettuce:
      pool:
        # 最大连接数
        max-active: 20
        # 最大空闲连接数
        max-idle: 8
        # 最大等待时间,单位 ms,-1 表示永远等待
        max-wait: -1
        # 最小空闲
        min-idle: 0

如果启动过程中发生如下 Bug,说明我们 redis 连接池的配置没有在 maven 依赖中导入 apache.commons.pool2 的包

Caused by: java.lang.ClassNotFoundException: org.apache.commons.pool2.impl.GenericObjectPoolConfig

程序成功启动之后,我们访问 /testRedis 接口再去 Redis 可视化客户端查看刚添加的数据发现是乱码:

为什么重写 redisTemplate_第1张图片

这个乱码就是由于我们 RedisTemplate 默认使用 Jdk 序列化造成的,如果我们想要可视化更好一些我们可以自己封装配置一个。

@Configuration
public class RedisConfig {

    // 帮助我们序列化属性,我们怎么做序列化,我们对什么属性做操作
    @Resource
    private ObjectMapper objectMapper;

    /**
     * redis 的 key 都是 String,但是它的 value 可能有各种各样的东西
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // String 序列化
        RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        // 连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 普通 key(String) 序列化规则配置
        redisTemplate.setKeySerializer(redisSerializer);
        // hash key(String) 序列化规则配置
        redisTemplate.setHashKeySerializer(redisSerializer);

        // 重点:value 的序列化
        // value 是对象-->要配置 jackson 进行配置
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer());
        return redisTemplate;
    }

    /**
     * 自定义序列化器
     * 实现自己的 Jackson 的序列化器
     */
    private Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer() {
        // 因为我们要序列化的是 Object 所以我们整一个 Object.class 作为参数
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
        // 我们对哪些属性做序列化
        // PropertyAccessor.ALL 所有方法都进行序列化
        // JsonAutoDetect.Visibility.ANY 告知序列化范围,ALL 下的 ANY 任何东西都要给它序列化
        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 设置序列化报错:可能存在序列化时字符串和属性对不上,它可能找不到,可以用下面规避一下报错
        // DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES 找不到属性的时候禁用报错,参数2:设置是否开启,直接给它 false 禁用掉
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
        return jackson2JsonRedisSerializer;
    }
}

然后重启项目再进行访问 /testRedis,查看 Redis 客户端:

为什么重写 redisTemplate_第2张图片

你可能感兴趣的:(Redis中文文档,redis)