spring容器监听器(初始化redis数据)
redis缓存
一个完整redis缓存操作包括3个步骤
1.缓存数据库初始化(预热)[将数据库数据加载缓存]
2.缓存的业务操作
3.缓存数据持久化[将缓存数据同步到数据库]
思考:
1.需要将哪些数据进行初始化处理
1>需要频繁变动[DML]的数据,需要初始化缓存
2>不需要频繁变动[DQL]的数据,需要初始化的缓存
此处初始化:1.攻略的统计对象(vo)
2.初始化处理逻辑应该放置在哪个项目实现
1>trip-mgrsite 跟 trip-website-api
2>api项目后续可能需要进行拓展,比如分布式微服务或者集群操作,如果将初始化逻辑放置api项目
会存在多次初始化操作,不建议,另外一个点,redis缓存数据初始化属于数据管理范畴,建议放置在trip-mgrsite项目中
3.初始化处理逻辑应该放置哪个组件中实现(fillter servlet interceptor controller listener)
分析需求实现特点:
1>初始化次数尽可能少
2>尽可能保证业务操作之前数据就准备好了
web组件listener,可以监听请求对象(request) 会话对象(session) 容器对象的创建与销毁动作
初始化逻辑强调尽可能在项目(web容器)启动之后,用户访问前执行,此时发现listener这个组件跟处理逻辑特点相符合
--------------------------------------------------------------------------
web组件监听器:web组件,监听的tomcat的web容器
spring容器监听器:springmvc中组件,监听的spring容器,推荐使用:背靠spring容器,功能更加丰富
spring容器监听器
Spring框架中有哪些不同类型的事件?
Spring 提供了以下5种标准的事件:
(1)上下文更新事件(ContextRefreshedEvent):在调用ConfigurableApplicationContext 接口中的
refresh()方法时被触发,当spring容器启动并初始化之后马上执行该方法
(2)上下文开始事件(ContextStartedEvent):当容器调用ConfigurableApplicationContext的
Start()方法开始/重新开始容器时触发该事件
(3)上下文停止事件(ContextStoppedEvent):当容器调用ConfigurableApplicationContext的
Stop()方法停止容器时触发该事件
(4)上下文关闭事件(ContextClosedEvent):当ApplicationContext被关闭时触发该事件。
容器被关闭时,其管理的所有单例Bean都被销毁
(5)请求处理事件(RequestHandledEvent):在Web应用中,当一个http请求(request)结束触发该事件
如果一个bean实现了ApplicationListener接口,当一个ApplicationEvent 被发布以后,bean会自动被通知
spring容器监听器(实现ApplicationListener接口)
@Component
public class RedisDataInitListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private IStrategyService strategyService;
@Autowired
private IStrategyRedisService strategyRedisService;
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
//1.查询mongodb所有攻略
List<Strategy> list = strategyService.list();
StrategyStatisVO statisVO = new StrategyStatisVO();
//2.遍历所有攻略,封装成vo对象(开发时需要慎重遍历所有数据同步,因为可能造成内存溢出)
for (Strategy strategy : list) {
if (strategyRedisService.isStrategyVoExist(strategy.getId())) {
continue;
}
//BeanUtils工具类,拷贝属性
BeanUtils.copyProperties(strategy, statisVO);
statisVO.setStrategyId(strategy.getId());
//3.将vo缓存到redis中
strategyRedisService.setStrategyStatisVO(statisVO);
}
}
}
//上面方法中需要加上if判断语句,判断key是否存在
存在问题:如果第一次初始化后,前端进行vo对象统计,redis中统计数据跟数据库中数据不一致了,
如果第二次再进行初始化,后面操作会覆盖之前redis缓存的vo对象
解决方案:如果已经存在key,就直接跳过,不需要初始化
小结
1.当要初始化redis时,我们可以使用spring容器监听器,就是在容器启动并初始化之后马上初始化数据
2.初始化数据时,我们需要注意,按需求封装,尽量避免遍历整张表,并且还需判断key是否存在,这步很关键
3.实现ApplicationListener即可操作即可,注意贴@Component注解,交给容器管理
还没有评论,来说两句吧...