首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

动态设置缓存expireAfterWrite属性- Caffeine和Spring WebFlux

动态设置缓存expireAfterWrite属性 - Caffeine和Spring WebFlux

基础概念

Caffeine 是一个高性能的Java缓存库,提供了多种缓存策略,包括基于时间的过期策略(如expireAfterWrite)。expireAfterWrite属性指定了缓存项在写入后经过指定时间将被视为过期。

Spring WebFlux 是Spring框架的一部分,用于构建响应式Web应用程序。它支持非阻塞I/O操作,适用于高并发场景。

相关优势

  1. 性能优化:通过缓存频繁访问的数据,减少数据库或其他外部资源的访问次数,提高应用性能。
  2. 响应式编程:结合Spring WebFlux,可以实现非阻塞的缓存操作,进一步提升系统的吞吐量和响应速度。
  3. 灵活性:动态设置expireAfterWrite属性可以根据不同的业务需求灵活调整缓存策略。

类型与应用场景

  • 固定时间过期:适用于数据变化不频繁且对实时性要求不高的场景。
  • 动态时间过期:根据业务逻辑动态调整过期时间,适用于数据变化频繁或对实时性有一定要求的场景。

示例代码

以下是一个使用Caffeine和Spring WebFlux动态设置expireAfterWrite属性的示例:

代码语言:txt
复制
import com.github.benmanes.caffeine.cache.Caffeine;
import org.springframework.cache.CacheManager;
import org.springframework.cache.caffeine.CaffeineCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.server.RouterFunction;
import org.springframework.web.reactive.function.server.ServerResponse;

import java.util.concurrent.TimeUnit;

@Configuration
public class CacheConfig {

    @Bean
    public CacheManager cacheManager() {
        CaffeineCacheManager cacheManager = new CaffeineCacheManager("items");
        cacheManager.setCaffeine(caffeineCacheBuilder());
        return cacheManager;
    }

    Caffeine<Object, Object> caffeineCacheBuilder() {
        return Caffeine.newBuilder()
                .expireAfterWrite(10, TimeUnit.MINUTES); // 默认过期时间
    }

    @Bean
    public RouterFunction<ServerResponse> routes() {
        return RouterFunctions.route(RequestPredicates.GET("/item/{id}"), request -> {
            String id = request.pathVariable("id");
            // 动态设置过期时间
            long dynamicExpireTime = getDynamicExpireTime(id);
            caffeineCacheBuilder().expireAfterWrite(dynamicExpireTime, TimeUnit.MINUTES);
            // 从缓存或数据库获取数据
            Item item = getItemFromCacheOrDb(id);
            return ServerResponse.ok().bodyValue(item);
        });
    }

    private long getDynamicExpireTime(String id) {
        // 根据业务逻辑动态计算过期时间
        // 例如:根据item的类型或其他属性来决定
        return 5; // 示例:5分钟
    }

    private Item getItemFromCacheOrDb(String id) {
        // 实现从缓存或数据库获取数据的逻辑
        return new Item(); // 示例返回
    }
}

遇到的问题及解决方法

问题:动态设置expireAfterWrite属性时,缓存策略没有按预期生效。

原因

  1. 缓存构建器未重新应用:在运行时修改缓存构建器的属性不会影响已经创建的缓存实例。
  2. 缓存管理器未刷新:缓存管理器可能没有正确地重新加载缓存配置。

解决方法

  1. 重新创建缓存实例:在每次请求时重新创建缓存实例,并应用新的过期时间。
  2. 使用缓存注解:结合Spring的缓存注解(如@Cacheable),在方法级别动态设置过期时间。
代码语言:txt
复制
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class ItemService {

    @Cacheable(value = "items", key = "#id", unless = "#result == null")
    public Item getItem(String id) {
        long dynamicExpireTime = getDynamicExpireTime(id);
        // 动态设置过期时间
        caffeineCacheBuilder().expireAfterWrite(dynamicExpireTime, TimeUnit.MINUTES);
        // 从数据库获取数据
        return getItemFromDb(id);
    }

    private long getDynamicExpireTime(String id) {
        // 根据业务逻辑动态计算过期时间
        return 5; // 示例:5分钟
    }

    private Item getItemFromDb(String id) {
        // 实现从数据库获取数据的逻辑
        return new Item(); // 示例返回
    }
}

通过上述方法,可以确保动态设置的expireAfterWrite属性在缓存中正确生效。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring Cache && Caffeine 高性能缓存库

