Spring Boot

依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application.yml

spring:
  #redis配置
  redis:
    #database: 3
    host: localhost
    port: 6379
    #password: 123456
    timeout: 500
    jedis:
      pool:
        #最大空闲连接
        max-idle: 8
        #最小空闲连接
        min-idle: 0
        # 如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool 的状态为exhausted(耗尽)
        max-active: 8
        # 等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException
        max-wait: -1

Springboot 2.x 使用的线程池是 lettuce,1.x 是 jedis

编写 RedisTemplate 配置类

@Configuration
public class RedisTemplateConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        // 配置连接工厂
        template.setConnectionFactory(factory);
        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonSeial.setObjectMapper(om);
        // 值采用json序列化
        template.setValueSerializer(jacksonSeial);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        // 设置hash key 和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(jacksonSeial);
        template.afterPropertiesSet();
        return template;
    }
 
    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
        stringRedisTemplate.setConnectionFactory(factory);
        return stringRedisTemplate;
    }
}

Note

RedisTemplate 有两个模板:RedisTemplate 和 StringRedisTemplate。我们不使用 RedisTemplate,RedisTemplate 提供给我们操作对象,操作对象的时候,我们通常是以 json 格式存储。但在存储的时候,RedisTemplate 会使用 Redis 默认的内部序列化器,导致我们存进里面的是乱码之类的东西。当然了,我们可以自己定义序列化(实现Serializable接口,设置serialVersionUID),但是比较麻烦。

所以使用 StringRedisTemplate 模板。StringRedisTemplate 主要给我们提供字符串操作,我们可以将实体类等转成 json 字符串即可,在取出来后,也可以转成相应的对象。

@Autowired
private Gson gson;
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
 
@GetMapping("/redisTemplate")
public User redisTemplate() {
    redisTemplate.opsForValue().set("redisTemplate", new User());
    redisTemplate.expire("redisTemplate", 15, TimeUnit.SECONDS);
    return (User)redisTemplate.opsForValue().get("redisTemplate");
}
 
@GetMapping("/stringRedisTemplate")
public String stringRedisTemplate() {
    stringRedisTemplate.opsForValue().set("redisTemplate", gson.toJson(new User()));
    stringRedisTemplate.expire("redisTemplate", 15, TimeUnit.SECONDS);
    return stringRedisTemplate.opsForValue().get("redisTemplate");
}