缓存,你真的用对了么?

缓存,是互联网分层架构中,非常重要的一个部分,通常用它来降低数据库压力,提升系统整体性能,缩短访问时间。

有架构师说“缓存是万金油,哪里有问题,加个缓存,就能优化”,缓存的滥用,可能会导致一些错误用法。

缓存,你真的用对了么?

误用一:把缓存作为服务与服务之间传递数据的媒介

如上图:

  • 服务1和服务2约定好key和value,通过缓存传递数据

  • 服务1将数据写入缓存,服务2从缓存读取数据,达到两个服务通信的目的

该方案存在的问题是:

  • 数据管道,数据通知场景,MQ更加适合

  • 多个服务关联同一个缓存实例,会导致服务耦合

《服务通过缓存传递数据,绝不推荐》一文中有更加深刻的讨论,此处不再展开。

误用二:使用缓存未考虑雪崩

常规的缓存玩法,如上图:

  • 服务先读缓存,缓存命中则返回

  • 缓存不命中,再读数据库

什么时候会产生雪崩?

答:如果缓存挂掉,所有的请求会压到数据库,如果未提前做容量预估,可能会把数据库压垮(在缓存恢复之前,数据库可能一直都起不来),导致系统整体不可服务。

如何应对潜在的雪崩?

答:提前做容量预估,如果缓存挂掉,数据库仍能扛住,才能执行上述方案。

否则,就要进一步设计。

常见方案一:高可用缓存

如上图:使用高可用缓存集群,一个缓存实例挂掉后,能够自动做故障转移。

常见方案二:缓存水平切分

如上图:使用缓存水平切分,一个缓存实例挂掉后,不至于所有的流量都压到数据库上。

误用三:调用方缓存数据

如上图:

  • 服务提供方缓存,向调用方屏蔽数据获取的复杂性(这个没问题)

  • 服务调用方,也缓存一份数据,先读自己的缓存,再决定是否调用服务(这个有问题)

该方案存在的问题是:

  • 调用方需要关注数据获取的复杂性

  • 更严重的,服务修改db里的数据,淘汰了服务cache之后,难以通知调用方淘汰其cache里的数据,从而导致数据不一致

  • 有人说,服务可以通过MQ通知调用方淘汰数据,额,难道下游的服务要依赖上游的调用方,分层架构设计不是这么玩的

误用四:多服务共用缓存实例

如上图:

  • 服务A和服务B共用一个缓存实例(不是通过这个缓存实例交互数据)

该方案存在的问题是:

  • 可能导致key冲突,彼此冲掉对方的数据

画外音:可能需要服务A和服务B提前约定好了key,以确保不冲突,常见的约定方式是使用namespace:key的方式来做key。

  • 不同服务对应的数据量,吞吐量不一样,共用一个实例容易导致一个服务把另一个服务的热数据挤出去

  • 共用一个实例,会导致服务之间的耦合,与微服务架构的“数据库,缓存私有”的设计原则是相悖的

建议的玩法是:

如上图:各个服务私有化自己的数据存储,对上游屏蔽底层的复杂性。

总结

缓存使用小技巧:

  • 服务与服务之间不要通过缓存传递数据

  • 如果缓存挂掉,可能导致雪崩,此时要做高可用缓存,或者水平切分

  • 调用方不宜再单独使用缓存存储服务底层的数据,容易出现数据不一致,以及反向依赖

  • 不同服务,缓存实例要做垂直拆分

