Spring @Cacheable自定义缓存过期时间的实现示例

 更新时间:2024年05月27日 11:56:27   作者:路漫修远 上下求索  
本文主要介绍了Spring @Cacheable自定义缓存过期时间的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

实现效果

原来的@Cacheable使用方式:

@Cacheable(value = "userinfo", key = "#dto.userId")

实现后的使用方式:

@Cacheable(value = "userinfo#30#m", key = "#dto.userId")

实现代码

创建一个自定义的缓存管理器,继承自RedisCacheManager

public class CustomRedisCacheManager extends RedisCacheManager {
    
    public CustomRedisCacheManager(RedisCacheWriter cacheWriter, RedisCacheConfiguration defaultCacheConfiguration) {
        super(cacheWriter, defaultCacheConfiguration);
    }

    /**
     * 重写createRedisCache方法
     * @param name 原来的name只是作为redis存储键名
     *             重写的name可通过"#"拼接过期时间:
     *             1. 如果没有"#"则默认不设置过期时间
     *             2. 拼接的第一个"#"后面为过期时间,第二个"#"后面为时间单位
     *             3. 时间单位的表示使用: d(天)、h(小时)、m(分钟)、s(秒), 默认为h(小时)
     * @param cacheConfig
     * @return
     */
    @Override
    protected RedisCache createRedisCache(String name, RedisCacheConfiguration cacheConfig) {
        // 解析name,设置过期时间
        if (StringUtils.isNotEmpty(name) && name.contains("#")) {
            String[] split = name.split("#");

            // 缓存键名
            String cacheName = split[0];
            // "#"后第一位是时间
            int expire = Integer.parseInt(split[1]);
            // 过期时间,默认为h(小时)
            Duration duration = Duration.ofHours(expire);
            // 根据"#"后第二位字符判断过期时间的单位,设置相应的过期时间,默认时间单位是h(小时)
            if (split.length == 3) {
                switch (split[2]){
                    case "d":
                        duration = Duration.ofDays(expire);
                        break;
                    case "m":
                        duration = Duration.ofMinutes(expire);
                        break;
                    case "s":
                        duration = Duration.ofSeconds(expire);
                        break;
                    default:
                        duration = Duration.ofHours(expire);
                }
            }
            return super.createRedisCache(cacheName, cacheConfig.entryTtl(duration));
        }
        return super.createRedisCache(name, cacheConfig);
    }
}

在redis配置类中,将上面自定义的缓存管理器注册为Bean

@Configuration
@EnableCaching
public class RedisConfig {
    
    /**
     * 自定义RedisTemplate
     * 设置Redis序列化方式,默认使用的是JDKSerializer的序列化方式,效率低,所以这里设置使用FastJsonRedisSerializer
     * @param connectionFactory
     * @return
     */
    @Bean
    @SuppressWarnings(value = {"unchecked", "rawtypes"})
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();

        // 设置redis连接(LettuceConnectionFactory实现了RedisConnectionFactory)
        redisTemplate.setConnectionFactory(connectionFactory);

        FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);

        // key设置StringRedisSerializer序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value设置FastJsonRedisSerializer序列化
        redisTemplate.setValueSerializer(serializer);

        // Hash key设置序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // Hash value设置序列化
        redisTemplate.setHashValueSerializer(serializer);

        return redisTemplate;
    }


    /**
     * 实例化自定义的缓存管理器
     * @param redisTemplate
     * @return
     */
    @Bean
    @SuppressWarnings(value = {"unchecked", "rawtypes"})
    public RedisCacheManager redisCacheManager(RedisTemplate redisTemplate) {
        RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(Objects.requireNonNull(redisTemplate.getConnectionFactory()));
        RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(redisTemplate.getValueSerializer()));
        return new CustomRedisCacheManager(redisCacheWriter, redisCacheConfiguration);
    }
}

到此这篇关于Spring @Cacheable自定义缓存过期时间的实现示例的文章就介绍到这了,更多相关Spring @Cacheable缓存过期时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • java 实现增量同步和自定义同步的操作

    java 实现增量同步和自定义同步的操作

    这篇文章主要介绍了java 实现增量同步和自定义同步的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-01-01
  • Hadoop中的压缩与解压缩案例详解

    Hadoop中的压缩与解压缩案例详解

    压缩就是通过某种技术(算法)把原始文件变下,相应的解压就是把压缩后的文件变成原始文件,本文给大家分享Hadoop中的压缩知识,感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • Java中json与javaBean几种互转的讲解

    Java中json与javaBean几种互转的讲解

    今天小编就为大家分享一篇关于Java中json与javaBean几种互转的讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • SpringBoot整合Echarts绘制静态数据柱状图和饼图

    SpringBoot整合Echarts绘制静态数据柱状图和饼图

    这篇文章给大家介绍了SpringBoot整合Echarts绘制静态数据柱状图和饼图,文中通过代码示例给大家介绍的非常详细,具有一定的参考价值,需要的朋友可以参考下
    2024-03-03
  • Java异常分类处理抛出捕获操作详解

    Java异常分类处理抛出捕获操作详解

    异常就是不正常,比如当我们身体出现了异常我们会根据身体情况选择喝开水、吃药、看病、等 异常处理方法。 java异常处理机制是我们java语言使用异常处理机制为程序提供了错误处理的能力,程序出现的错误,程序可以安全的退出,以保证程序正常的运行等
    2022-09-09
  • java设计优化之单例模式

    java设计优化之单例模式

    这篇文章主要为大家详细介绍了java设计优化中的单例模式,深入学习java单例模式,感兴趣的朋友可以参考一下
    2016-03-03
  • 解决Java压缩zip异常java.util.zip.ZipException:duplicate entry:问题

    解决Java压缩zip异常java.util.zip.ZipException:duplicate entry

    这篇文章主要介绍了解决Java压缩zip异常java.util.zip.ZipException:duplicate entry:问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • Java 详解如何获取网络接口信息

    Java 详解如何获取网络接口信息

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实践中才能获得能力的提升,本篇文章手把手带你用Java获取网络接口的信息,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • 关于@Qualifier("beanName")用法

    关于@Qualifier("beanName")用法

    @Qualifier用于精确指定Bean,@Primary设为默认,两者共存时,@Qualifier优先级更高,可灵活选择具体实现,解决依赖注入歧义,兼顾简洁与可配置性
    2025-09-09
  • java构造器 默认构造方法及参数化构造方法

    java构造器 默认构造方法及参数化构造方法

    构造器也叫构造方法、构造函数,是一种特殊类型的方法,负责类中成员变量(域)的初始化。构造器的用处是在创建对象时执行初始化,当创建一个对象时,系统会为这个对象的实例进行默认的初始化,下面文章将进入讲解,需要的朋友可以参考下
    2021-10-10

最新评论