redis缓存序列化的泥坑

  • 1、redis注解序列化不生效
  • 2、自定义序列化过期时间不生效

凡事预则立,不预则废

路过~

最近用springboot和redis过程中,发现一个小问题。问题虽小,但奈何能力不足,用了好久才发现!

1、redis注解序列化不生效

redis序列化有手动序列化注解序列化,我不打算说这个,我也讲不明白~
网上有很多大神讲解,这里我贴上项目里在用到的序列化的类。

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;@Configuration
@EnableCaching
public class MyRedisConfiguration extends CachingConfigurerSupport {/*** 使用redisConnectionFactory作为默认序列化方式* @param redisConnectionFactory* @return*/@Beanpublic RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){RedisTemplate<Object,Object> redisTemplate=new RedisTemplate<>();redisTemplate.setConnectionFactory(redisConnectionFactory);Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);//value序列化redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//key序列化redisTemplate.setKeySerializer(new StringRedisSerializer());//hash序列化redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);redisTemplate.setKeySerializer(jackson2JsonRedisSerializer);redisTemplate.afterPropertiesSet();return redisTemplate;}//    注解模式下序列化问题@Beanpublic RedisCacheConfiguration redisCacheConfiguration() {//      构造config对象,同时设置默认过期时间5min
//      大坑,entryTtl(Duration.ofMinutes(5))要跟在后面,不能写成config.entryTtl(Duration.ofMinutes(5));RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5));config=config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));return config;}
}

坑来了!!!
当我们用到注解时,可能会发现Cacheable可以序列化,但是CachePut却不能使用我们自定义的序列化。
这里就是容易忽略的点,使用CachePut的方法需要reture语句!
因为我们会认为CachePut方法是用来对数据库进行insert操作的,自然容易漏掉return

//正确写法,有return语句
@CachePut(value = "user01" , key = "'findUser' + '[' + #customer.id + ']'")public customer addUser(customer customer){customerMapper.addUser(customer);return customer;    //大坑,CachePut需要返回值,否则无法使用自定义序列化}

其他:

  • CachePut:一般对应updateinset
  • Cacheable:一般对应select,同样需要return语句
  • CacheEvict:一般对应delete
  • 自定义序列化类要注意写注解@EnableCaching,增加CacheManager配置

2、自定义序列化过期时间不生效

看一下我们自定义的序列化类的设置过期时间的部分代码

//    注解模式下序列化问题
@Bean
public RedisCacheConfiguration redisCacheConfiguration() {//      关键地方,设置默认过期时间5minRedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(Duration.ofMinutes(5));config=config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.json()));return config;
}

这里如果写成下面的形式则不生效。这是因为entryTtl并不是对当前对象的值的设置,而是会返回一个新的RedisCacheConfiguration对象。所以下面的形式会失效

config.entryTtl(Duration.ofMinutes(5));

不信可以看看RedisCacheConfiguration这个类的entryTtl方法的实现,信的也可以看

public RedisCacheConfiguration entryTtl(Duration ttl) {Assert.notNull(ttl, "TTL duration must not be null!");return new RedisCacheConfiguration(ttl, this.cacheNullValues, this.usePrefix, this.keyPrefix, this.keySerializationPair, this.valueSerializationPair, this.conversionService);
}

redis缓存序列化的泥坑相关推荐

  1. go redis 序列化_求求你不要手写Redis缓存

    不点蓝字,我们哪来故事? 前言 看到同事手动写的缓存代码,我实在是看不下去了,于是决定改造一下,最终达到自动Redis缓存,不用手动去set了. 使用场景 实时性要求不那么高的业务数据,我们可以在Se ...

  2. 将对象序列化存到redis缓存中

    当前spring框架提供了完整的redis缓存的注解支持,只要在方法前面加上注解@Cacheable 直接去访问这个方法就会自动获取缓存.但是 会存在一种这样的需求就是你不想去访问这方法 就可以当前缓 ...

  3. Spring Boot 结合 Redis 缓存

    Redis官网: 中:http://www.redis.cn/ 外:https://redis.io/ redis下载和安装 Redis官方并没有提供Redis的Windows版本,这里使用微软提供的 ...

  4. Redis缓存数据库安全加固指导(一)

    2019独角兽企业重金招聘Python工程师标准>>> 背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB ...

  5. 高并发下redis缓存穿透问题解决方案

    一.使用场景 我们在日常的开发中,经常会遇到查询数据列表的问题,有些数据是不经常变化的,如果想做一下优化,在提高查询的速度的同时减轻数据库的压力,那么redis缓存绝对是一个好的解决方案. 二.需求 ...

  6. SpringMVC+Mybatis+MySQL配置Redis缓存

    SpringMVC+Mybatis+MySQL配置Redis缓存 1.准备环境: SpringMVC:spring-framework-4.3.5.RELEASE-dist Mybatis:3.4.2 ...

  7. 求求你不要手写redis 缓存set,get

    点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:小 ...

  8. springboot mybatis ehcache_SpringBoot入门建站全系列(十四)集成Redis缓存

    SpringBoot入门建站全系列(十四)集成Redis缓存 一.概述 本地缓存,就是使用应用内使用本地内存将数据暂缓存储,一般数据库的查询如果不怎么改动,可以用本地缓存暂存. 远程缓存,比如redi ...

  9. 注解方式使用 Redis 缓存

    使用缓存有两个前置步骤 在 pom.xml 引入依赖 <dependency><groupId>org.springframework.boot</groupId> ...

最新文章

  1. hive编程指南电子版_第三篇|Spark SQL编程指南
  2. VerifyError: Error #1107: ABC 数据已损坏,尝试的读取操作超出范围
  3. CentOS7.6下安装Ambari
  4. 【Nodejs】npm cnpm 淘宝镜像
  5. mysql数据库配置优化(占cpu过高问题)
  6. 【大数据实战】Logstash采集-Kafka-ElasticSearch检索
  7. Intel早期的CPU和现在MCU相比,表现如何?
  8. HTML实现手机端适配
  9. keil5c语言定义引脚,keil编写C程序是不是不能在函数内定义变量啊,求大神
  10. Delphi更改.exe文件图标
  11. Two Graphs
  12. 搭配Online:瑞幸昔日“盟友”神州优车,与北汽集团达成战略合作
  13. python初级教练员考试题目_JS | 教练,我想做习题8
  14. 第8章 第七天 - 电影网站整合/集成到公众号
  15. 如何用VBA快速批量提取多个工作表名称?
  16. Java 集合框架分析:JAVA集合中的一些边边角角的知识
  17. STM32F105RBT6 can调试
  18. 安卓毕业设计app项目成品在线投票app毕业设计作品
  19. 搜狗智能录音笔C1:实现录音实时转文字,功能颠覆传统
  20. JAVA:实现LeonardoNumber莱昂纳多数算法(附完整源码)

热门文章

  1. 罗大佑无愧于我们的青春
  2. 在各大厂的秋招春招中,笔试面试都是必考的
  3. SpringBoot微服务架构下的MVC模型总结
  4. 硅谷的故事:关于硅谷的学术研究
  5. Android Intent 教程
  6. 顺丰快递单号查询API接口调试demo-快递鸟API接口
  7. 关于数组和对象的一些知识
  8. 判断ip 是内网外网 c++
  9. 扫地机器人单扫和双扫_扫地机器人清扫能力对比分析 - 全文
  10. Oracle的用户及角色