—— 目录 ——

  • 0. 假设已配置好 SSM 环境
  • 1. 配置文件
  • 2. 定时服务
  • 3. cron 解释
    • ① cron 参数(按顺序依次为)
    • ② 特殊符号
  • 4. Redis 工具类
  • 5. 例子实战

0. 假设已配置好 SSM 环境

1. 配置文件

有划分配置文件的话建议添加在 spring-service.xml 中,没有的话就放在可以生效的地方

spring-service.xml

<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:context="http://www.springframework.org/schema/context"xmlns:task="http://www.springframework.org/schema/task"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/taskhttps://www.springframework.org/schema/task/spring-task.xsd"><!-- 扫描 service 下的包 --><!-- service 为定时任务所在的包 --><!-- utils 为 Redis 工具类所在的包 --><context:component-scan base-package="com.qg.service"/><context:component-scan base-package="com.qg.utils"/><!-- 配置注自动装配注解的支持 --><context:annotation-config/><!-- 配置定时任务 --><!-- 配置定时任务的注解驱动 --><task:annotation-driven scheduler="myScheduler"/><!-- 配置定时任务的线程池 --><task:scheduler id="myScheduler" pool-size="5"/></beans>

2. 定时服务

ScheduleService.java

public interface ScheduleService {/*** 定时将用户离线状况存入数据库中*/void userOffLine();
}

ScheduleServiceImpl.java

@Service
public class ScheduleServiceImpl implements ScheduleService {@Override@Scheduled(cron = "* * */12 * * ? ")public void userOffLine() {// ...}

3. cron 解释

@Scheduled(cron = "* * */12 * * ? ")
表示从程序运行开始,每 12 小时执行一次

① cron 参数(按顺序依次为)

  • 秒(0~59)
  • 分钟(0~59)
  • 小时(0~23)
  • 天(0~31,看月的天数而定)
  • 月(0~11)
  • 星期(1~7 或 SUN,MON,TUE,WED,THU,FRI,SAT)(1 = SUN)
  • 年份(1970-2099)

② 特殊符号

  • , 表示列举可能的值,以秒为例

    10,12,16,40 表示在第 10,12,16,40 秒时执行
    
  • * 表示所有可能的值,如

    每秒钟,每分钟,每小时,每天
    
  • / 指定增量,以秒为例

    */10 表示自开始运行时,每 10 秒执行一次
    0/10 表示自第 0 秒开始,每 10 秒执行一次,即第 0,10,20,30,40,50 ,秒执行
    
  • ? 只用于天和星期两个子表达式,表示不指定值

    当 ”天“ 被指定时,需将 ”星期“ 设置为 ?
    同理 ”星期“ 被设置时,需将 ”天“ 设置为 ?
    这样做时为了避免冲突
    
  • L 只用于天和星期两个子表达式,表示 last(最后),如

    0/20 * 12 L * ? 表示:
    在每月的最后一天(L)中午十二点(12)从 0 开始每隔 20 秒执行一次(0/20)
    L 前还可以加数字,以天数为例,6L 表示每月的倒数第 6 天
    

4. Redis 工具类

Spring 与 Redis 的整合与工具类,参见补充:
【Redis之轨迹】Redis基础入门(Linux & IDEA)(配套工具类例子)

5. 例子实战

将用户的离线信息保存在 redis 缓存中,定时刷入数据库,实现类如下

@Service
public class ScheduleServiceImpl implements ScheduleService {@AutowiredStatusMapper statusMapper;/*** 设置每隔 1 小时将数据刷入数据库*/@Override@Scheduled(cron = "* * 0/1 * * ? ")@LogMessage("【将用户离线信息刷入数据库中】")public void userOffLine() {// 在缓存中拿出全部用户的离线信息,以及对应的 key 集合Map<Object, Object> offlineMap = RedisUtils.hashGetAll("user:offline");Set<Object> keySet = offlineMap.keySet();// 将缓存中的用户离线信息刷入数据库keySet.forEach(userId -> {// 将数据刷入数据库Integer integer = statusMapper.updateOffline(Integer.parseInt(userId.toString()), (String) offlineMap.get(userId));System.out.println("【刷入数据库】 用户 id = " + userId + ",离线时间 = " + offlineMap.get(userId) + " -> 是否成功? " + integer);// 如果刷入成功,则将该记录从缓存中删去if (integer == 1) {Long result = RedisUtils.hashDel("user:offline", userId);System.out.println("【将缓存中的数据删去】 删除 " + userId + " 是否成功? " + result);}});}
}

接下来只需要将具体的刷入数据库操作,改为存入缓存操作即可,例如:

// 往 Redis 缓存中放入用户的离线时间,并指定 60 分钟失效
RedisUtils.hashSet("user:offline", "" + userId, DateUtil.getTime(), 60 * 60);

深潜曈曚,浅尝晨曦(IceClean)

【Spring之轨迹】结合 @Scheduled 实现定时将 Redis 缓存刷入数据库(配 Redis 工具类与例子实战)相关推荐

