SpringBoot 缓存使用

185 阅读2分钟

说明

1.springboot 中的缓存遵循 JSR107 规范。

2.spring 中 从 3.1 版本开始,实现了 JSR107规范,进行了缓存的抽象。

3.springboot 中提供了几个方便的注解用来处理缓存,如@Cacheable ,@CacheEvict等。

4.如果不设置缓存类型,默认情况下,会缓存到 JVM中 ,以ConcurrentHashMap 的方式进行缓存。

5.springboot中使用缓存,不引入 spring-boot-starter-cache依赖也可以正常使用。

注意:

  1. 首先需要在启动类或配置类中添加@EnableCaching 开启缓存功能
  2. 在配置文件中指定缓存类型

比如用redis作为缓存,先引入redis依赖,再做以下配置

spring:
  redis:
    host: 127.0.0.1
    password: myRedis
    database: 13
    port: 6379
  cache:
    type: redis

@EnableCaching 开启缓存

@Cacheable 读取缓存

注解参数:

  • cacheNames/value :用来指定缓存组件的名字
  • key :缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值。(这个 key 你可以使用 spEL 表达式来编写)
  • keyGenerator :key 的生成器。 key 和 keyGenerator 二选一使用
  • cacheManager :可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。
  • condition :可以用来指定符合条件的情况下才缓存
  • unless :否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。当然你也可以获取到结果进行判断。(通过 #result 获取方法结果)
  • sync :是否使用异步模式。

😄示例:

    /**
     * 获取数据(先从缓存中找如果没有再执行方法获取数据)
     *
     * @param id
     * @return
     */
    @Cacheable(value = "cache:test", key = "#id")
    public String getDataById(String id) {
        log.info("未走缓存获取数据");
        //todo 一些查询数据操作
        return "cache:" + id;
    }

@CachePut 更新缓存

😄示例:

    /**
     * 更新数据并更新缓存 (更新方法需要返回更新后的数据)
     *
     * @param id
     * @return
     */
    @CachePut(value = "cache:test", key = "#id")
    public String updateDataById(String id) {
        //todo 一些更新业务数据操作
        return "update:" + id;
    }

@CacheEvict 删除缓存

😄示例:

    /**
     * 删除数据并删除缓存
     *
     * @param id
     */
    @CacheEvict(value = "cache:test", key = "#id")
    public void deleteDataById(String id) {
        //todo 一些删除数据操作
    }

@CacheConfig 缓存集中配置

所有的@Cacheable()里面都有一个value=“xxx”的属性,如果重复写相同的配置也挺麻烦的,,可以使用@CacheConfig集中配置相同配置属性

@CacheConfig("books")
    public class BookRepositoryImpl implements BookRepository {

        @Cacheable
        public Book findBook(ISBN isbn) {...}
    }

@Caching 组合多个缓存注解

有时候我们可能组合多个Cache注解使用;比如用户新增成功后,我们要添加id–>user;username—>user;email—>user的缓存;此时就需要@Caching组合多个注解标签了。

@Caching(put = {
@CachePut(value = "user", key = "#user.id"),
@CachePut(value = "user", key = "#user.username"),
@CachePut(value = "user", key = "#user.email")
})
public User save(User user) {