使用Redis实现缓存机制

1.安装Redis
在安装目录打开 cmd 运行命令:redis-server.exe

2.pom.xml配置

<dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

3.application.properties配置

spring.cache.type=SIMPLE (这个应该能省略)
spring.redis.host=localhost
spring.redis.database=0
spring.redis.port=6379
spring.redis.password=
spring.redis.jedis.pool.max-active=20
spring.redis.jedis.pool.max-wait=-1
spring.redis.jedis.pool.max-idle=10
spring.redis.jedis.pool.min-idle=0
spring.redis.timeout=5000

4.代码部分
在入口类函数添加注释 @EnableCaching,开启缓存支持
有关数据的存储,主要认识字符串操作opsForValue()和列表操作opsForList()

注入Redis的方法
@Autowired
private RedisTemplate redisTemplate;

opsForList().rightPushAll在列表的右侧,即从尾部添加数据
redisTemplate.opsForList().rightPushAll(“自定义key name”,保存的list数据);

opsForList().range 后面两个数据是start和end,0,-1表示获取整个list的数据
redisTemplate.opsForList().range("自定义key name",0,-1);

opsForValue().set 存储string类型的值,同理获取数据用opsForValue().get
1, TimeUnit.HOURS 表示缓存的时效为1小时,后面两个参数都是可选择内容。
redisTemplate.opsForValue().set("自定义key name",1, TimeUnit.HOURS);

5.定时任务
在入口类函数添加注释,@EnableScheduling,开启定时任务支持

在定时方法前添加 @Scheduled(cron="* * * * * *") 注释来设定定时任务的时间

cron规则:一共有6个*,分别表示  s、min、hour、day、month、week
"0 0 * * * *" = 每天每时整点
"*/10 * * * * *" = 每隔⼗秒触发   /表示每隔多少单位
"0 0 8-10 * * *" = 每天早上8:00、9:00 和 10:00 触发   - 表示范围
"0 0 6,19 * * *" = 每天6:00 和 19:00 触发   ,表示选择
"0 0/30 8-10 * * *" = 每天8:00, 8:30, 9:00, 9:30, 10:00 和 10:30 触发
"0 0 9-17 * * MON-FRI" = 朝九晚五(周⼀⾄周五9:00-17:00的整点)触发

在运行定时方法时有报错 Unexpected error occurred in scheduled task 原因:@Scheduled注解方式级别高于资源注入级别,导致了资源注入失败
解决方式:使用ApplicationContextAware

public class SampleUtil implements ApplicationContextAware {
    报错的写法如下:需要使用getBean(类名)注入
  //  @Autowierd
  //  private QnRepository qnRepository;
  //  @Autowierd
  //  private QnRepository qnRepository;
   
   正确写法:
    private ApplicationContext context;
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        this.context=applicationContext;
    }
    public Object getBean(String name){
        return this.context.getBean(name);
    }

    @Scheduled(cron="* * */2 * * *")  设定每隔2h触发一次定时任务
    public void subMessage(){
         重点是这里,把资源注入改为了使用getBean(类名)注入
         QnRepository qnRepository= (qnRepository) getBean("QnRepository");
         RedisTemplate redisTemplate= (RedisTemplate) getBean("RedisTemplate");
          定时任务具体内容
    }
}