周志明的软件架构课
周志明
博士,远光软件研究院院长,《深入理解 Java 虚拟机》《凤凰架构》等书作者
54203 人已学习
免费领取
课程目录
已完结/共 74 讲
架构师的视角 (24讲)
周志明的软件架构课
15
15
1.0x
00:00/00:00
登录|注册

22 | 分布式缓存如何与本地缓存配合,提高系统性能?

你好,我是周志明。
今天,我们接着上节课服务端缓存的话题,继续来学习下分布式缓存的实现形式、与本地缓存搭配使用的方法,以及一起来了解下,在实际使用缓存的过程中,可能会存在的各种风险和应对手段。

分布式缓存

首先通过上节课的学习,现在我们已经知道了,服务端缓存可以分为“进程内缓存”和“分布式缓存”两大类。相比缓存数据在进程内存中读写的速度,一旦涉及到了网络访问,那么由网络传输、数据复制、序列化和反序列化等操作所导致的延迟,就要比内存访问高得多。
所以,对于分布式缓存来说,处理与网络有关的操作是影响吞吐量的主要因素,这也是比淘汰策略、扩展功能更重要的关注点。
而这就决定了,尽管也有 Ehcache、Infinispan 这类能同时支持分布式部署和进程内嵌部署的缓存方案,但在通常情况下,进程内缓存和分布式缓存在选型时,会有完全不同的候选对象和考察点。
所以说,我们在决定使用哪种分布式缓存之前,必须先确认好自己的需求是什么。
那么接下来,我们就从两个不同的需求场景出发,看看都可以选择哪些分布式缓存方案。我们先从数据访问的需求场景开始了解吧。

复制式缓存与集中式缓存

从访问的角度来说,如果是频繁更新但很少读取的数据,正常是不会有人把它拿去做缓存的,因为这样做没有收益。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

分布式缓存在提高系统性能方面扮演着关键角色。本文介绍了分布式缓存的实现形式、与本地缓存搭配使用的方法以及可能存在的风险和应对手段。文章首先介绍了复制式缓存与集中式缓存的区别,以及它们各自的代表性产品。复制式缓存支持分布式的进程内缓存,但在大规模集群下可能会出现写入性能问题。而集中式缓存则是目前分布式缓存的主流形式,具有独立的进程空间,能够为异构语言提供服务。此外,文章还探讨了缓存的数据一致性和分布式缓存集群的需求,将分布式缓存分为AP和CP两种类型。最后,文章指出了Redis作为典型的AP式分布式缓存,具有高性能和高可用特点,但不保证强一致性。相比之下,ZooKeeper、Doozerd、Etcd等分布式协调框架虽然能够保证强一致性,但吞吐量有限。此外,文章还介绍了透明多级缓存的概念,以及缓存穿透、缓存击穿和缓存雪崩等风险及相应的解决方法。通过对分布式缓存的实现形式、应用场景和特点的介绍,为读者提供了全面的了解和参考。

该试读文章来自《周志明的软件架构课》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(15)

  • 最新
  • 精选
  • zhanyd
    "能满足需求的前提下,最简单的系统就是最好的系统”。 这句话的隐藏前提是,我们的选择空间要足够大。 不管是CDN,负载均衡,客户端缓存,服务端缓存,还是分布式缓存,都给我们提供了大量的选择余地,可以根据自己系统的实际情况,灵活地选择最适合的方案。 这句话的另一种理解是:没有最好的方案,只有最合适的方案。 PS:在“复制式缓存”小节中的“此时,缓存的总容量就相当于是传统复制模式的一倍”,其中的“一倍”是不是笔误写错了,应该是“一半”?

    作者回复: 占用空间是原来的一半,所以容量是原来的一倍

    2021-01-06
    2
    11
  • Jialin
    采用 Cache Aside 模式典型的出错场景,就是如果某个数据是从未被缓存过的,请求会直接流到真实数据源中,如果数据源中的写操作发生在查询请求之后,结果回填到缓存之前,也会出现缓存中回填的内容与数据库的实际数据一致的情况。 这里应该是数据不一致的情况

    作者回复: 感谢指正,请编辑看到更新一下。

    2021-01-06
    1
  • 恒仁
    先写数据源,然后失效(而不是更新)掉缓存,这个不是一个事务,如果写数据源成功,但是失效调缓存失败,还得做事务补偿操作吧

    作者回复: 一般缓存失效失败,它的读取也很难成功。如果出现了,可以根据实际需要来决定后续处理。失效缓存抛出了异常,让数据源的修改回滚、或者让缓存做best-effort的失效都是可以考虑的。

    2021-01-07
    4
  • Jxin
    1.简单一语双关。 2.第一关,满足需求的前提下,系统的复杂度应该追求最低。这是一种mvp的思路。 3.第二关,系统复杂的时候依旧要追求系统的简单。这时候讲究的就是复杂性的隔离。在引入复杂性是必然的前提下,如何把复杂性隔离封装好就是实现系统系统简单的关键手段。毕竟一篮子带壳的鸡蛋绝对比一篮子打烂的蛋液简单明了。而透明化可以认为是复杂性隔离的最好体现。
    2021-01-06
    10
  • shark
    之前看redis专栏说到的缓存污染是缓存到了长久不会使用的数据,老师这里缓存污染的意思又是脏数据的意思,到底什么才是缓存污染
    2021-06-13
    1
    4
  • 何磊
    对于采用布隆过滤器解决穿透问题,布隆过滤器的存储也需要集中式的缓存存储。这就带来一个问题需要对存储器中的值进行hash拆分,避免存到一个key中发生热点问题。
    2021-03-24
    2
  • Skysper
    还有一种场景在于 如果写入主库,查询走从库 如果缓存写数据源后失效 依然可能会因为主从不一致出现缓存数据不一致
    2021-02-04
    2
    2
  • tt
    “透明多级分流系统”的含义就是“复杂性的多级分流”: 处在越靠前的系统就应该越简单,如果满足需要了,请求就不会往后流转,那此时就等价于一个简单系统。 反之,越靠后的系统其复杂性就会提升,同时不同层级间的同步也是复杂性的一部分。
    2021-01-06
    2
  • geek
    对调用方友好的系统,是好系统。
    2022-02-26
    1
  • 褐言
    量大&更新频率快的话,是不是可以进程内缓存改成本地的堆外缓存
    2021-06-30
    1
收起评论
显示
设置
留言
15
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部