如何使用Caffeine和Spring Boot配置多个缓存

发布时间:2022-02-28 11:25:17 作者:小新
来源:亿速云 阅读:598

这篇文章主要介绍了如何使用Caffeine和Spring Boot配置多个缓存,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

缓存是几乎所有应用程序性能的关键。有时需要分布式缓存,但并非总是如此。在许多情况下,本地缓存可以正常工作,并且不需要分布式缓存的开销和复杂性。

因此,在许多应用程序中,包括普通的 Spring 和 Spring Boot,您可以在任何方法上使用@Cacheable,其结果将被缓存,以便下次调用该方法时,返回缓存的结果。

Spring 有一些默认的缓存管理器实现,但外部库总是比简单的实现更好、更灵活。例如,Caffeine 是一个高性能的 Java 缓存库。Spring Boot 带有一个CaffeineCacheManager. 因此,理想情况下,您只需创建一个缓存管理器 bean 并为您的带有@Cacheable注释的方法缓存。

但是,提供的缓存管理器允许您仅配置一种缓存规范。缓存规范包括到期时间、初始容量、最大大小等。因此,此缓存管理器下的所有缓存都将使用单个缓存规范创建。缓存管理器支持预定义缓存列表以及动态创建的缓存,但在这两种情况下都使用单个缓存规范。这对生产很少有用。作为一般规则,您必须小心使用内置缓存管理器。

这篇文章告诉您如何使用自定义规范定义自定义缓存。但是,这些选项不支持内置管理器支持的动态默认缓存规范用例。理想情况下,您应该能够使用任何名称@Cacheable并自动使用某些默认规范创建缓存,但您还应该可以选择覆盖特定缓存的名称。

这就是为什么我决定使用比在代码中定义所有缓存更简单的方法,以提供更大的灵活性。它扩展了CaffeineCacheManager提供该功能:

/**
 * Extending Caffeine cache manager to allow flexible per-cache configuration
 */
public class FlexibleCaffeineCacheManagerextends CaffeineCacheManagerimplements InitializingBean {
    private Map<String, String> cacheSpecs =new HashMap<>();
 
    private Map<String, Caffeine<Object, Object>> builders =new HashMap<>();
 
    private CacheLoader cacheLoader;
 
    @Override
    public void afterPropertiesSet()throws Exception {
        for (Map.Entry<String, String> cacheSpecEntry : cacheSpecs.entrySet()) {
            builders.put(cacheSpecEntry.getKey(), Caffeine.from(cacheSpecEntry.getValue()));
        }
    }
 
    @Override
    @SuppressWarnings("unchecked")
    protected Cache<Object, Object> createNativeCaffeineCache(String name) {
        Caffeine<Object, Object> builder = builders.get(name);
        if (builder ==null) {
            return super.createNativeCaffeineCache(name);
        }
 
        if (this.cacheLoader !=null) {
            return builder.build(this.cacheLoader);
        }else {
            return builder.build();
        }
    }
 
    public Map<String, String> getCacheSpecs() {
        return cacheSpecs;
    }
 
    public void setCacheSpecs(Map<String, String> cacheSpecs) {
        this.cacheSpecs = cacheSpecs;
    }
 
    public void setCacheLoader(CacheLoader cacheLoader) {
        super.setCacheLoader(cacheLoader);
        this.cacheLoader = cacheLoader;
    }
}

简而言之,它为每个规范创建一个咖啡因构建器,并在需要新缓存时使用它而不是默认构建器。

然后示例 XML 配置将如下所示:

<bean id="cacheManager" class="net.bozho.util.FlexibleCaffeineCacheManager">
    <property name="cacheSpecification" value="expireAfterWrite=10m"/>
    <property name="cacheSpecs">
        <map>
            <entry key="statistics" value="expireAfterWrite=1h"/>
       </map>
    </property>
</bean>

使用 Java 配置非常简单——您只需设置cacheSpecs映射。

虽然 Spring 已经变成了一个提供各种功能的庞大框架,但它并没有放弃可扩展性的设计原则。

扩展内置框架类是经常发生的事情,它应该在每个人的工具箱中。这些类是在考虑扩展的情况下创建的 - 您会注意到CaffeineCacheManagerare中的许多protected方法。所以我们应该在需要的时候利用它。

感谢你能够认真阅读完这篇文章,希望小编分享的“如何使用Caffeine和Spring Boot配置多个缓存”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

推荐阅读:
  1. springboot之本地缓存(guava与caffeine)
  2. springboot整合spring @Cache和Redis

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

caffeine springboot spring

上一篇:Spring中工厂模式的特性是什么

下一篇:Laravel队列如何使用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》