- 🏃♂️ 微信公众号: 朕在debugger
- © 版权: 本文由【朕在debugger】原创、需要转载请联系博主
- 📕 如果文章对您有所帮助,欢迎关注、点赞、转发和订阅专栏!
S(Situation):业务代码与缓存逻辑交织在一起,耦合度太高,后期维护人员无法快速接手。
T(Task):预期实现业务代码与缓存逻辑解耦,使得业务人员可以专注于业务代码编写,在此基础上仍要保障数据一致性。
A(Action):利用 Spring Cache + Redis,接管Spring 的 CacheManager。
R(Result):实现业务代码与缓存逻辑解耦,业务人员仅用注解即可完成对目标对象的缓存实现。
文章目录
Tips:
读者可参考项目代码,构建自己的一个 stater,因文中引入作者私有maven仓库,故此 demo 打包会出现 error,找不到对应依赖,但这不影响读者理解本文思想。
一、业务代码与缓存逻辑紧密相连
先来看一段类似场景的代码
public Product getProductById(int productId) {
Product product = null;
// 先尝试从缓存中获取商品信息
String cachedProduct = getFromCache(productId);
if (cachedProduct != null) {
// 如果缓存命中,直接从缓存中获取商品对象
product = deserializeProduct(cachedProduct);
System.out.println("Fetched product " + productId + " from cache.");
} else {
// 如果缓存中没有,则从数据库中获取商品信息
product = fetchProductFromDatabase(productId);
if (product != null) {
// 将获取到的商品信息存入缓存,有效期设置为1小时
putInCache(productId, serializeProduct(product));
System.out.println("Cached product " + productId + " in cache.");
}
}
return product;
}
怎么样?是不是感觉也没什么大不了的?上面只是一个举例,真实情况业务复杂多了…
如果优化成下面这样子,是不是瞬间心情大好?
@Cacheable(value = "product",key = "#productId")
public Product getProductById(int productId) {
Product product = fetchProductFromDatabase(productId);
return product;
}
二、多级缓存执行逻辑
先看图示一吧,可以很快明白这个逻辑是如何运行的。
▲图一 / L1&L2执行过程
再看看图示二,相比于图示一会更加详细地了解到执行细节。
▲图二 / L1&L2细节执行过程