了解SpringBoot项目缓存

1.@EnableCaching

@EnableCaching是启用缓存的注解,将注解标注在SpringBoot项目中的启动类上,就可以开启SpringBoot项目的缓存

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

2、@Cacheable

@Cacheable注解的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存。

参数:

  • cacheNames/value :用来指定缓存组件的名字

  • key :缓存数据时使用的 key,可以用它来指定。默认是使用方法参数的值,key 可以使用 spEL 表达式来编写。

  • condition :可以用来指定符合条件的情况下才缓存

  • unless :否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。

  • sync :是否使用异步模式。

实例

Service层

@Service
public class BookServiceImpl implements IBookService {
    @Autowired
    private IBookMapper iBookMapper;

//对查询的结果进行缓存
  @Cacheable(cacheNames = "findBooks")
    @Override
    public List<Book> findAllBook() {
      //查询所有的书籍
       List<Book> books = iBookMapper.selectList(null);
        return books;
    }
}

Controller层 

@Api(value = "图书Api接口测试")
@RestController
@RequestMapping("/api/book")
@Slf4j
@CrossOrigin
public class BookController {
    @Autowired
    private IBookService iBookService;

    @ApiOperation("查询所有书籍方法接口测试")
    @GetMapping("/findAllBooks")
    public List<Book> findAllBook(){
        long start = System.currentTimeMillis();
        List<Book> allBooks = iBookService.findAllBook();
        long end = System.currentTimeMillis();
       
        log.debug("查询所有功能耗时" + (end - start) + "毫秒");
        return  allBooks;
    }
 }
  •  使用接口测试发送第一次请求

结果: 

 第一次发送请求后,日志中记录了生成的sql语句,说明第一次是在数据库中查找的,查询时间为557毫秒

 

  • 使用接口测试发送第二次请求

结果:

 两次请求之间并没有生成日志,也没有生成sql语句,第二次请求比第一次请求时间也要少很多,说明第二次并没有在数据库中查询,是在缓存中查询的。

3@CachePut

@CachePut的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用

实例:

将Service层的@Cacheable的注解换成@CachePut

@Service
public class BookServiceImpl implements IBookService {
    @Autowired
    private IBookMapper iBookMapper;

//对查询的结果进行缓存
  @CachePut(cacheNames = "findBooks")
    @Override
    public List<Book> findAllBook() {
        List<Book> books = iBookMapper.selectList(null);

        return books;
    }
}


Controller层 

@Api(value = "图书Api接口测试")
@RestController
@RequestMapping("/api/book")
@Slf4j
@CrossOrigin
public class BookController {
    @Autowired
    private IBookService iBookService;

    @ApiOperation("查询所有书籍方法接口测试")
    @GetMapping("/findAllBooks")
    public List<Book> findAllBook(){
        long start = System.currentTimeMillis();
        List<Book> allBooks = iBookService.findAllBook();
        long end = System.currentTimeMillis();
   
        log.debug("查询所有功能耗时" + (end - start) + "毫秒");
        return  allBooks;
    }
 }
  •  使用接口测试发送第一次请求

结果:

  •   使用接口测试发送第二次请求

结果:

         第一次发送请求,日志中显示生成了mysql语句,说明第一次是在数据库中查询的,第二次发送请求,日志中重新生成了mysql语句,说明第二次也是在数据库中查询的。@CachePut注解每次查询的时候都会调用方法,此时缓存会和数据库保持一致,@CachePut注解大部分用在改变数据库数据的方法上。

3、@CacheEvict

 @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
缓存不足可能会导致性能问题。针对Spring Boot应用的缓存不足问题,可以考虑以下几个方面进行优化。 首先,可以调整JVM的内存分配。根据前面引用的内容,可以在Docker启动脚本中指定每个应用的JVM参数。通过调整-Xmx参数来增加堆内存的最大值,以及通过指定-XX:MaxMetaspaceSize参数和-XX:CompressedClassSpaceSize参数来优化非堆内存的分配。根据具体情况,可以适当增加堆内存和调整非堆内存的最大值,以满足应用的需求。提到的,Linux系统使用了一种叫做arena的内存池来增强动态内存分配行为。你可以根据机器的核数来计算最大的arena数量,进而估算应用所使用的内存。 最后,如果你的应用在Windows上运行,还可以使用jconsole.exe来查看可视化的内存使用情况,这可以帮助你更直观地了解应用的内存情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [docker部署的springboot项目,容器经常内存不足,差不多两天就要挂掉一个项目,怎么办?](https://blog.csdn.net/weixin_34112399/article/details/112818779)[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: 50%"] - *2* *3* [springboot内存占用过高问题排查 - jvm内存使用分析](https://blog.csdn.net/XiXavier/article/details/109293207)[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: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值