关于缓存市面上太多解决方案了,但是对于单体简单应用属实大才小用了,对于开发经验少的人不好把握,下面就简单实现一个代码级别的缓存功能
- 创建appCache接口
public interface AppCache {
/**
* 刷新缓存,重新获取
*/
List<TreeSelect> treeList();
/**
* 刷新分类树缓存,重新获取
*/
void refreshTree();
/**
* 刷新全部缓存,重新获取
*/
void refresh();
}
- 创建appCacheMemory实现类
@Service
public class AppCacheMemory implements AppCache {
private final static Logger logger = LoggerFactory.getLogger(AppCacheMemory.class);
/**
* 考虑到可能会对树结构进行更改所以选用更安全的 CopyOnWriteArrayList或者ConcurrentHashMap
*/
CopyOnWriteArrayList<TreeSelect> treeSelects = new CopyOnWriteArrayList<>();
@Autowired
private PmsCategoryServiceImpl pmsCategoryService;
@Override
public List<TreeSelect> treeList() {
return treeSelects;
}
@Override
public void refreshTree() {
List<TreeSelect> list =pmsCategoryService.listWithTree();
treeSelects.addAll(list);
}
/**
* 以后业务都要先创建对应刷新缓存方法得到map或者list,然后放到系统刷新执行
*/
@Override
public void refresh() {
refreshTree();
}
}
- 创建AppRunner类实现CommandLineRunner在run方法中把appCache提前加载进去
@Component
@Order(value = 1)
public class AppRunner implements CommandLineRunner {
private static final Logger LOGGER = LoggerFactory.getLogger(AppRunner.class);
@Autowired
private AppCache appCache;
@Override
public void run(String... args) {
LOGGER.info(">>>>>>>>>>>>>>>服务启动执行,执行加载应用信息操作<<<<<<<<<<<<<");
try {
//TODO 把appCache提前装配
appCache.refresh();
} catch (Exception e) {
LOGGER.error("应用信息获取失败!!请保证应用配置系统正常启动!");
e.printStackTrace();
}
}
}
大家可以自己写接口测试,把appCache注入调用就行了,我这里就只粘贴核心代码了,经过我的测试原来获取分类数据需要300ms 现在只需148ms。
关于缓存的文章因为最近有业务需求我会持续更新,希望大家多多讨论和关注