redis缓存序列化的泥坑
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
:一般对应update
、inset
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缓存序列化的泥坑相关推荐
- go redis 序列化_求求你不要手写Redis缓存
不点蓝字,我们哪来故事? 前言 看到同事手动写的缓存代码,我实在是看不下去了,于是决定改造一下,最终达到自动Redis缓存,不用手动去set了. 使用场景 实时性要求不那么高的业务数据,我们可以在Se ...
- 将对象序列化存到redis缓存中
当前spring框架提供了完整的redis缓存的注解支持,只要在方法前面加上注解@Cacheable 直接去访问这个方法就会自动获取缓存.但是 会存在一种这样的需求就是你不想去访问这方法 就可以当前缓 ...
- Spring Boot 结合 Redis 缓存
Redis官网: 中:http://www.redis.cn/ 外:https://redis.io/ redis下载和安装 Redis官方并没有提供Redis的Windows版本,这里使用微软提供的 ...
- Redis缓存数据库安全加固指导(一)
2019独角兽企业重金招聘Python工程师标准>>> 背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB ...
- 高并发下redis缓存穿透问题解决方案
一.使用场景 我们在日常的开发中,经常会遇到查询数据列表的问题,有些数据是不经常变化的,如果想做一下优化,在提高查询的速度的同时减轻数据库的压力,那么redis缓存绝对是一个好的解决方案. 二.需求 ...
- SpringMVC+Mybatis+MySQL配置Redis缓存
SpringMVC+Mybatis+MySQL配置Redis缓存 1.准备环境: SpringMVC:spring-framework-4.3.5.RELEASE-dist Mybatis:3.4.2 ...
- 求求你不要手写redis 缓存set,get
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达 今日推荐:硬刚一周,3W字总结,一年的经验告诉你如何准备校招! 个人原创100W+访问量博客:点击前往,查看更多 作者:小 ...
- springboot mybatis ehcache_SpringBoot入门建站全系列(十四)集成Redis缓存
SpringBoot入门建站全系列(十四)集成Redis缓存 一.概述 本地缓存,就是使用应用内使用本地内存将数据暂缓存储,一般数据库的查询如果不怎么改动,可以用本地缓存暂存. 远程缓存,比如redi ...
- 注解方式使用 Redis 缓存
使用缓存有两个前置步骤 在 pom.xml 引入依赖 <dependency><groupId>org.springframework.boot</groupId> ...
最新文章
- hive编程指南电子版_第三篇|Spark SQL编程指南
- VerifyError: Error #1107: ABC 数据已损坏,尝试的读取操作超出范围
- CentOS7.6下安装Ambari
- 【Nodejs】npm cnpm 淘宝镜像
- mysql数据库配置优化(占cpu过高问题)
- 【大数据实战】Logstash采集-Kafka-ElasticSearch检索
- Intel早期的CPU和现在MCU相比,表现如何?
- HTML实现手机端适配
- keil5c语言定义引脚,keil编写C程序是不是不能在函数内定义变量啊,求大神
- Delphi更改.exe文件图标
- Two Graphs
- 搭配Online:瑞幸昔日“盟友”神州优车,与北汽集团达成战略合作
- python初级教练员考试题目_JS | 教练,我想做习题8
- 第8章 第七天 - 电影网站整合/集成到公众号
- 如何用VBA快速批量提取多个工作表名称?
- Java 集合框架分析:JAVA集合中的一些边边角角的知识
- STM32F105RBT6 can调试
- 安卓毕业设计app项目成品在线投票app毕业设计作品
- 搜狗智能录音笔C1:实现录音实时转文字,功能颠覆传统
- JAVA:实现LeonardoNumber莱昂纳多数算法(附完整源码)