简介:
SpringBoot集合RedisUtil和 CommadnLinRunner实现缓存预热
一、新建一个缓存抽象类
在redis模块里面 新建
/**
* 缓存抽象类
*/
@Component
public abstract class AbstractCache {
// 初始化缓存
public void initCache() {
}
public <T> T getCache(String key) {
return null;
}
// 清除缓存
public void clearCache() {
}
// 加载缓存
public void reloadCache() {
clearCache();
initCache();
}
}
二、 新建一个组件
项目启动之前,预先加载数据。 比如,权限容器、特殊用户数据等。通常我们可以使用监听器、事件来操作。 但是,springboot提供了一个简单的方式来实现此类需求,即,CommandLineRunner。
这是一个接口,用户可以自定义实现该接口,具体实现run方法
任何在上下文容器之内的bean都可以实现run方法
如果在上下文中,存在多个该接口实现类,可以通过@order注解,指定加载顺序

@Component
public class InitCache implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
// 获取Springshang上下文对象
ApplicationContext applicationContext = SpringContextUtil.getApplicationContext();
// 获取目标接口下的所有实现类
Map<String, AbstractCache> beanMap = applicationContext.getBeansOfType(AbstractCache.class);
// 调用init方法
if (beanMap.isEmpty()) {
return;
}
for (Map.Entry<String, AbstractCache> entry : beanMap.entrySet()) {
// 通过ApplicationContext的getBean方法来获取Spring容器中已初始化的bean
AbstractCache abstractCache = (AbstractCache) SpringContextUtil.getBean(entry.getValue().getClass());
// 缓存实现类 调用缓存初始方法
abstractCache.initCache();
}
}
}
三、准备工具类
3.1 RedisUtil
/**
* Redis工具类
*/
@Component
public class RedisUtil {
@Autowired
private RedisTemplate redisTemplate;
/**
* 存储 key value
* @param key
* @param value
*/
public void set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
/**
* 判断是否存在 key
* @param key
* @return
*/
public Boolean hasKey(String key){
return redisTemplate.hasKey(key);
}
}
3.2 SpringContextUtil
/**
* Spring 容器工具类
*/
@Component
public class SpringContextUtil implements ApplicationContextAware {
private static ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
// 静态方法 提供Spring 上下文对象
public static ApplicationContext getApplicationContext() {
return applicationContext;
}
// 通过ApplicationContext的getBean方法来获取Spring容器中已初始化的bean
public static Object getBean(Class type) {
return applicationContext.getBean(type);
}
}
四、新建缓存实现类
在用户模块 新建3个实现类
4.1 ClassCache
/**
* 班级缓存
*/
@Component
public class ClassCache extends AbstractCache {
@Autowired
private RedisUtil redisUtil;
private static final String CLASS_CACHE_KEY = "CLASS";
@Autowired
private RedisTemplate redisTemplate;
@Override
public void initCache() {
redisUtil.set("classId", "一年级一班");
}
@Override
public <T> T getCache(String key) {
if (!redisTemplate.hasKey(key).booleanValue()) {
reloadCache();
}
return (T) redisTemplate.opsForValue().get(key);
}
@Override
public void clearCache() {
redisTemplate.delete(CLASS_CACHE_KEY);
}
}
4.2 SubjectCache
/**
* 学科缓存
*/
@Component
public class SubjectCache extends AbstractCache {
@Autowired
private RedisUtil redisUtil;
private static final String SUBJECT_CACHE_KEY = "SUBJECT";
@Autowired
private RedisTemplate redisTemplate;
@Override
public void initCache() {
redisUtil.set("目录", "化学");
}
@Override
public <T> T getCache(String key) {
if (!redisTemplate.hasKey(key).booleanValue()) {
reloadCache();
}
return (T) redisTemplate.opsForValue().get(key);
}
@Override
public void clearCache() {
redisTemplate.delete(SUBJECT_CACHE_KEY);
}
}
4.3 SysUserCache
/**
* 学生缓存
*/
@Component
public class SysUserCache extends AbstractCache {
@Autowired
private RedisUtil redisUtil;
private static final String SYS_USER_CACHE_KEY = "SYS_USER";
@Autowired
private RedisTemplate redisTemplate;
@Override
public void initCache() {
redisUtil.set("name", "杰克");
}
@Override
public <T> T getCache(String key) {
if (!redisTemplate.hasKey(key).booleanValue()) {
reloadCache();
}
return (T) redisTemplate.opsForValue().get(key);
}
@Override
public void clearCache() {
redisTemplate.delete(SYS_USER_CACHE_KEY);
}
}
五、测试

















