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

SpringCache和SpringTask

SpringCache

在启动类上加EnableCaching注解

我们只要在Controller上写一个SpringCache相应的注解

我们就能实现缓存了

简化缓存操作代码,提高我们的效率

我们默认是我们的spring做缓存

但我们还可以替换我们的缓存技术

例如

EhCache

Google

Redis

来作为缓存技术

 


我们是通过这个接口,CacheManager接口来实现的


4个常用注解 


有三个注解

Cacheput

CacheEvict

CacheEnable


使用Cacheput注解

我们添加缓存时使用

我们在这个Controller中

注入了我们的CacheManager对象

我们在启动类上加了EnableCaching注解

我们在新增操作上写这个,然后value是这个缓存的名称

 

可以存很多的缓存在一个value

然后我们有个key,来作为表示

 #result

我们的key可以通过spring内置语言来写,#result,就是我们当前方法的返回值

#root

可以获取到当前的这个方法

拿到参数值

我们可以和参数名对应,然后来拿到它的参数值

 存储于内存

其实我们这个存储是基于内存的,重启服务后我们就没有了

使用CacheEvict注解

我们删除缓存的时候用

#root.args[0]

 获得方法的第几个参数

#p0

也可以用p0这种写法,指定时第几个参数


使用CacheEnable

这个用在我们的查询方法上

查询之前看看我们有没有

存入空缓存

这个很吊,如果我们过来,然后我们查询数据库为空

condition

condition是满足什么条件的时候,我们才缓存


 使用Spring内置语言的小问题

其实我们这里是不能使用Result的

Cacheable()里面的condition使用的内置对象只有root,和一些参数(这个参数有使用限制)

我们使用condition的时候,我们Spring内置对象不能使用返回结果#result

所以我们可以使用unless,这个和condition相反

我们就可以使用#result了


技术换型,使用Redis

首先要引入我们的依赖

Spring-boot-starter-cache依赖

配置yml文件

设置缓存有效期

我们可以直接在配置文件中,配置time-tolive来设置这个缓存的有效期

我们这样就把我们底层缓存的产品换成了Redis


SpringTask

SpringTask是什么

springtask是spring框架的一个定时任务

是spring提供的任务调度工具,按照约定的时间自动执行某个代码逻辑

作用:定时自动执行某段java代码

例如闹钟


应用场景

信用卡提醒还贷

花呗提醒还款

火车票售票系统处理未支付订单

纪念日发送通知


Cron表达式

我们的springtask要写我们的cron表达式

定时任务触发


什么是Cron表达式

 

通常

周和日是很难同时确定的,所以我们这两个

如果另一个确定了另一个就填写❓

但还是有问题,例如我们想要2月份的最后一天

是28还是29?

我们直接写的话肯定不好,会出错的

但是为了描述这种具体的细节呢,我们会有一些特殊的字符

我们没必要去手写我们的cron表达式,我们有cron表达式自动生成的网站


入门案例

添加EnableScheduling注解

在启动类上添加我们的EnableScheduling注解,开启我们的任务调度

我们的定时任务类上要加我们的Componet注解

这样我们才能成功使用Shceduled注解(写我们的Cron表达式)

然后定义我们的方法,我们的方法是void类,是没有返回值的


需求分析(经典使用)

我们一分钟检查一次,看看是否有超时订单

我们的订单不可能一直时派送状态

过了一定的时间我们要处理一下这个状态

 

我们写sql语句,查出超时15分钟的订单,然后把订单状态设置成已经取消

plusMinute方法

LocalDateTime有个plusMinute方法,可以加减时间

为了防止日志同时输出,控制台很难观察

 修改程序启动时,我们的定时任务的启动时间

所以我们一个从1秒开始,5秒触发一次

一个从0秒开始,5秒触发一次

相关文章:

  • 【ARM64 常见汇编指令学习 19.2 -- ARM64 地址加载指令 ADR 详细介绍】
  • 高防CDN是如何应对DDoS和CC攻击的
  • 堆排序-调整算法
  • wireshark 标记自己想要的数据包
  • C++ OpenCV 图像分类魔法:探索神奇的模型与代码
  • 【上篇】从 YOLOv1 到 YOLOv8 的 YOLO 物体检测模型历史
  • 用git下载hugging face上的大模型,以Qwen1.5-7B为例
  • webservice、WCF、webAPI、MVC权限认证
  • 型号FM152A,FM148R和利时
  • 【软件工程】第七章
  • Flink⼤状态作业调优实践指南:状态报错与启停慢篇
  • 中缀表达式和前缀后缀
  • “安全生产月”专题报道:AI智能监控技术如何助力安全生产
  • C/C++ 引用和指针的区别及使用场景
  • QT中将资源文件(image、qss、qm等)封装到静态库中,程序该如何引用静态库中的资源文件
  • [译]前端离线指南(上)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • CentOS 7 修改主机名
  • co.js - 让异步代码同步化
  • Codepen 每日精选(2018-3-25)
  • EventListener原理
  • java正则表式的使用
  • KMP算法及优化
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Spark学习笔记之相关记录
  • Vue.js 移动端适配之 vw 解决方案
  • webgl (原生)基础入门指南【一】
  • 表单中readonly的input等标签,禁止光标进入(focus)的几种方式
  • 不发不行!Netty集成文字图片聊天室外加TCP/IP软硬件通信
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 从零开始学习部署
  • 对象管理器(defineProperty)学习笔记
  • 服务器从安装到部署全过程(二)
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 精彩代码 vue.js
  • 前端临床手札——文件上传
  • 移动端唤起键盘时取消position:fixed定位
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • 智能合约开发环境搭建及Hello World合约
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • 如何用纯 CSS 创作一个菱形 loader 动画
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • (day6) 319. 灯泡开关
  • (Java数据结构)ArrayList
  • (阿里云万网)-域名注册购买实名流程
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (七)Flink Watermark
  • (一)基于IDEA的JAVA基础10
  • (转)Linq学习笔记