1. 首先搭载开发环境,不会的可以参考笔者之前的文章SpringBoot入门

    添加依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
  1. 开始配置Cache

    a. 在启动类增加一个注解@EnableCaching

@SpringBootApplication
@MapperScan("com.tanoak.mapper")
@EnableCaching
public class BootCacheApplication {

public static void main(String[] args) {
SpringApplication.run(BootCacheApplication.class, args);
}
}
b.  pojo
@Data
public class Teacher {//使用Lombok注解 private Integer id;
private String lastName;
private String email;

/**
*性别 1男 0女
*/
private Integer sex;
private Integer sId;
}
c. Mapper

@Mapper
public interface TeacherMapper {

@Select("SELECT * FROM teacher WHERE id =#{id}")
Teacher getTeaById(Integer id);

@Update("UPDATE teacher SET lastName =#{lastName},email=#{email},sex=#{sex},s_id=#{sId} WHERE id=#{id}")
Integer update(Teacher teacher) ;

@Delete("DELETE FROM teacher WHERE id =#{id}")
Integer deleteById(Integer id) ;

@Insert("INSERT INTO teacher(lastName,email,sex,t_id) VALUES(#{lastName},#{email},#{sex},#{sId})")
Integer insert(Teacher teacher) ;
}
d. Service
public interface TeacherService {

/**
* 根据ID查询实体
* @param id
* @return
*/

Teacher getEmpById(Integer id) ; Integer update(Teacher teacher) ;
Integer remove(Integer id) ;
}

//实现类

@Service
public class TeacherServiceImpl implements TeacherService {

private static final Logger logger = LoggerFactory.getLogger(TeacherServiceImpl.class);

@Resource
private TeacherMapper teacherMapper ;

@Override
@Cacheable(cacheNames = {"emp"},condition = "#id>0")
public Teacher getEmpById(Integer id) {
logger.info("进行查询实体 ID为"+id);
return teacherMapper.getTeaById(id) ;
}

@Override
public Integer update(Teacher teacher) {
logger.info("修改的实体为"+teacher.toString());
return teacherMapper.update(teacher) ;
}

@Override
public Integer remove(Integer id) {
logger.info("删除的实体 ID为"+id);
return teacherMapper.deleteById(id) ;
}
}
e. Controller
@RestController
public class TeacherController {

@Resource
private TeacherService teacherService ;

@GetMapping("/tea/{id}")
@Cacheable(cacheNames = "tea")
public Teacher getTea(@PathVariable("id")Integer id){
return teacherService.getEmpById(id) ;
}
}
然后就开启缓存,本篇文章结束!开个玩笑,在正常的开发中,我们的CRUD需要进行缓存的环节一般是在查询,更新,删除,在一些特殊的业务场景下也会对插入进行缓存,这里不做考虑。然后我们根据需求想要解决这个问题,那么Cache对应的注解就出现了
#根据方法的请求参数对其结果进行缓存
@Cacheable
-----------
#保证方法被调用,又希望结果被缓存。
@CachePut
------------
清空缓存
@CacheEvict
了解这三个注解我们来看下如何使用吧

@Cacheable

这个注解有多个属性

key  缓存的 key 支持SpEl表达式

keyGenerator  自定义Key生成策略  二选一(key or keyGenerator)

condition   符合指定条件缓存

unless 条件为true不缓存
@Override
@Cacheable(cacheNames = "tea",key = "#id",condition = "#id>1")
public Teacher getTeaById(Integer id) {
logger.info("进行查询实体 ID为"+id);
return teacherMapper.getTeaById(id) ;
}

@GetMapping("/tea/{id}")
public Teacher getTea(@PathVariable("id")Integer id){
return teacherService.getEmpById(id) ;
}

自定义KeyGenerator

public class MyKeyGenerator {

@Bean("mykeyGenerator")
public KeyGenerator keyGenerator(){
return new KeyGenerator(){
@Override
public Object generate(Object target, Method method, Object ...params){
return method.getName() +"{"+Arrays.asList(params) +"}";
}
};
}
}

 @Cacheable(cacheNames = "tea",keyGenerator="mykeyGenerator")
public Teacher getTeaById(Integer id) {
logger.info("进行查询实体 ID为"+id);
return teacherMapper.getTeaById(id) ;
} ​
@GetMapping("/tea2/{id}")
public Teacher getTea2(@PathVariable("id")Integer id){
return teacherService.getTeaById(id) ;
}``` 目前解决了查询的缓存,接下来处理更新的缓存 ## @CachePut 这个注解是在方法执行完成后调用的与@Cacheable的调用顺序刚好相反

@GetMapping("/tea")

@CachePut(cacheNames = "tea")

public Teacher upTea(Teacher teacher){

teacherService.update(teacher) ;

return teacher ;

}```

可以看到,再次点击查询的时候没有发送sql语句,说明已经缓存成功

@CacheEvict

清空缓存,来认识一下

