Redis应用(5)——Redis的项目应用(四):缓存预热,用户注册为例 --->注册的流程 & 缓存预热的方式,quartz方式 / @Schedule方式

目录

  • 引出
  • Redis的项目应用(四):定时任务,用户注册为例
  • 缓存预热是啥
  • 注册的流程
  • 缓存预热:顺序0,定时任务,quartz实现
    • 数据库的表
    • redis缓存存储:用户名
    • 引入依赖
    • 定时任务UserPreHot.java
    • 定时任务的配置类PreHotConfig.java
    • 启动项目后定时任务
  • 缓存预热:用@Schedule的方式
    • 主启动类@EnableScheduling
    • 预热方法@Scheduled(cron = "0 54 21 * * ?")
  • 总结

引出


1.缓存预热是啥,将某些数据加载到Redis中;
2.注册的流程,缓存预热在用户注册中的应用;
3.quartz方式,定时任务extends QuartzJobBean;
4.定时任务配置类,JobDetail,Trigger,@Bean;
5.@Schedule方式:@Component+@Scheduled(cron = “0 54 21 * * ?”);

Redis的项目应用(四):定时任务,用户注册为例

缓存预热是啥

缓存预热将数据的某些数据提前加载到redis中。

定时器方案:

(1)springboot @Schedule

(2)Quartz

定时器xxLjob

注册的流程

Redis应用(5)——Redis的项目应用(四):缓存预热,用户注册为例 --->注册的流程 & 缓存预热的方式,quartz方式 / @Schedule方式_第1张图片

以用户注册为例,

(1)当数据库的数据更新后,需要在redis缓存中进行同步更新;

(2)当系统启动的时候,需要把数据库的数据读到redis缓存中;

因此流程为下面所示:

在这里插入图片描述

缓存预热:顺序0,定时任务,quartz实现

数据库的表

Redis应用(5)——Redis的项目应用(四):缓存预热,用户注册为例 --->注册的流程 & 缓存预热的方式,quartz方式 / @Schedule方式_第2张图片

redis缓存存储:用户名

用set进行存储

redis的set集合: value是字符串类型

key: usernames

Redis应用(5)——Redis的项目应用(四):缓存预热,用户注册为例 --->注册的流程 & 缓存预热的方式,quartz方式 / @Schedule方式_第3张图片

引入依赖

        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-quartzartifactId>
        dependency>

命名方式:Shedule/ Job/ Task

Redis应用(5)——Redis的项目应用(四):缓存预热,用户注册为例 --->注册的流程 & 缓存预热的方式,quartz方式 / @Schedule方式_第4张图片

定时任务UserPreHot.java

先清除缓存中的数据,然后把用户名username存到redis的set中

package com.tianju.redisDemo.job;

import com.tianju.redisDemo.dao.UserMapper;
import com.tianju.redisDemo.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.quartz.QuartzJobBean;

import javax.annotation.Resource;
import java.util.List;

/**
 * 进行用户名的缓存预热,定时任务
 */
@Slf4j
public class UserPreHot extends QuartzJobBean {

    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private UserMapper userMapper;

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        // 1.清除缓存中的数据
        stringRedisTemplate.delete("usernames");

        // 2.更新缓存中的数据
        List<User> userList = userMapper.selectList(null);
        userList.forEach(user -> stringRedisTemplate.opsForSet().add("usernames", user.getUsername()));

        log.debug("redis缓存预热成功》》》》》》");
    }
}

定时任务的配置类PreHotConfig.java

Redis应用(5)——Redis的项目应用(四):缓存预热,用户注册为例 --->注册的流程 & 缓存预热的方式,quartz方式 / @Schedule方式_第5张图片

表达式 意义

Cron - 在线Cron表达式生成器 (ciding.cc)

0 0 8 ? 每天早上8点触发
0 30 9 ? 每天早上9点半触发
0 23 ? 每天晚上的11点0分到晚上11点59分,每一分钟触发一次
0 0/5 22,23
? 每天晚上的10点0分到11点55分,及每天晚上11点0分到晚上11点55分,每五分钟触发一次
0 0-5 23
? 每天晚上的11点0分到晚上11点5分,每一分钟触发一次
0 10,45 14 ? 3 4 每年3月的星期三,下午2点10分和下午2点45分触发
0 30 9 ?
2-5 每个月的周一到周五的9点半触发
0 30 9 15 ? 每个月15号的9点半触发
0 55 23 L
? 每个月最后一天的晚上11点55分触发
0 55 23 ? * 6L 每个月最后一个周五的晚上11点55分触发
0 0 8 ? 5 1#2 5月的第二个星期天的早上8点触发,即母亲节那天八点给妈妈发节日快乐
0 0 8 ? 6 1#3 6月的第三个星期天的早上8点触发,即父亲节那天八点给爸爸发节日快乐

