RedisTemplate方法 - String

1. 新增缓存

方法1:通过redisTemplate设置值
redisTemplate.boundValueOps(key).set(value);//不设置过期时间
redisTemplate.boundValueOps(key).set(value,1, TimeUnit.MINUTES);//设置过期时间
方法2:通过BoundValueOperations设置值
BoundValueOperations stringKey = redisTemplate.boundValueOps(key);
stringKey.set(value);//不设置过期时间
stringKey.set(value,1, TimeUnit.MINUTES);//设置过期时间
方法3:通过ValueOperations设置值
ValueOperations ops = redisTemplate.opsForValue();
ops.set(key, value);
ops.set(key, value,1, TimeUnit.MINUTES);

2. 设置key的过期时间

方法1:
redisTemplate.expire(key,1,TimeUnit.MINUTES);
方法2:
redisTemplate.boundValueOps(key).expire(1,TimeUnit.MINUTES);

3. 获取缓存值

方法1:通过redisTemplate设置值
String str1 = (String) redisTemplate.boundValueOps(key).get();
方法2:通过BoundValueOperations设置值
BoundValueOperations stringKey = redisTemplate.boundValueOps(key);
String str2 = (String) stringKey.get();
方法3:通过ValueOperations设置值
ValueOperations ops = redisTemplate.opsForValue();
String str3 = (String) ops.get(key);

4. 顺序递增/递减(一般用来计数使用)

// value类型必须是Long或者Double,递增时使用正整,递减使用负数
redisTemplate.boundValueOps(key).increment(value);
注意:在使用递增递减过程中一定会出现:ERR value is not an integer or out of range 异常
原因:
  • Spring对Redis序列化的策略有两种,分别是StringRedisTemplate和RedisTemplate,其中StringRedisTemplate用于操作字符串,RedisTemplate使用的是JDK默认的二进制序列化(redis序列化是将key,value值先转换为流的形式,再存储到redis中)。

  • RedisTemplate是使用的JdkSerializationRedisSerializer序列化,序列化后的值包含了对象信息,版本号,类信息等,是一串字符串,所以无法进行数值自增操作。

  • 而StringRedisTemplate序列化策略是字符串的值直接转为字节数组,所以存储到redis中是数值,所以可以进行自增操作

解决方案:
  • 方法1:自定义序列化策略,在application启动类中添加如下方法
  • 方法2:配置RedisConfig类,记得在类上加入 @Configuration 注解自动注入

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
      StringRedisTemplate template = new StringRedisTemplate(factory);
      //定义key序列化方式
      //Long类型会出现异常信息;需要我们上面的自定义key生成策略,一般没必要
      //RedisSerializer<String> redisSerializer = new StringRedisSerializer();
      //定义value的序列化方式
      Jackson2JsonRedisSerializer jackson2JsonRedisSerializer
                                    = new Jackson2JsonRedisSerializer(Object.class);
      ObjectMapper om = new ObjectMapper();
      om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
      om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
      jackson2JsonRedisSerializer.setObjectMapper(om);
    
      // template.setKeySerializer(redisSerializer);
      template.setValueSerializer(jackson2JsonRedisSerializer);
      template.setHashValueSerializer(jackson2JsonRedisSerializer);
      template.afterPropertiesSet();
      return template;
    }