缓存,你真的用对了么?相关推荐

  1. iOS网络缓存扫盲篇--使用两行代码就能完成80%的缓存需求

    原文地址:https://github.com/ChenYilong/ParseSourceCodeStudy/blob/master/02_Parse的网络缓存与离线存储/iOS网络缓存扫盲篇.md ...

  2. 分布式缓存灵魂十连,你能坚持几个?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 目录 前言 目前工作中用到的分布式缓存技术有redis和m ...

  3. iOS网络缓存扫盲篇

    当我们在谈论缓存的时候,我们在谈论什么? GET网络请求缓存 80%的缓存需求:两行代码就可满足 控制缓存的有效性 文件缓存:借助ETag或Last-Modified判断文件缓存是否有效 Last-M ...

  4. Redis 缓存常见问题:缓存一致性的解决方案

    文章目录 先删除缓存,再更新数据库 延时双删 先更新数据库,再删除缓存 修改缓存过期时间 消息队列 Redis 缓存常见问题 :缓存雪崩,缓存击穿,缓存穿透,缓存预热 在之前的博客中,我介绍了Redi ...

  5. 五分钟,带你彻底掌握 MyBatis缓存 工作原理

    作者:双子孤狼 blog.csdn.net/zwx900102/article/details/108696005 前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的 ...

  6. linux 占用缓存前10_Ogre的不足与改进(Ogre2.0设计方案)-1.缓存优化

    本文翻译自:http://stuff.lanowen.com/Ogre/2.0/OGRE.2.0.Proposal.Slides.pdf 由于本人才疏学浅,翻译难免有误,望各位不吝惜指正. 感谢作者为 ...

  7. mybatis 二级缓存失效_给我五分钟,带你彻底掌握MyBatis的缓存工作原理

    前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的缓存,各种中间件如Redis也是用来充当缓存的作用,编程语言中又可以利用内存来作为缓存.自然的,作为一款优秀的ORM ...

  8. 给我五分钟,带你彻底掌握 MyBatis 缓存的工作原理

    前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的缓存,各种中间件如Redis也是用来充当缓存的作用,编程语言中又可以利用内存来作为缓存.自然的,作为一款优秀的ORM ...

  9. 浅谈HTTP缓存以及后端,前端如何具体实现HTTP缓存

    <浅谈HTPP缓存>原版: https://juejin.im/post/5bdeabbbe51d4505466cd741?utm_source=gold_browser_extensio ...

  10. JB的测试之旅-缓存

    前言 最近工作上遇到个问题,从用户A切换到用户B,结果用户B显示的还是用户A的数据: 问题的原因很简单,用户B使用的还是用户A的缓存数据,解决方案也很简单,独立保存一份缓存即可: 但是,不由的想问,缓 ...

最新文章

  1. 多传感器融合:自动驾驶(上)
  2. 【错误记录】反射内部类报错 ( Android 使用 Hook 时反射内部类报错 )
  3. 2020-11-28(全局变量和局部静态变量)
  4. eclipse的任务列表
  5. 大学计算机应用技术基础,大学计算机应用技术基础实践教程(Windows7+Office2010/21世纪高等学校计算机规划教材...
  6. 网信号好怎么不显示无服务器,苹果iPhone12经常出现无服务状态 信号不好怎么解决...
  7. php gd png透明,调整PNG大小并将其放在PHP / GD中较大的透明背景上?
  8. C语言的编译链接过程的介绍
  9. Actor范围内随机生成 Learn Unreal Engine (with C++)
  10. Maven依赖方式引用UEditor的jar包
  11. 9206-吃货联盟 需求分析
  12. Jupter 在windows下的运行
  13. select每门可说大于90分_数据库原理与应用期末试题及其答案
  14. 力扣 删除链表的倒数第N个节点
  15. 【Spring MVC】学习笔记汇总
  16. oracle一个表拆成多个表,oracle拆分函数,将字符串拆分成多行多字段表数据
  17. 转载]2LIS_03_BX数据源和CUBE之间不能垫DSO的原因
  18. Linux学习-man和Info
  19. 【ACWing】3626. 三元一次方程
  20. new和delete的使用

热门文章

  1. [读书笔记] - 《深度探索C++对象模型》第6章 第7章
  2. h matlab,较优H圈matlab实现
  3. 图片复印如何去除黑底_身份证复印机中间有黑线怎么办
  4. matlab 创建图形对象,创建坐标轴图形对象
  5. Redis 阶段总结
  6. 阻塞和非阻塞、同步和异步 、五种IO模型
  7. Html IECheckBox双击问题
  8. 201521123018 《Java程序设计》第3周学习总结
  9. c/s架构nginx+php-fpm通信原理
  10. [opencv] 图像线性混合