返回顶部
首页 > 资讯 > 精选 >Spring @Cacheable指定失效时间方法是什么
  • 379
分享到

Spring @Cacheable指定失效时间方法是什么

2023-06-22 05:06:06 379人浏览 独家记忆
摘要

这篇文章主要介绍“spring @Cacheable指定失效时间方法是什么”,在日常操作中,相信很多人在Spring @Cacheable指定失效时间方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法

这篇文章主要介绍“spring @Cacheable指定失效时间方法是什么”,在日常操作中,相信很多人在Spring @Cacheable指定失效时间方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring @Cacheable指定失效时间方法是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Spring @Cacheable指定失效时间

新版本配置

@Configuration@EnableCachingpublic class RedisCacheConfig {    @Bean    public RedisCacheManagerBuilderCustomizer redisCacheManagerBuilderCustomizer() {        return (builder) -> {            for (Map.Entry<String, Duration> entry : RedisCacheName.getCacheMap().entrySet()) {                builder.withCacheConfiguration(entry.geTKEy(),                        RedisCacheConfiguration.defaultCacheConfig().entryTtl(entry.getValue()));            }        };    }     public static class RedisCacheName {         public static final String CACHE_10MIN = "CACHE_10MIN";         @Getter        private static final Map<String, Duration> cacheMap;         static {            cacheMap = ImmutableMap.<String, Duration>builder().put(CACHE_10MIN, Duration.ofSeconds(10L)).build();        }     }  }

老版本配置

