首页 > 数据库 >springcache + redis 配置支持缓存ttl失效

springcache + redis 配置支持缓存ttl失效

时间:2023-05-11 19:59:47浏览次数:54  
标签:springcache ttl redis springframework org import 序列化 redisTemplate


package tst; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonTypeInfo; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import lombok.Data; import org.apache.commons.collections4.MapUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.cache.CacheManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.GenericToStringSerializer; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import javax.annotation.Resource; import java.time.Duration; import java.util.HashMap; @Data @Configuration @ConfigurationProperties(prefix = "spring.cache.redis") public class RedisConfig { //如果为空默认为12个小时 @Value("${spring.cache.redis.time-to-live:43200000}") private Long redisKeyTtl; private HashMap<String, Long> customTtl; @Resource private RedisTemplate redisTemplate; /** * 默认的字符串序列画 * * @param factory 工厂类 * @return */ @Primary @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(factory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值 // RedisSerializer<?> stringSerializer = new StringRedisSerializer(); GenericToStringSerializer<String> stringSerializer = new GenericToStringSerializer<>(String.class); //key序列化 redisTemplate.setKeySerializer(stringSerializer); //value序列化 redisTemplate.setValueSerializer(jacksonSerializer()); //Hash key序列化 redisTemplate.setHashKeySerializer(stringSerializer); //Hash value序列化 redisTemplate.setHashValueSerializer(jacksonSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } /** * 设置redis的key 为 String, value为json * ttl 默认为12个小时 * * @return */ @Bean public CacheManager cacheManager() { //1.基本配置 RedisCacheConfiguration defaultCacheConfiguration = RedisCacheConfiguration .defaultCacheConfig() // 设置key为String, value 为自动转Json的Object .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(stringSerializer())) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jacksonSerializer())) // 不缓存null .disableCachingNullValues() // 缓存数据保存12小时 .entryTtl(Duration.ofMillis(redisKeyTtl)); //2.构造一个redis缓存管理器 RedisCacheManager.RedisCacheManagerBuilder redisCacheManagerBuilder = RedisCacheManager.RedisCacheManagerBuilder // Redis 连接工厂 .fromConnectionFactory(redisTemplate.getConnectionFactory()) // 缓存配置 .cacheDefaults(defaultCacheConfiguration) // 配置同步修改或删除 put/evict .transactionAware(); //2.1自定义ttl if(MapUtils.isNotEmpty(customTtl)){ customTtl.forEach((k,v)->{ redisCacheManagerBuilder.withCacheConfiguration(k,defaultCacheConfiguration.entryTtl(Duration.ofMillis(v))); }); } return redisCacheManagerBuilder.build(); } /** * 默认的jacksonSerializer * * @return Jackson2JsonRedisSerializer */ private static Jackson2JsonRedisSerializer jacksonSerializer() { Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); //反序列化时候遇到不匹配的属性并不抛出异常 objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); //序列化时候遇到空对象不抛出异常 objectMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); //反序列化的时候如果是无效子类型,不抛出异常 objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false); //不使用默认的dateTime进行序列化, objectMapper.configure(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS, false); //使用JSR310提供的序列化类,里面包含了大量的JDK8时间序列化类 objectMapper.registerModule(new JavaTimeModule()); //启用反序列化所需的类型信息,在属性中添加@class objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); return jackson2JsonRedisSerializer; } private static GenericToStringSerializer stringSerializer() { return new GenericToStringSerializer<>(String.class); } }

 

 

配置文件中

spring:
  cache:
#    cache-names: xxx-name
    type: REDIS
    redis:
      time-to-live: 28800000
      custom-ttl: { "xxx" : "1000000", "yyy": "6000000"}

 

标签:springcache,ttl,redis,springframework,org,import,序列化,redisTemplate
From: https://www.cnblogs.com/zhangshiwen/p/17392032.html

相关文章

  • 项目Redis缓存设计心得体会
    1,列表类缓存比如一些列表类的缓存,如果列表是跟用户无关的,可以直接对查询的列表进行缓存,比如省份列表、菜单列表等。但是如果列表里面有跟用户相关的属性,比如文档的卡片列表里有用户是否下载过,设计缓存需要注意,可以将用户无关的卡片列表组装后进行缓存,上面的【已下载】【......
  • Redis入门
    引用:【redis】redis快速上手_哔哩哔哩_bilibili20分钟快速入门Redis_哔哩哔哩_bilibiliRedis的hash(哈希类型)数据类型与结构和应用场景_redishash结构fieid必须是相同类型_小洪帽i的博客-CSDN博客07.Redis常用类型-String应用_哔哩哔哩_bilibili1.学习站点:TryRedis......
  • kettle从入门到精通 第十八课 kettle Metadata Injection
    1、MetadataInjection类似于java里面的模版,设置通用的模版,通过输入不同的数据,得到不同的结果。本示例演示两个字段拼接成一个新字段。2、设置模版,设置模版时,只需要根据自己的需要拉取一些控件,以及设置控件之间的关系,无需设置控制的具体属性,有个前提用到的控件需要支持元数据注......
  • redis事务
    redis事务概述redis中事务是一组命令的集合。事务同命令一样是redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。事务的原理是先将属于一个事务的命令发送给redis,然后再让redis依次执行这些命令redis保证一个事务中的所有命令要么都执行,要么都不执行。除此之外,red......
  • 聊一聊redis十种数据类型及底层原理
    概述Redis是一个开源的高性能键值数据库,它支持多种数据类型,可以满足不同的业务需求。本文将介绍Redis的10种数据类型,分别是string(字符串)hash(哈希)list(列表)set(集合)zset(有序集合)stream(流)geospatial(地理)bitmap(位图)bitfield(位域)hyperloglog(基数统计)String概述string......
  • Kettle使用教程
    Kettle使用教程Kettle是什么kettle原本是水壶的意思,是可以将一种类型的数据转换为另一种类型的数据,还可以对同种类型的数据进行筛选,分表操作。对于企业或行业应用来说,经常会遇到各种数据的处理,转换,迁移,掌握一种ETL工具的使用,必不可少,这篇文章介绍的ETL工具是Kettle,现在已经更......
  • python redis 操作
    目的:验证redis集群模式,高可用场景insert.pyfromredisclusterimportClusterBlockingConnectionPool,RedisCluster,ClusterConnectionPooldefinit():startup_nodes=[{'host':'10.12.16.50','port':6379},{......
  • 从缓存的本质说起,说服技术大佬用Redis
    摘要:在技术领域中,没有银弹。我们需要不断探索和研究新的技术,结合具体问题和需求,选择最适合的解决方案。本文分享自华为云社区《知乎问题:如何说服技术老大用Redis?》,作者:勇哥java实战分享。最近在某问答平台看到一个技术讨论:如何说服技术老大用Redis?“他总觉得用Redis每次都要......
  • Windows下安装Redis,并设置开机自动启动
    这篇文章是在Windows上安装redis,关于如何在Linux上安装redis可以参看Redis下载地址:https://github.com/tporadowski/redis/releases1.下载redis,并解压2.打开cmd命令行进入redis文件夹下,输入如下命令redis-server.exeredis.windows.conf 3.打开一个新的cmd,输入命令redis-serve......
  • Linux CentOS7下安装Redis
    这篇文章是在Linux上安装redis,关于如何在window上安装redis可以参看1.下载Redis。进官网下载最新稳定版 https://redis.io/download2.使用工具上传到linux上,默认根目录root即可 3.解压redis,并把redis移到/usr/local目录下 tarxzfredis-6.0.9.tar.gz//解压mvredis-6.0.9......