当前位置: 首页 > news >正文

springboot缓存篇之内置缓存

前言

前面我们讲了mybatis的一级缓存和二级缓存,这种缓存是基于持久层的缓存,存在很大的局限性。这篇文章主要分享一下另外的一种缓存方式,springboot的内置缓存,看看内置缓存的用法和它的优劣。

开启缓存

在使用springboot的内置缓存之前必须做以下两个步骤:

引入依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>

开启缓存

在启动文件加上@EnableCaching注解即可

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

缓存注解

@Cacheable

两个重要的属性 :value和key

其中key指定的是数据在缓存中存储的键,value是只要使用的缓存名称

作用:在方法执行前 Spring 先查看缓存中是否有数据,若有,则直接返回缓存数据:若无数据,则调用方法将方法返回值放入缓存中。

例子:

@Override
@Cacheable(value = "goods-info", key = "#id")
public Goods info(Long id) {log.info("从数据库获取");return goodsMapper.selectByPrimaryKey(id);
}

看控制台日志可以发现,只有第一次会打印"从数据库获取",后续运行接口就直接从缓存中拿,不会再执行方法里面的内容了。

@CachePut

同样的该方法也是有两个重要属性:value和key

作用:将方法返回值放入缓存中

它并不像@Cacheable一样,需要查是否存在缓存,它是直接设置缓存,一般是在新增或更新缓存的时候用到。

例子:

@CachePut`(value = "goods-info", key = "#id")
public Goods update(Goods goods){goodsMapper.updateByPrimaryKeySelective(goods);return goods;
}

@CacheEvict

它的一个重要属性:key,跟上面两个注解的key是一样的意思

作用:删除缓存

例子:

@CacheEvict(value = "order-info", key = "#id")
public void delete(Long id){Goods goods = new Goods();goods.setId(id);goods.setDeleted(0);goodsMapper.updateByPrimaryKeySelective(goods);
}

@Caching

作用:可以通过 @Caching 注解组合多个注解策略在一个方法上.

这个也不难理解,比如说我们在一个方法里面,生成了订单的同时清空了购物车,订单是要缓存的,而购物车是需要清空的,这时是不是要一个组合?

此时我们可以在方法是加上这个注解

@Caching(cacheable = {@Cacheable(value = "order-info", key = "#id")},evict = {@CacheEvict(value = "cart-info", key = "#id")}
)

总结

springboot 的内置缓存使用注解的方式非常简单,它是把数据保存在内存中,因此它的效率非常高,但它同样面临一个问题就是无法在分布式环境中使用。就如之前分享的那篇文章《mybatis的一级缓存和二级缓存》一样,如果存在多个节点,缓存更新的只是当前的节点而不是所有的节点。

http://www.lryc.cn/news/205333.html

相关文章:

  • 微信小程序开发之投票管理及小程序UI的使用
  • EPB功能开发与测试(基于ModelBase实现)
  • 微信小程序:点击按钮出现右侧弹窗
  • EEG脑电信号的具体采集过程
  • SYS/BIOS 开发教程: 创建自定义平台
  • 【Qt样式(qss)-5】qss局部渲染混乱,错乱,不生效的一种原因
  • 最新基于机器学习模型单图换脸离线版软件包及使用方法,本地离线版本模型一键运行(免费下载)
  • 通过VScode连接远程 Linux 服务器修改vue代码
  • Pytorch实现深度学习常见问题
  • ICMP权限许可和访问控制漏洞处理(CVE-1999-0524)
  • Java生成优惠券兑换码并确保唯一性最终添加到数据库
  • 【Linux/脚本/芯片学习】Perl学习
  • 嵌入式实时操作系统的设计与开发(信号量学习)
  • python环境安装教程
  • 【学习笔记】CF1784F Minimums or Medians
  • 如何系列 如何玩转远程调用之OpenFegin+SpringBoot(非Cloud)
  • Python学习第2天-安装pycharm
  • 等电位连接器行业应用综合方案
  • 内裤洗衣机有用吗?最好用的四款内衣洗衣机测评
  • 足底筋膜炎能自愈吗
  • 牛客网刷题-(3)
  • Centos7 安装 Etcd
  • powerjob基于springboot2.1.6.RELEASE版本的问题研究
  • 【AI视野·今日CV 计算机视觉论文速览 第270期】Wed, 18 Oct 2023
  • uni-app小程序,uview-ui组件样式无法穿透修改的解决办法
  • Codeforces Round 515
  • Linux shell编程学习笔记15:定义数组、获取数组元素值和长度
  • k8s部署kafka,并使用zookeeper做注册中心
  • 关于Nginx缓存
  • 为什么Open3D可视化TensorFlow张量速度超慢