【大型电商项目开发】缓存-分布式锁-缓存一致性解决-45

一:缓存一致性

问题:缓存里面的数据如何和数据库当中的保持一致?

1.双写模式——数据库修改以后,将缓存中数据也修改一下

在这里插入图片描述
1)缺点:有可能产生脏数据。但是可以保证最终一致性。
2)解决方案:

  • 加锁
  • 暂时性数据不一致,为缓存数据加上过期时间

2.失效模式——删除掉缓存,等待下一次主动查询进行更新

在这里插入图片描述
1)缺点:会读到脏数据。第二个写如果进行的比较慢,就会导致第三个读,读到第一个写的脏数据
2)解决方案:

  • 经常修改的数据,就不要加入缓存了,直接放进数据库。

二:缓存一致性-解决方案

1.无论是双写模式还是失效模式,都会导致缓存的不一致问题。即多个实例同时更新会出事。怎么办?

  • 1、如果是用户纬度数据(订单数据、用户数据),这种并发几率非常小,不用考虑这个问题,缓存数据加 上过期时间,每隔一段时间触发读的主动更新即可
  • 2、如果是菜单,商品介绍等基础数据,也可以去使用canal订阅binlog的方式。
  • 3、缓存数据+过期时间也足够解决大部分业务对于缓存的要求。
  • 4、通过加锁保证并发读写,写写的时候按顺序排好队。读读无所谓。所以适合使用读写锁。(业务不关心 脏数据,允许临时脏数据可忽略);

2.总结:

  • 我们能放入缓存的数据本就不应该是实时性、一致性要求超高的。所以缓存数据的时候加上过期时间,保 证每天拿到当前最新数据即可。
  • 我们不应该过度设计,增加系统的复杂性
  • 遇到实时性、一致性要求高的数据,就应该查数据库,即使慢点。

3.获取商品服务代码

public Map<String, List<Catalog2Vo>> getCatalogJsonFromDbWithRedissonLock() {
        //1.注入redisson,获取分布式锁。锁的名字,锁的粒度越细,速度越快
        //锁的粒度:具体缓存的是某个数据,11号商品
        RLock lock = redisson.getLock("catalogJson-lock");
        lock.lock();
        Map<String, List<Catalog2Vo>> dataFromDb = null;
        try {
            dataFromDb = getDataFromDb();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
           //释放锁
            lock.unlock();
        }
        return dataFromDb;
    }

三:缓存一致性-解决-Canal

Canal:阿里开源的中间件,可以模拟是一个数据库的从服务器。mysql有什么变化就会通过binlog二进制日志同步到cannal,canal会更新redis里的数据。
在这里插入图片描述
目前系统暂不使用canal,需要额外去维护。

四:我们系统一致性解决方案

1)缓存所有的数据都要有过期时间,数据过期下一次查询就能触发主动更新
2)读写数据的时候,加上分布式的读写锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
分布式缓存在微服务架构中起着重要的作用。它可以提高系统的性能、可扩展性和可靠性。下面是关于微服务中分布式缓存的一些常见问题和答案: 1. 什么是分布式缓存分布式缓存是指将缓存数据存储在多个节点上,以提供更高的性能和可扩展性。它可以减少对底层数据源的访问次数,从而提高系统的响应时间。 2. 为什么在微服务架构中使用分布式缓存? 在微服务架构中,每个微服务都是相互独立的,拥有自己的数据存储。使用分布式缓存可以将共享的数据存储在缓存中,减少对微服务之间的数据传输和数据库访问的依赖,提高系统的性能和可扩展性。 3. 哪些场景适合使用分布式缓存分布式缓存适用于那些读取频率高、计算代价高、数据变化不频繁的场景。例如,用户信息、商品信息、配置信息等可以存储在分布式缓存中,以减少对数据库的访问次数。 4. 常见的分布式缓存系统有哪些? 常见的分布式缓存系统包括Redis、Memcached、Hazelcast等。它们提供了高速的内存存储和读取能力,并支持分布式部署和数据复制。 5. 如何使用分布式缓存? 使用分布式缓存需要考虑数据一致性和缓存更新的问题。可以使用缓存策略、缓存失效机制和更新通知等方式来管理缓存数据的一致性,并定期清理过期的缓存数据。 6. 分布式缓存有哪些挑战? 分布式缓存面临的挑战包括缓存一致性缓存雪崩、缓存击穿和缓存穿透等问题。需要通过合适的缓存策略和技术手段来应对这些挑战。 希望以上信息对你有所帮助!如果还有其他问题,欢迎继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

随意石光

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值