package com.tianju.redisDemo.config;

import com.tianju.redisDemo.job.UserPreHot;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 定时任务的配置类
 */
@Configuration
public class PreHotConfig {

    /**
     * 计划任务的细节配置,和哪个类关联,采用建造者模式
     * 和 job 下的 UserPreHot 关联起来
     * @return 返回JobDetail
     */
    @Bean
    public JobDetail jobDetail(){
        return JobBuilder.newJob() // 建造者设计模式
                .ofType(UserPreHot.class)
                .storeDurably()
                .build();
    }

    @Bean
    public Trigger trigger(){
        return TriggerBuilder.newTrigger()
                .forJob(jobDetail())
                .withSchedule(
                        CronScheduleBuilder.cronSchedule("0 04 21 * * ?")
                )
                .startNow()
                .build();
    }
}

启动项目后定时任务

在这里插入图片描述

Redis应用(5)——Redis的项目应用(四):缓存预热,用户注册为例 --->注册的流程 & 缓存预热的方式,quartz方式 / @Schedule方式_第6张图片

server:
  port: 9099

spring:
  # redis的相关配置
  redis:
    host: 192.168.111.130
    port: 6379
    database: 0

  # mysql的相关配置
  datasource:
    druid:
      url: jdbc:mysql://127.0.0.1/community?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
      username: root
      password: 123
      driver-class-name: com.mysql.cj.jdbc.Driver


# 日志需要配置一下
logging:
  level:
    com.tianju.redisDemo: debug

# mybatis-plus的日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

缓存预热:用@Schedule的方式

主启动类@EnableScheduling

package com.tianju.redisDemo;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling // 

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

预热方法@Scheduled(cron = “0 54 21 * * ?”)

Redis应用(5)——Redis的项目应用(四):缓存预热,用户注册为例 --->注册的流程 & 缓存预热的方式,quartz方式 / @Schedule方式_第7张图片

表达式 意义

Cron - 在线Cron表达式生成器 (ciding.cc)

0 0 8 ? 每天早上8点触发
0 30 9 ? 每天早上9点半触发
0 23 ? 每天晚上的11点0分到晚上11点59分,每一分钟触发一次
0 0/5 22,23
? 每天晚上的10点0分到11点55分,及每天晚上11点0分到晚上11点55分,每五分钟触发一次
0 0-5 23
? 每天晚上的11点0分到晚上11点5分,每一分钟触发一次
0 10,45 14 ? 3 4 每年3月的星期三,下午2点10分和下午2点45分触发
0 30 9 ?
2-5 每个月的周一到周五的9点半触发
0 30 9 15 ? 每个月15号的9点半触发
0 55 23 L
? 每个月最后一天的晚上11点55分触发
0 55 23 ? * 6L 每个月最后一个周五的晚上11点55分触发
0 0 8 ? 5 1#2 5月的第二个星期天的早上8点触发,即母亲节那天八点给妈妈发节日快乐
0 0 8 ? 6 1#3 6月的第三个星期天的早上8点触发,即父亲节那天八点给爸爸发节日快乐

package com.tianju.redisDemo.job;

import com.tianju.redisDemo.dao.UserMapper;
import com.tianju.redisDemo.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.annotation.Schedules;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;

/**
 * 采用 @Scheduled(cron = "0 54 21 * * ?")进行预热
 */
@Slf4j
@Component
public class UsernamesPreHot {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Resource
    private UserMapper userMapper;

    @Scheduled(cron = "0 54 21 * * ?")
    public void preHot() {
        // 1.清除缓存中的数据
        stringRedisTemplate.delete("usernames");

        // 2.更新缓存中的数据
        List<User> userList = userMapper.selectList(null);
        userList.forEach(user ->
                stringRedisTemplate.opsForSet()
                        .add("usernames", user.getUsername()));

        log.debug("redis缓存预热,usernames");
    }
}

预热成功

在这里插入图片描述


总结

1.缓存预热是啥,将某些数据加载到Redis中;
2.注册的流程,缓存预热在用户注册中的应用;
3.quartz方式,定时任务extends QuartzJobBean;
4.定时任务配置类,JobDetail,Trigger,@Bean;
5.@Schedule方式:@Component+@Scheduled(cron = “0 54 21 * * ?”);

你可能感兴趣的:(#,Redis,缓存,redis,数据库)