Caffeine与Spring cache的各种注解操作

前言

Caffeine 是一个基于 Java 8 的进程内缓存框架,它使用乐观锁技术来提高并发吞吐量,并被誉为最快的缓存之一。Caffeine 是内存型缓存,即缓存与调用者属于同一个应用,具体地说是属于同一个 JVM。它的设计目标是提供高性能、高命中率以及低内存占用的本地缓存解决方案,被描述为 Guava Cache 的加强版和“新一代缓存”。

关于 Caffeine 的使用,其提供了多种灵活的配置选项:

  • 自动加载数据:可以配置缓存在数据不存在时自动加载到本地缓存中,支持异步加载方式。
  • 淘汰策略:可以根据缓存的数量或者数据的存活时间进行淘汰。
  • 异步刷新:当访问已过期的元素时,可以进行异步刷新。
  • 引用封装:Key 会被包装成弱引用,而 Value 可以被包装成弱引用或软引用,以避免内存泄漏。
  • 监听通知:可以配置在数据过期或被删除时收到提醒,还可以设置写入广播机制,将更新通知传播到其他数据源。
  • 统计监控:Caffeine 允许对缓存访问进行统计,帮助开发者了解缓存的使用情况。

Spring Cache是Spring框架提供的一种缓存解决方案,它通过代理模式来简化应用程序中缓存机制的实现。当引入相应的缓存框架时,Spring会自动配置相应的缓存管理器和缓存实现。例如,如果项目中引入了spring-data-redis,Spring会使用RedisCacheManager和RedisCache;如果选择了Caffeine,Spring Cache会默认使用Caffeine作为缓存实现

添加依赖

在pom.xml文件中添加以下依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>
 <dependency>
    <groupId>com.github.ben-manes.caffeine</groupId>
    <artifactId>caffeine</artifactId>
    <version>2.9.2</version>
</dependency>

配置属性

在Spring Boot的application.properties或application.yml文件中,你可以添加一些配置来自定义Caffeine的行为。比如:

spring:
  cache:
    type: caffeine
    caffeine:
      spec: maximumSize=500,expireAfterAccess=600s

这段配置设定了缓存的最大条目数为500,且每个条目在访问后600秒内有效。

启用缓存

在你的Spring Boot应用的主类或者配置类上添加@EnableCaching注解来启用缓存功能。

@SpringBootApplication
@EnableCaching
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

使用缓存

在需要使用缓存的方法上添加@Cacheable注解。例如,假设你有一个查询用户信息的方法:

import org.springframework.cache.annotation.Cacheable;

public class UserService {
   
   @Cacheable(value = "user", key = "#id")
    public User findUserById(String userId) {
        // 这里是获取用户信息的逻辑
    }
}

这里的@Cacheable注解表示该方法的结果将被缓存,value属性指定了缓存名称,key属性指定了缓存键。当调用getUserById方法时,如果缓存中存在对应的数据,则直接返回缓存数据;否则,执行方法体中的代码,并将结果存入缓存中。

通过这些简单的步骤,咱们就能在Spring Boot项目中轻松集成Caffeine缓存了。这样做的好处是显而易见的:利用了Caffeine的高性能缓存特性。
Spring Cache还提供了一系列的注解,用于声明缓存操作。以下是常用的几个注解

  • @Cacheable:用于标记一个方法的返回值将被缓存。当多次调用相同的方法时,如果缓存中有数据,则直接从缓存中获取,而不需要执行方法体。
  • @CachePut:用于标记一个方法的返回值将被放入缓存。每次调用方法时,都会将结果放入缓存中,覆盖原有数据。
  • @CacheEvict:用于标记一个方法执行后需要移除缓存中的元素。可以通过指定key或者配置清除策略来删除缓存。
  • @Caching:用于组合多个缓存操作,可以同时使用@Cacheable、@CachePut和@CacheEvict等注解。
  • @CacheConfig:用于定义缓存的配置信息,例如缓存的名称、过期时间等。

性能优化

  1. 合理设置缓存大小和过期策略

缓存的大小和过期策略直接影响着性能。如果缓存太小,可能无法覆盖到频繁访问的数据,导致高缓存穿透率。如果缓存太大,又可能占用过多内存,影响系统的其他部分。同样,合理设置数据的过期时间也非常关键,可以防止长时间不变的数据占用缓存空间。比如:

Cache<String, String> cache = Caffeine.newBuilder()
    .maximumSize(1000)
    .expireAfterWrite(10, TimeUnit.MINUTES)
    .build();
  1. 根据实际场景选择合适的缓存策略

Caffeine提供了多种缓存策略,比如基于大小的淘汰、基于时间的过期等。理解每种策略的适用场景并选择最合适的,对性能优化至关重要。

最佳实践

  1. 避免缓存污染

缓存污染指的是缓存了大量不常访问的数据。为了避免这种情况,我们应该仔细分析和理解业务场景,确保只缓存那些经常被访问的数据。

  1. 并发控制

在高并发的环境下使用Caffeine,需要考虑线程安全和数据一致性的问题。Caffeine本身是线程安全的,但在更新缓存时,我们应该确保操作的原子性。

  1. 缓存预热

对于一些知道将会被频繁访问的数据,可以在应用启动时进行缓存预热,这样可以提前填充缓存,避免在高峰时段缓存未命中。

通过上述的性能优化技巧和最佳实践,咱们可以更好地利用Caffeine,提升应用的性能和稳定性。当然,每个应用的具体情况都不同,所以最重要的是根据实际情况去灵活调整和优化。记得,不断监控和评估缓存的效果,才能确保缓存策略始终处于最佳状态。

  • 21
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
jetcachespring cache有以下几个区别: 1. 实现方式:jetcache是一个独立的缓存框架,需要单独引入依赖并进行配置。而spring cachespring框架提供的缓存模块,已经集成在spring框架中,可以直接通过注解在方法上使用。 2. 缓存支持:jetcache支持多种缓存实现,包括本地缓存和分布式缓存,比如Caffeine和Redis等。而spring cache默认使用spring框架提供的缓存管理器,可以通过配置选择不同的缓存实现,比如Ehcache和Redis等。 3. 功能特性:jetcache提供了更多的缓存特性,如缓存失效时间、缓存容量限制、缓存预热等。而spring cache功能相对简单,主要提供了缓存注解的支持,如@Cacheable、@CachePut和@CacheEvict等。 4. 扩展性:由于jetcache是一个独立的缓存框架,可以更加灵活地进行定制和扩展。而spring cache作为spring框架的一部分,受限于框架的设计和约束,扩展性相对较低。 综上所述,jetcachespring cache在实现方式、缓存支持、功能特性和扩展性等方面存在差异。选择使用哪个框架应根据具体需求和项目特点来决定。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringCache、JetCacheCaffeineCache本地缓存和其他工具使用](https://blog.csdn.net/qq_32447301/article/details/107193145)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

π克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值