构建以caffeine为L1,Redis为L2的多级缓存

在这里插入图片描述

  • 🏃‍♂️ 微信公众号: 朕在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细节执行过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值