interface CacheNames{    String CACHE_15MINS = "sssss:cache:15m";            String CACHE_30MINS = "sssss:cache:30m";            String CACHE_60MINS = "sssss:cache:60m";            String CACHE_180MINS = "sssss:cache:180m";} @Component public class RedisCacheCustomizer            implements CacheManagerCustomizer<RedisCacheManager> {                @Override        public void customize(RedisCacheManager cacheManager) {            // 自定义缓存名对应的过期时间            Map<String, Long> expires = ImmutableMap.<String, Long>builder()                    .put(CacheNames.CACHE_15MINS, TimeUnit.MINUTES.toSeconds(15))                    .put(CacheNames.CACHE_30MINS, TimeUnit.MINUTES.toSeconds(30))                    .put(CacheNames.CACHE_60MINS, TimeUnit.MINUTES.toSeconds(60))                    .put(CacheNames.CACHE_180MINS, TimeUnit.MINUTES.toSeconds(180)).build();            // spring cache是根据cache name查找缓存过期时长的,如果找不到,则使用默认值            cacheManager.setDefaultExpiration(TimeUnit.MINUTES.toSeconds(30));            cacheManager.setExpires(expires);        }    }    @Cacheable(key = "key", cacheNames = CacheNames.CACHE_15MINS)    public String demo2(String key) {        return "abc" + key;  }

@Cacheable缓存失效时间策略默认实现及扩展

之前对Spring缓存的理解是每次设置缓存之后,重复请求会刷新缓存时间,但是问题排查阅读源码发现,跟自己的理解大相径庭。所有的你以为都仅仅是你以为!!!!

背景

目前项目使用的spring缓存,主要是CacheManager、Cache以及@Cacheable注解,Spring现有的缓存注解无法单独设置每一个注解的失效时间,Spring官方给的解释:Spring Cache是一个抽象而不是一个缓存实现方案。

因此对于缓存失效时间(TTL)的策略依赖于底层缓存中间件,官方给举例:ConcurrentMap是不支持失效时间的,而Redis是支持失效时间的。

Spring @Cacheable指定失效时间方法是什么

Spring Cache Redis实现

Spring缓存注解@Cacheable底层的CacheManager与Cache如果使用Redis方案的话,首次设置缓存数据之后,每次重复请求相同方法读取缓存并不会刷新失效时间,这是Spring的默认行为(受一些缓存影响,一直以为每次读缓存也会刷新缓存失效时间)。

可以参见源码:

org.springframework.cache.interceptor.CacheAspectSupport#execute(org.springframework.cache.interceptor.CacheOperationInvoker, java.lang.reflect.Method, org.springframework.cache.interceptor.CacheAspectSupport.CacheOperationContexts)

private Object execute(final CacheOperationInvoker invoker, Method method, CacheOperationContexts contexts) {// Special handling of synchronized invocationif (contexts.isSynchronized()) {CacheOperationContext context = contexts.get(CacheableOperation.class).iterator().next();if (isConditionPassing(context, CacheOperationExpressionEvaluator.NO_RESULT)) {Object key = generateKey(context, CacheOperationExpressionEvaluator.NO_RESULT);Cache cache = context.getCaches().iterator().next();try {return wrapCacheValue(method, cache.get(key, () -> unwrapReturnValue(invokeOperation(invoker))));}catch (Cache.ValueRetrievalException ex) {// The invoker wraps any Throwable in a ThrowableWrapper instance so we// can just make sure that one bubbles up the stack.throw (CacheOperationInvoker.ThrowableWrapper) ex.getCause();}}else {// No caching required, only call the underlying methodreturn invokeOperation(invoker);}}  // Process any early evictionsprocessCacheEvicts(contexts.get(CacheEvictOperation.class), true,CacheOperationExpressionEvaluator.NO_RESULT); // Check if we have a cached item matching the conditionsCache.ValueWrapper cacheHit = findCachedItem(contexts.get(CacheableOperation.class)); // Collect puts from any @Cacheable miss, if no cached item is foundList<CachePutRequest> cachePutRequests = new LinkedList<>();if (cacheHit == null) {collectPutRequests(contexts.get(CacheableOperation.class),CacheOperationExpressionEvaluator.NO_RESULT, cachePutRequests);} Object cacheValue;Object returnValue; if (cacheHit != null && !hasCachePut(contexts)) {// If there are no put requests, just use the cache hitcacheValue = cacheHit.get();returnValue = wrapCacheValue(method, cacheValue);}else {// Invoke the method if we don't have a cache hitreturnValue = invokeOperation(invoker);cacheValue = unwrapReturnValue(returnValue);} // Collect any explicit @CachePutscollectPutRequests(contexts.get(CachePutOperation.class), cacheValue, cachePutRequests); // Process any collected put requests, either from @CachePut or a @Cacheable missfor (CachePutRequest cachePutRequest : cachePutRequests) {cachePutRequest.apply(cacheValue);} // Process any late evictionsprocessCacheEvicts(contexts.get(CacheEvictOperation.class), false, cacheValue); return returnValue;}

因此如果我们需要自行控制缓存失效策略,就可能需要一些开发工作,具体如下。

Spring Cache 失效时间自行刷新

基于Spring的Cache组件进行定制,对get方法进行重写,刷新过期时间。相对简单,不难;此处不贴代码了。

可以使用后台线程进行定时的缓存刷新,以达到刷新时间的作用。

使用spring data redis模块,该模块提供对了TTL更新策略的,可以参见:org.springframework.data.redis.core.PartialUpdate

注意:

Spring对于@Cacheable注解是由spring-context提供的,spring-context提供的缓存的抽象,是一套标准而不是实现。

而PartialUpdate是由于spring-data-redis提供的,spring-data-redis是一套spring关于redis的实现方案。

到此,关于“Spring @Cacheable指定失效时间方法是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Spring @Cacheable指定失效时间方法是什么

本文链接: https://lsjlt.com/news/302611.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring @Cacheable指定失效时间方法是什么
    这篇文章主要介绍“Spring @Cacheable指定失效时间方法是什么”,在日常操作中,相信很多人在Spring @Cacheable指定失效时间方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2023-06-22
  • Spring @Cacheable指定失效时间实例
    目录Spring @Cacheable指定失效时间新版本配置老版本配置@Cacheable缓存失效时间策略默认实现及扩展背景Spring Cache Redis实现Spring Ca...
    99+
    2024-04-02
  • 详解SpringBoot2.0的@Cacheable(Redis)缓存失效时间解决方案
    问题   @Cacheable注解不支持配置过期时间,所有需要通过配置CacheManneg来配置默认的过期时间和针对每个类或者是方法进行缓存失效时间配置。 解决 ...
    99+
    2024-04-02
  • 设置cookie指定时间失效怎么办
    小编给大家分享一下设置cookie指定时间失效怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!实例如下:<!DOCTY...
    99+
    2024-04-02
  • Spring @Cacheable注解类内部调用失效的解决方法
    这期内容当中小编将会给大家带来有关Spring @Cacheable注解类内部调用失效的解决方法,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。@Cacheable注解类内部调用失效如果你只是想使...
    99+
    2023-06-22
  • session php默认失效时间是什么
    本文小编为大家详细介绍“session php默认失效时间是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“session php默认失效时间是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。session...
    99+
    2023-07-04
  • SpringBoot @Cacheable自定义KeyGenerator方式是什么
    这篇文章主要介绍“SpringBoot @Cacheable自定义KeyGenerator方式是什么”,在日常操作中,相信很多人在SpringBoot @Cacheable自定义KeyGenerator方式是什么问题上存...
    99+
    2023-06-22
  • redis@Cacheable注解以及过期时间设置方式是什么
    redis@Cacheable注解以及过期时间设置方式是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。原理解释 友情链接  手写redis @ Ca...
    99+
    2023-06-22
  • javascript设置固定时间的方法是什么
    这篇文章主要介绍“javascript设置固定时间的方法是什么”,在日常操作中,相信很多人在javascript设置固定时间的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • spring动态设置定时任务的方法是什么
    在Spring中,可以使用`TaskScheduler`接口和`@Scheduled`注解来动态设置定时任务。1. 使用`TaskS...
    99+
    2023-08-25
    spring
  • mongodb时间戳转时间的方法是什么
    在MongoDB中要将时间戳转换为时间,可以使用new Date(timestamp)方法。其中timestamp为时间戳的值,单位...
    99+
    2024-04-09
    mongodb
  • Spring事务失效的原因是什么
    本篇内容主要讲解“Spring事务失效的原因是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring事务失效的原因是什么”吧!1、数据库引擎不支持事务这...
    99+
    2024-04-02
  • Spring中为bean指定InitMethod和DestroyMethod的执行方法是什么
    Spring中为bean指定InitMethod和DestroyMethod的执行方法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.创建一个类public&nbs...
    99+
    2023-06-21
  • java空间换时间的方法是什么
    Java空间换时间的方法是使用缓存。在程序运行过程中,将一些计算结果或者数据保存在缓存中,当需要使用的时候直接从缓存中取出,避免了重...
    99+
    2023-05-31
    java空间 java 空间
  • Idea中指定xml文件失效的解决方法
    一、项目场景: 最近狮子在搞一个项目,需要用到数据库多表查询,所以在idea创建了一个xml文件,创建完成之后,这个文件居然只被识别位text文件,而且文件内容没有高亮,如图所示: ...
    99+
    2023-01-28
    Idea指定xml失效 Idea xml失效
  • vue3自定义指令方法是什么
    这篇文章主要讲解了“vue3自定义指令方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“vue3自定义指令方法是什么”吧!一、注册自定义指令以下实例都是实现一个输入框自动获取焦点的自定...
    99+
    2023-06-21
  • prometheus指标定义的方法是什么
    Prometheus指标定义的方法是使用Prometheus的查询语言PromQL来定义和查询指标。PromQL提供了一种灵活的方式...
    99+
    2024-04-02
  • excel时间戳转为php时间戳的方法是什么
    这篇“excel时间戳转为php时间戳的方法是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“excel时间戳转为php时...
    99+
    2023-07-05
  • php时间戳转为js时间戳的方法是什么
    本文小编为大家详细介绍“php时间戳转为js时间戳的方法是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“php时间戳转为js时间戳的方法是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。PHP 时间戳在 ...
    99+
    2023-07-05
  • php时间戳转成js时间戳的方法是什么
    这篇文章主要讲解了“php时间戳转成js时间戳的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php时间戳转成js时间戳的方法是什么”吧!一、PHP中时间戳转换成时间格式在PHP中...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作