缓存已经成为了几乎所有应用系统的必备要素。使用缓存可以有效提高系统的读性能,相比于直接读取数据库,吞吐量有了很大的提高。但是,在实际生产环境中,很难保证缓存与数据库中数据的完全一致。程序应采取某种策略,尽可能地保证缓存中的数据是最新的,并且可以检测到缓存中数据失效,并提供相应的解决方案。
简单来说,Cache-Aside Pattern的提出是为了尽可能地解决缓存与数据库的数据不一致问题。
大多数的商用缓存系统都提供了下面的功能:
如果所使用的缓存没有提供这些功能,则需要应用系统自己去实现,实现时就可以基于Cache-Aside Pattern。
Cache-Aside Pattern分为读操作和写操作两种。
流程:
/**
* @Author: ZhangShenao
* @Date: 2019/5/15 11:07
* @Description:演示Cache-Aside Pattern
*/
@Service
public class CacheAsidePatternService {
@Autowired
private CacheService cacheService;
@Autowired
private DataDao dataDao;
//读操作
public Data getData(String key) {
//1. 读缓存,如果命中则直接返回
Data data = cacheService.loadDataFromCache(key);
if (data != null) {
return data;
}
//2. 缓存未命中,读数据库
data = dataDao.loadDataFromDB(key);
//3. 将读取到的数据放入缓存
cacheService.putData(key,data);
return data;
}
//写操作
public void updateData(String key,Data data){
//1. 更新数据库
dataDao.updateData(key, data);
//2. 删除缓存
cacheService.evictData(key);
}
}