@Override
@CacheEvict(cacheNames = "tea",key = "#id")
public Integer remove(Integer id) {
logger.info("删除的实体 ID为"+id);
// return teacherMapper.deleteById(id) ;
return 1 ;
}
//然后再Controller中调用
@GetMapping("/tea3/{id}")
public String delTea(@PathVariable("id")Integer id){
teacherService.remove(id) ;
System.out.println("测试删除缓存 id为"+id);
return "OK" ;
}``` Cache的基本用法到这里就结束了,下片文章我们深入探讨它的运行机制。如理解有误,请指正

SpringBoot Cache 入门的更多相关文章

  1. springBoot从入门到源码分析

    先分享一个springBoot搭建学习项目,和springboot多数据源项目的传送门:https://github.com/1057234721/springBoot 1. SpringBoot快速 ...

  2. SpringData 基于SpringBoot快速入门

    SpringData 基于SpringBoot快速入门 本章通过学习SpringData 和SpringBoot 相关知识将面向服务架构(SOA)的单点登录系统(SSO)需要的代码实现.这样可以从实战 ...

  3. SpringBoot Docker入门,SpringBoot Docker安装

    SpringBoot Docker入门,SpringBoot Docker安装 ================================ ©Copyright 蕃薯耀 2018年4月8日 ht ...

  4. 01-项目简介Springboot简介入门配置项目准备

    总体课程主要分为4个阶段课程: ------------------------课程介绍------------------------ 01-项目简介Springboot简介入门配置项目准备02-M ...

  5. SPRING-BOOT系列之SpringBoot快速入门

    今天 , 正式来介绍SpringBoot快速入门 : 可以去如类似 https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/refer ...

  6. SpringBoot快速入门01--环境搭建

    SpringBoot快速入门--环境搭建 1.创建web工程 1.1 创建新的工程. 1.2  选择maven工程,点击下一步. 1.3 填写groupid(maven的项目名称)和artifacti ...

  7. SpringBoot 初入门

    SpringBoot 初入门 关于介绍什么之类的就不讲了,主要做一下学习记录. 1. 启动方式 IDEA 启动 命令行启动: mvn spring-boot:run 部署到服务器启动: 先进行打包, ...

  8. SpringBoot基础篇-SpringBoot快速入门

    SpringBoot基础 学习目标: 能够理解Spring的优缺点 能够理解SpringBoot的特点 能够理解SpringBoot的核心功能 能够搭建SpringBoot的环境 能够完成applic ...

  9. Springboot快速入门篇,图文并茂

    Springboot快速入门篇,图文并茂 文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!搜索关注微信公众号 [码出Offer] 领取各种学习资料! image-20 ...

随机推荐

  1. Hutool :一个小而全的 Java 工具类库

    Hutool 简介 Hutool 是一个小而全的 Java 工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜的 ...

  2. C语言关于指针函数与函数指针个人理解

    1,函数指针 顾名思义,即指向函数的指针,功能与其他指针相同,该指针变量保存的是所指向函数的地址. 假如是void类型函数指针定义方式可以是 void (*f)(参数列表);亦可以先用 typedef ...

  3. 『言善信』Fiddler工具 — 3、Fiddler界面布局详解【菜单栏】

    目录 (一)Fiddler界面布局介绍 (二)菜单栏 1.File文件菜单: 2.Edit编辑菜单: 3.Rules规则菜单: 4.Tools工具菜单: 5.View视图菜单: 6.Help帮助菜单: ...

  4. Step By Step(Lua-C API简介)

    Step By Step(Lua-C API简介) Lua是一种嵌入式脚本语言,即Lua不是可以单独运行的程序,在实际应用中,主要存在两种应用形式.第一种形式是,C/C++作为主程序,调用Lua代码, ...

  5. Docker学习(13) Docker容器的网络连接

    Docker容器的网络连接 Docker容器的网络基础 先安装网桥管理工具 Docker容器的互联 默认 Docker容器与外部网络的连接

  6. GO语言面向对象01---封装属性与创建对象的方法与工厂模式

    package main import "fmt" /* 面向过程编程:调度大量的变量.函数 ---------- 面向对象编程(OOP=Object Oriented Progr ...

  7. vmware workstation linux虚拟机点击suspend会卡死

    vmware workstation linux虚拟机点击suspend会卡死, 现象如图, 我测过很多发行版都有这个问题 临时解决方案是关闭suspend功能 sudo systemctl mask ...

  8. Mobileye独创性创新

    Mobileye独创性创新 尽管存在相似之处,但Nvidia的SFF无法与Mobileye的RSS相匹配,后者是领先的AV安全模型 迈向无人驾驶的未来,Mobileye继续以新的创新引领行业,不仅将使 ...

  9. TensorRT PoolingLayer

    TensorRT PoolingLayer IPoolingLayer在通道中实现池.支持的池类型有maximum.average和maximum average混合. Layer Descripti ...

  10. 重新整理 .net core 实践篇—————日志系统之作用域[十七]

    前言 前面介绍了服务与日志之间的配置,那么我们服务会遇到下面的场景会被遇到一些打log的问题. 前面我提及到我们的log,其实是在一个队列里面,而我们的请求是在并发的,多个用户同时发送请求这个时候我们 ...