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.mzph.cn/news/118207.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SparkSQL执行流程与Catalyst优化器

目录 一、SparkSQL运行流程与Catalyst优化器 &#xff08;1&#xff09;RDD运行流程 &#xff08;2&#xff09;SparkSQL自动优化 &#xff08;3&#xff09;Catalyst优化器流程 &#xff08;4&#xff09;Catalyst优化器总结 &#xff08;5&#xff09;Spark SQL执行流程 一、…

HttpClient远程使用大全

一 HttpClient简介 1.1 概述 HttpClient只能以编程的方式通过其API用于传输和接受HTTP消息。主要实现功能&#xff1a; 实现了所有 HTTP 的方法&#xff08;GET、POST、PUT、HEAD、DELETE、HEAD、OPTIONS 等&#xff09; 支持 HTTPS 协议 支持代理服务器&#xff08;Nginx…

【网络安全 --- xss-labs靶场通关(11-20关)】详细的xss-labs靶场通关思路及技巧讲解,让你对xss漏洞的理解更深刻

如果需要安装各种系统&#xff0c;虚拟机&#xff0c;工具等等关注我&#xff0c;已经在出系统的课程了 一&#xff0c;靶场安装 超详细的靶场安装教程如下&#xff0c;提供工具&#xff0c;靶场&#xff0c;镜像等 【网络安全 --- xss-labs靶场】xss-labs靶场安装详细教程&…

前端跨域相关

注&#xff1a;前端配置跨域后服务器端&#xff08;Nginx&#xff09;也需要配置&#xff0c;否则接口无法访问 vue跨域 配置文件 /vue.config.js devServer: { port: 7100, proxy: { /api: { target: http://域名, changeOrigin: true, logLevel: debug, pathRewrite: { ^/…

Linux 通过 sed 命令过滤指定日期的日志文件并输出到新文件

sed -n /2023-10-18T09:00:00/,/2023-10-18 12:00:00/p mysql_slow.log > out.log

程序员想要网上接单却不知道如何是好?那这篇文章你可得收藏好了!

作为一名程序员&#xff0c;想要网上接单赚赚零花钱&#xff0c;提高生活水平&#xff0c;这当然是无可厚非的&#xff0c;甚至有许多人已经将网上接单作为主业。 可是面对网上五花八门的接单平台&#xff0c;看着网上真真假假的信息&#xff0c;你真的清楚如何选择吗&#xf…

深度学习_6_实战_点集最优直线解_代码解析

问题描述&#xff1a; 上述题目的意思为&#xff0c;人工造出一些数据点&#xff0c;对我们的模型y Xw b ∈进行训练&#xff0c;其中标准模型如下&#xff1a; 其中W和X都为张量&#xff0c;我们训练的模型越接近题目给出的标准模型越好 训练过程如下&#xff1a; 人造数…

用傲梅分区软件分割分区重启系统蓝屏BAD_SYSTEM_CONFIG_INFO,八个解决参考方案

环境: Win11 专业版 HP 笔记本 傲梅分区软件 闪迪16G U盘 Win10 官方镜像文件 Win11PE 系统安装U盘 USB固态硬盘盒 问题描述: 起因 开始使用windows自动磁盘管理工具压缩不了磁盘,提示无法将卷压缩到超出任何不可移动的文件所在点,关闭系统保护还原,删除系统创建…

VSCode C/C++ 分目录+多文件编译配置2

前言&#xff1a;介绍 task.json 和 launch.json 文件 task.json 和 launch.json 是用于配置 VS Code 编辑器中的任务 和 调试功能的两个重要文件。 task.json 文件用于配置任务&#xff0c;它定义了执行特定操作的任务&#xff0c;并提供了相应的命令和参数。以下是 task.js…

2、Linux权限理解

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 前言 Linux权限的概念 1.文件访问者的分(人) 2.文件类型和访问权限(事物属性) 3.文件权限值的表示方法 4.文件访问权限的相关设置方法 file指令 目录的权限 粘滞位 关于权限的总结 前言 在开始Linux权限理…

muduo源码剖析之EventLoop事件循环类

简介 EventLoop.cc就相当于一个reactor&#xff0c;多线程之间的函数调用(用eventfd唤醒)&#xff0c;epoll处理&#xff0c;超时队列处理&#xff0c;对channel的处理。运行loop的进程被称为IO线程&#xff0c;EventLoop提供了一些API确保相应函数在IO线程中调用&#xff0c;…

Linux | 1.Linux环境与版本

目录 1.以下哪个命令输出Linux内核的版本信息&#xff1a; 2.linux 2.6.* 内核默认支持的文件系统有哪些&#xff1f;[多选] 3.linux查看cpu占用的命令是什么&#xff1f; 4.在Linux系统中, 为找到文件try_grep含有以a字母为行开头的内容, 可以使用命令&#xff1f; 5.在使…

力扣每日一题67:二进制求和

题目描述&#xff1a; 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a "11", b "1" 输出&#xff1a;"100" 示例 2&#xff1a; 输入&#xff1a;a "1010", b "…

Java实现Fisher‘s Exact Test 的置信区间的计算

实现代码 package com.bgi.aigi.common.utils;public class FisherExactUtils {public static double[] getConfidenceInterval(double[][] data) {if (datanull||data.length!2||data[0].length!2||data[1].length!2) {return null;}double[] intervalnew double[2];double …

神经网络中epoch、batch、batchsize区别

目录 1 epoch 2 batch 3 batchsize 4 区别 1 epoch 当数据集中的全部数据样本通过神经网络一次并且返回一次的过程即完成一次训练称为一个epoch。 当我们分批学习时,每次使用过全部训练数据完成一次Forword运算以及一次BP运算,称为完成了一次epoch。 epoch时期 = 所有训练…

C++ 流程控制(分支、循环、跳转)

#include<iostream>using namespace std;int main() {// 单分支和双分支cout << "please enter your age:" << endl;int age;cin >> age;if(age > 18){cout << "welcome! adult." << endl;}else{cout << &qu…

excel常用的几个函数

1、MID函数 通常用来返回返回指定字符串中的子串。 函数公式&#xff1a; MID(string, starting_at, extract_length) String&#xff08;必填&#xff09;&#xff1a;包含要提取字符的文本字符串 starting_at&#xff08;必填&#xff09;&#xff1a;文本中要提取的第一个字…

解决el-tooltip滚动时悬浮框相对位置发生变化

获取最外层box的class&#xff0c;并在内层添加el-scrollbar <template><div class"ChartsBottom"><el-scrollbar><ul class""><li v-for"(item, index) in list" :key"index"><div class"con…

YOLO目标检测——行人数据集【含对应voc、coco和yolo三种格式标签+划分脚本】

实际项目应用&#xff1a;智能监控、人机交互、行为分析、安全防护数据集说明&#xff1a;行人检测数据集&#xff0c;真实场景的高质量图片数据&#xff0c;数据场景丰富标签说明&#xff1a;使用lableimg标注软件标注&#xff0c;标注框质量高&#xff0c;含voc(xml)、coco(j…

docker-compose安装ES7.14和Kibana7.14(有账号密码)

一、docker-compose安装ES7.14.0和kibana7.14.0 1、下载镜像 1.1、ES镜像 docker pull elasticsearch:7.14.0 1.2、kibana镜像 docker pull kibana:7.14.0 2、docker-compose安装ES和kibana 2.1、创建配置文件目录和文件 #创建目录 mkdir -p /home/es-kibana/config mkdir…