当缓存中的数据量超过了设定的最大值,Caffeine 会自动回收最近最少使用的数据。定时回收:Caffeine 支持定时回收策略,可以设置缓存中的数据在一定时间后被强制回收。...例如,可以设置缓存的最大大小、过期时间、回收策略等。扩展性:Caffeine 支持自定义缓存实现,开发者可以根据需要扩展 Caffeine 的功能。...要在 Spring 中使用 Caffeine 作为缓存实现,需执行以下步骤:添加依赖在你的项目中,添加 Caffeine 和 Spring Cache 的依赖。...Bean,并设置了 Caffeine 的一些基本属性,如过期时间和最大缓存大小。...以下是一个使用 Spring Boot 和 Caffeine 配置多个缓存区域的例子:配置缓存区域在你的 Spring Boot 配置类中,配置多个缓存区域:我们创建了一个 SimpleCacheManager

36210
  • 干掉 GuavaCache:Caffeine 才是本地缓存的王

    话说,中间件的选择上,Spring(SpringBoot)一直是业界的风向标。比如Spring一直使用「Jackson」,而没有使用Gson和fastjson。...限制的元素个数被剔除的原因; GuavaCache和Caffeine差异 剔除算法方面,GuavaCache采用的是「LRU」算法,而Caffeine采用的是「Window TinyLFU」算法,这是两者之间最大...立即失效方面,Guava会把立即失效 (例如:expireAfterAccess(0) and expireAfterWrite(0)) 转成设置最大Size为0。...内存占用对比 Caffeine可以根据使用情况延迟初始化,或者动态调整它内部数据结构。这样能减少对内存的占用。如下图所示,使用了gradle memoryOverhead对内存占用进行了压测。...现代缓存扩展了对历史数据的使用,结合就近程度(recency)和访问频次(frequency)来更好的预测数据。

    2K40

    Caffeine 咖啡因,JDK本地缓存

    认识Caffeine 本地缓存 官网:https://github.com/ben-manes/caffeine/wiki/Home-zh-CN Caffeine是一个基于Java8开发的提供了近乎最佳命中率的高性能的缓存库...可以理解成一个高性能的Map结构,Caffeine提供了三种缓存驱逐策略 基于容量:创建Caffeine对象时设置缓存数量的上香 基于时间:创建Caffeine对象时设置缓存的有效期 基于引用:设置缓存为软引用或弱引用...性能较差 注意:Caffeine设置的元素过期时,不是立马删除,是等下一次读写操作时或系统空闲时完成对数据的清理!...管理Caffeine对象() { return Caffeine.newBuilder() .initialCapacity(100) // 设置初始化大小是...100 .maximumSize(10) // 设置缓存最多存储10个 .expireAfterWrite(Duration.ofSeconds

    86420

    面试官:如何实现多级缓存?

    对于高并发系统来说,有三个重要的机制来保障其高效运行,它们分别是:缓存、限流和熔断。而缓存是排在最前面也是高并发系统之所以高效运行的关键手段,那么问题来了:缓存只使用 Redis 就够了吗?...2.4 使用本地缓存以 Caffeine 本地缓存的使用为例,它在 Spring Boot 项目中的使用如下。...=1000,expireAfterWrite=10s这里 spring.cache.caffeine.spec 是一个 Caffeine 规范字符串,用于设置初始容量、最大容量和写入后过期时间等缓存策略...@Cacheable、@CacheEvict 等注解实现数据的缓存读取和更新,和上面分布式缓存的使用相同,具体示例如下:import org.springframework.cache.annotation.Cacheable...expireAfterWrite:写入缓存后 N 长时间后过期。

    67210

    Caffeine缓存 最快缓存 内存缓存

    Caffeine 不需要实现序列化 Map对象的改进型接口,不涉及任何形式的网络传输和持久化,因此完全不需要实现序列化接口。...(二)本地缓存 本地缓存与分布式缓存对应,缓存进程和应用进程同属于一个JVM,数据的读、写在一个进程内完成。本地缓存没有网络开销,访问速度很快。...原因如下:一是其存储的数据不能主动过期;二是无任何缓存淘汰策略。 三、SpringCache Caffeine作为Spring体系中内置的缓存之一,Spring Cache同样提供调用接口支持。...spring: cache:   type: caffeine 3、缓存管理器 配置缓存管理器:多CacheName配置。...(new CaffeineCache(CacheNameTimeConstant.CACHE_30SECS,             Caffeine.newBuilder().expireAfterWrite

    3K30
    领券