使用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");
定时任务具体内容
}
}