【Spring】Spring 注解缓存介绍

使用场景

​ 当我们需要频繁读取一些数据时,为了提高性能,可以将这些数据缓存起来,避免每次都从数据库中读取。而为了实现缓存,Spring 提供了一些缓存注解,可以方便地实现缓存功能。

实现原理

​ 在 Spring 中,缓存的实现是通过缓存管理器来实现的。

缓存管理器负责缓存的创建、读取、更新和删除等操作。Spring 提供了多种缓存管理器的实现,例如 Ehcache、Redis、Caffeine 等。

​ 当一个方法被标记为缓存方法时,Spring 会先查找是否存在缓存,如果存在,则直接从缓存中读取数据,不执行方法。如果缓存中不存在,则执行方法并将结果缓存到缓存中。

当一个方法被标记为更新或删除缓存方法时,Spring 会根据注解中的参数来更新或删除缓存。

例如,@CachePut 注解会将方法的结果缓存起来,而 @CacheEvict 注解会删除缓存

基本使用

开启缓存

@EnableCaching注解

​ 该注解由Spring框架提供,该注解需要配置在类上(SpringBoot中通常配置在项目启动类上),用于开启基于注解的缓存支持

示例:

@SpringBootApplication
@EnableCaching  //开启缓存
@EntityScan(basePackages = "com.wonu.bms.domain.entity")
public class UserApp {
    public static void main(String[] args) {
        SpringApplication.run(UserApp.class,args);
    }
}

常用注解

@Cacheable注解

  • 该注解由Spring框架提供,可以作用于类或者方法(通常用在数据查询方法上),用于对方法的查询结果进行缓存存储。
  • 该注解标注的方法执行顺序

​ 先查询缓存,如果为缓存空则执行方法进入数据库查询,并将结果放入缓存中;如果缓存中有数据,不进入数据库,而是直接使用缓存查询。

注意:有关key属性的值 ,就是缓存空间中一个缓存对象的唯一标识,通常使用SPEL表达式拼接方法参数命名,以便方法调用后动态生成对应的key值
示例:

@CachePut(value="userCache", key="#userId + '-' + #username")
public User updateUser(String userId, String username, User newUser) {
    // 方法逻辑,根据 userId 和 username 更新用户信息

    return newUser;
}
//key 属性中使用了两个参数:userId 和 username。
//使用 "+" 操作符将这两个参数连接起来,'-'为SPEL的参数连接符,生成一个字符串作为 key。
//这样,每次调用 updateUser 方法时,都会根据 userId 和 username 来生成一个唯一的 key
属性描述
value/cacheNames指定缓存空间的名称,必配属性。可以同时指定多个名称空间
(@Cacheable(cacheNames={“comment1”,“comment2”})),如果只指定一个名称空间,那么属性名cacheNames可以省略,即@Cacheable(“comment”)指定了缓存的名称空间为comment
key指定缓存数据的key,默认使用方法参数值,如{key= “#id”} 可以使用SpEL表达式,即为指定缓存数据对应的唯一标识。缓存数据的本质是Map类型数据,key用于指定唯一的标识,value用于指定缓存的数据。
keyGenerator指定缓存数据的key生成器,与key属性二选一使用,指定的是生成器规则而非具体key值
cacheManager/cacheResolver分别用于指定缓存管理器和缓存解析器,二选一,默认不需要配置,如果存在多个缓存管理器(如redis、Ehcache等),可以使用这两个属性分别指定
conditioncondition属性用于对数据进行有条件的选择性存储,如@Cacheable(cacheNames=“comment”,condition=“#comment_id>10”)表示方法参数comment_id的值大于10才会对结果数据进行缓存。
unlessunless属性的作用与condition属性作用相反,即满足条件就不缓存
sync表示数据缓存过程中是否使用异步模式,默认为false

@CachePut注解

  • 该注解作用于类或方法(通常用在数据更新方法上),作用是更新缓存中的数据。
  • 该注解的默认执行顺序是:先进行方法调用,然后将方法结果更新到缓存中因而标注的方法必须包含返回值
  • 该注解属性与@Cacheable注解的属性完全相同
  • key 属性的值可以是#result.xxx,而@Cacheable中key不可以,因为@Cacheable标记的方法不一定会被调用(直接在缓存中查找了)

@CacheEvict注解

  • 该注解作用于类或方法(通常用在数据删除方法上),作用是删除缓存数据。

  • 该注解的默认执行顺序是:先进行方法调用,然后清除缓存

  • 除与@Cacheable注解相同的属性外,还提供了两个特殊属性

allEntries表示是否清除指定缓存空间中的所有缓存数据,默认值为false(即false时只删除key属性对应的缓存数据),如@CacheEvict(cacheNames=“comment”,allEntries=true)表示方法执行后会删除缓存空间comment中所有的属性。
beforeInvocation表示是否在方法执行之前进行缓存清除,默认值为false(即默认在执行方法后在进行缓存清除),如@CacheEvict(cacheNames=“comment”,beforeInvocation=true)表示在方法执行之前进行缓存清理。需要注意的是,如果该值设置为true,会存在一定弊端。如果在进行数据删除的方法中发生了异常,这回导致数据并没有被删除但是缓存数据却被提前清除了

@Caching注解

将多个缓存注解组合在一起使用,处理复杂规则的数据缓存,作用于类或者方法。包含cacheable/put/evict三个属性。

@Caching(
    cacheable = @Cacheable(value = "users", key = "#id"),
    put = @CachePut(value = "users", key = "#result.id"),
    evict = @CacheEvict(value = "allUsers", allEntries = true)
)
public User getUserById(Long id) {
    // 从数据库中读取用户信息
}

在上面的例子中,@Caching 注解包含了三个缓存注解:@Cacheable、@CachePut 和 @CacheEvict。当方法被执行时,Spring Boot 会先查找缓存,如果缓存中存在相应的数据,则直接从缓存中读取;如果缓存中不存在,则执行方法并将结果缓存到缓存中;同时更新 users 缓存中的数据,并删除 allUsers 缓存中的所有数据。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值