springboot自动缓存

111 阅读3分钟

文章目录


前言

项目中缓存技术可以说是使用范围较广的技术了,缓存的出现,解决了很多性能难题,对于整体系统的提升给出了一个很便捷的方法;合理运用缓存事半功倍,spring中其实已经帮我集成好了缓存,可以实现自动缓存,当然有些地方不适用,也确实需要手动缓存;
spring自身不提供缓存的存储实现,需要借助第三方 例如常见的 EhCache、Redis等;
本文采用 redis


一、spring中如何开启缓存

1 引入redis依赖

   <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-redis</artifactId>
            <version>1.4.7.RELEASE</version>
        </dependency>

在yml中配置好redis

  redis:
    host: ***
    # Redis 服务器端连接端口
    port: 6379
    # redis 服务器连接密码
    password: *****
    # 连接超时时间(毫秒)
    timeout: 1000
    # redis 数据库索引,默认为0
    database: 6

2 启动类添加

@EnableCaching 启用缓存

@SpringBootApplication
@MapperScan("com.example.test.mapper*")
@EnableCaching // 这个
public class TestApplication {

    public static void main(String[] args) {
            SpringApplication.run(TestApplication.class, args);
    }

}

二、使用步骤

1.编写示例接口

代码如下:
模拟登录获取token

 /**
     * @Description 
     * 1 开启redis注解,在启动类上 增加@EnableCaching
     * 2 在查询mysql数据库之前  @Cacheable   cacheNames为缓存在redis中的key , key 为该方法的方法名且当版本冲突时必须加上'' 防止报错
     * @Author FL
     * @Date 11:15 2021/8/26
     * @Param [userId]
     **/

    @ApiOperation(value = "/login", notes = "登录")
    @RequestMapping(value = "/login")
    @Cacheable(cacheNames = "user", key = "'login'")
    //@CacheEvict(cacheNames = "user", key = "'login'")
     //@CachePut(cacheNames = "user", key = "'login'")
    public String login(Long userId) {
        String token = UUID.randomUUID().toString();
         UserInfo userInfo = new UserInfo(); // 模拟去数据库获取数据
         System.out.println("查询");
        String userJosn = JSONUtil.toJsonStr(userInfo);
        return token;
    }

2.测试接口

在这里插入图片描述
请求后,在redis中已经缓存了一份;
之后再次请求,会直接从redist中获取,而不会再去做查询
可以从控制台看到证据:

在这里插入图片描述
无论请求多少次,都是第一次会打印 查询, 之后不会再次打印;

3 @Cacheable

首先查询缓存中是否有数据,如果有直接返回,如果没有,查询后缓存结果,然后返回

下面介绍一下 @Cacheable 这个注解的两个属性:
1 cacheNames/value :用来指定缓存组件的名字 其实对于本文,就是redis库中的namespaces
2 key :缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值。(这个 key 你可以使用 spEL 表达式来编写)本文中是写死的,可以获取入参 #userId,就是获取的了
3 值 这里缓存的值,就是当前接口返回的数据; 本文中也就是token; 如果返回的是一个对象,也就是要缓存该对象,记得一定要实现序列化!!!

4

@CacheEvict

删除缓存的数据;
在刚刚的接口上面注释掉 @Cacheable 打开 @CacheEvict,再次调用接口; redis接的reload下!!!
在这里插入图片描述

4 @CachePut

首先执行方法,然后将结果缓存;这也是与 @Cacheable 最大的不同,@CachePut每次都会执行数据库的查询;然后缓存最新结果;
也就相当于更新~~


总结

相信大家对于spring中三个缓存的注解已经有了一定认识;
@Cacheable(cacheNames = “user”, key = “‘login’”)
@CacheEvict(cacheNames = “user”, key = “‘login’”)
@CachePut(cacheNames = “user”, key = “‘login’”)
不要傻傻分不清楚了~~

本文转自 jimolvxing.blog.csdn.net/article/det…,如有侵权,请联系删除。