  1. Spring Boot整合Redis缓存(Lettuce)

    spring-boot-demo-cache-redis 此 demo 主要演示了 Spring Boot 如何整合 redis,操作redis中的数据,并使用redis缓存数据.连接池使用 Lett ...

  2. Spring Boot中使用@Scheduled创建定时任务

    我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信.邮件之类的操作,也可能会定时地检查和监控一些标志.参数等. 创建定时任务 在Spring Boot中编写定时 ...

  3. Spring与Quartz的整合实现定时任务调度

    Spring与Quartz的整合实现定时任务调度 摘自: http://kevin19900306.iteye.com/blog/1397744 最近在研究Spring中的定时任务功能,最好的办法当然 ...

  4. 在Spring Boot中使用@Scheduled实现定时任务

    2019独角兽企业重金招聘Python工程师标准>>> 在Spring Boot中使用@Scheduled实现定时任务 之前没有使用Spring Boot的Java风格配置的时候,用 ...

  5. 使用SpringTask定时获取传感器设备信息并缓存到Redis

    1)整合:略.因为在Spring-context包中已经整合过了 2)使用:写一个方法,然后加上规则,他就会被定时执行 /*** 项目启动后从数据库将各设备的信息和阈值查询出来放入redis* 五分钟 ...

  6. Spring Boot实战解决高并发数据入库: Redis 缓存+MySQL 批量入库

    前言 最近在做阅读类的业务,需要记录用户的PV,UV: 项目状况:前期尝试业务阶段: 特点: 快速实现(不需要做太重,满足初期推广运营即可) 快速投入市场去运营 收集用户的原始数据,三要素: 谁 在什 ...

  7. 免费IP代理池定时维护,封装通用爬虫工具类每次随机更新IP代理池跟UserAgent池,并制作简易流量爬虫...

    前言 我们之前的爬虫都是模拟成浏览器后直接爬取,并没有动态设置IP代理以及UserAgent标识,这样很容易被服务器封IP,因此需要设置IP代理,但又不想花钱买,网上有免费IP代理,但大多都数都是不可 ...

  8. spring boot使用redis缓存数据与自动清除

    在spring boot项目中使用缓存很方便,有如下两种使用场景: 直接操作RedisTemplate缓存数据 在方法上加@Cacheable注解来缓存数据 方法1适用于缓存session.token ...

  9. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

最新文章

  1. STL set multiset
  2. Docker中的Java内存消耗优化以及我们如何使用Spring Boot
  3. 结合脑成像技术与人工智能,破除自杀的“诅咒”
  4. mysql int(3)与int(11)的区别详解
  5. 之江学院第0届 A qwb与支教 容斥与二分
  6. python中random函数用法_random函数的用法
  7. typescript parseint不能传number_Typescript 使用日志
  8. java comparator_Java 集合排序策略接口 Comparator
  9. Linux基本命令总结(初学者可以借鉴学习)
  10. 设计模式-01-设计模式简介及分类
  11. 冷知识,PCB工程师的等级之分
  12. SaaSBase:什么是SAP(思爱普) ERP?
  13. 制作字幕.html教程,如何制作电影字幕,视频字幕制作软件|免费给视频加字幕
  14. 一个简单的例子由易到难理解动态规划
  15. 如何自定义starter
  16. ubuntu解决浏览器不支持HTML5播放器的方法
  17. 计算机软件优化,如何优化计算机软件系统
  18. 【报告分享】2021年中国植物肉行业洞察白皮书-商业周刊星期零(附下载)
  19. 在网页中调用摄像头实现拍照上传 - 高拍仪二次开发
  20. MAC版outlook开启左侧收件箱导航条

热门文章

  1. 80、消防应急照明和疏散指示的要求
  2. googleplay刷榜和APP Store 刷榜哪些不为人知的事
  3. Python!Python!
  4. Mac电脑用预览功能调整图像大小?Mac调整图片大小方法
  5. 欢乐的票圈重构——九宫格控件(上)
  6. android陀螺仪实现背景移动demo,基于HTML5陀螺仪实现移动动画效果
  7. Unity 场景切换间的内存清理
  8. 在HTML中怎么表示空格
  9. 罗永浩 AR 创业公司估值 10 亿;​苹果宣布加大 AppStore 广告推送量;​Node.js 19 发布|极客头条...
  10. Ubuntu 14.04.2安装内核源码树以及编译