说起缓存,相信大家都不陌生,下面我们先看这张图
上图是一个最简单的应用系统业务流转模型,当一个客户端连接到server时,需要做数据访问,在server中会判断是否已经在缓存中,如果在则直接在缓存中拿出数据返回,由于缓存是在内存中的(比如redis,mongo,sping-cache等),不用大批量的跟数据库进行交互,避免了大量io操作,大大提高效率。
下面,我们来考虑一个问题,可以设想下如下场景:
当应用启动起来的瞬间,n(非常大)个用户访问尽量,都访问同一波热点数据,这种情况很可能导致,数据库承受不了大量io导致数据库瞬间瘫痪。
为了避免这个情况,出现了缓存预热这个解决方案,当然实现方式有很多中,核心思想都是在应用启动的过程中将数据写进缓存系统中,从而使使用过程中可以直接提高系统的缓存命中率(当然不可能将所有的数据全部写进缓存中),减少数据库jdbc操作。
下面主要来说说使用@PostConstruct来实现我们的缓存预热。
从Java EE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。
在spring的bean生命周期中,被@PostConstruct的方法会在实例初始化完成后执行&