什么是缓存
提起缓存机制,大概10个程序员总有5种不同的解释吧(姑且认为只有一半的程序员是通过复制粘贴来学习知识的),我也不能免俗的来说说我的理解。
在回答这个问题之前,我们首先要搞清楚为什么要用缓存? 历史唯物主义揭示了社会发展的基本动力是社会基础矛盾。
运用到软件领域同样适用,一种新技术的出现必然是伴随着特定的矛盾产生的,而缓存的出现正是因为介质提供的实际处理响应速度和软件需求之间的矛盾,最终缓存机制的提出大大的缓解了这个矛盾,同时也印证了一句计算机领域的名言: Any problem in computer science can be solved by anther layer of indirection.
首先明确缓存的位置,缓存的参与方可能在下面四层
a) 客户端
b) 接口层
c) 服务层
d) 数据层
在选择位置的时候出现的分歧是离客户端更近一些还是离缓存所有方更近,具体到我们系统中就是缓存放在a还是b,各有优劣。
放在客户端可以降低网络消耗,放在服务端可以明确管理职责,最终我们选择了放在b牺牲一部分的性能消耗来保证数据的完整性和一致性。
下面通过两个场景来说明缓存的维护
1, 缓存创建(接口层@Cacheable)
2, 缓存更新(服务层@CacheEvict, @Caching)
注:考虑配置数据的修改频率较低,并且配置数据的缓存结构比较复杂,每次数据修改和新增会删除相应的缓存,再由接口层调用来重新加载缓存
接下来就是实现了,
首先需要开启缓存功能,在主程序上加上@EnableCaching注解即可
然后是相关注解的代码:
@Cacheable(value="icare_region",key="('c_').concat(#companyId)")
public List loadRegionByCompIdRest(@RequestParam("companyId") Integer companyId){
List regions = regionService.selectRegionsByCompId(companyId);