SpringCache的普通使用

简介

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,在springBoot项目中使用。

对,你没有听错,就是加一个注解,就能实现缓存功能

SpringCache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。


针对不同的缓存技术需要实现不同的CacheManager:

如何使用

我们只需要导入spring-boot-start-web,这个依赖,就能够使用SpringCache缓存了,因为其在spring-web-mvc包的context依赖中,就包含了CacheManager

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <scope>compile</scope>
        </dependency>

常用的注解 

导入对应的依赖包后,我们需要在springBoot的启动类中添加@EnableCaching注解,用来开启缓存注解功能 

如果我们是只是使用SpringCache默认的的缓存产品,那些经过上述配置,就已经可以使用了。

@CachePut注解(添加指定缓存)

参数 value: 缓存的名称,每个缓存名称下面可以有多个key

参数 key:缓存的key

我们一般可以在新增的方法上增加,会将方法的返回值缓存起来

那么这个key,我们可以采用动态获取值:是采用Spring Expression Language(SPEL)

比如:

  • 通过#来动态的获取参数中的值,key = "#id" 方法的形参名必须与之一致

  • 也可以动态的获取返回值中的值,key = "#result.code"

 我们可以动态的获取到当前查询用户的id,作为key储存到map中

    @CachePut(value = "users",key = "#id")
    @GetMapping("/user")
    public User getById(Long id){
        User user = userService.getById(id);
        return user;
    }

此时缓存中,就有一条数据了!

@CacheEvict(清除指定缓存)

在更新和删除的方法添加

参数 value: 缓存的名称,每个缓存名称下面可以有多个key

参数 key: 缓存的key

Spring Expression Language(SPEL)的多种意思相同的写法

 下面的写法意思都是相同的

(SPEL)动态获取key的方法有很多种:

  • 通过key = "#p0" 表示获取方法形参的第一个参数

  • key = "#root.args[0]"表示获取方法形参为0号下标的参数 这里下标是从0开始的

  • key = "#id" 直接通过#形参名 就可以动态的获取到这个形参

  • key = "#result.id" 直接从返回值中动态的获取值

@Cacheable

也是跟上面两个相同的用法。

问题

@Cacheable(value = "Msg",key = "#user.id")

但是如果只是这样,就会出现一个问题,当查询到的结果为null时,同样也会写入缓存,但这是我们并不想要的

所以可以加上一个参数 condition:条件,满足条件是才缓存数据

  • 但是Cacheable (SPEL)的condition没有result这个参数

我们还可以使用unless代替,就是当满足这个条件的时候,就不缓存

@Cacheable(value = "Msg",key = "#user.id",unless= "#result == null")

表示不为空时,才添加缓存

总结

SpringCache默认的是根据map进行数据缓存的,其底层是实现ConcurrentMapCacheManager来缓存的

但是map又是基于内存的,如果服务重启后,缓存的数据就会丢失,所以我们想要更持久的保存缓存,还需要借助外界工具

猜你喜欢

转载自blog.csdn.net/m0_62780474/article/details/129363981