缓存,你真的用对了么?

开发 开发工具
有架构师说“缓存是万金油,哪里有问题,加个缓存,就能优化”,缓存的滥用,可能会导致一些错误用法。缓存,你真的用对了么?

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

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

[[234668]]

缓存,你真的用对了么?

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

缓存

如上图:

  • 服务1和服务2约定好key和value,通过缓存传递数据
  • 服务1将数据写入缓存,服务2从缓存读取数据,达到两个服务通信的目的

该方案存在的问题是:

  • 数据管道,数据通知场景,MQ更加适合
  • 多个服务关联同一个缓存实例,会导致服务耦合

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

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

  • 服务先读缓存,缓存***则返回
  • 缓存不***,再读数据库

什么时候会产生雪崩?

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

如何应对潜在的雪崩?

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

否则,就要进一步设计。

常见方案一:高可用缓存

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

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

缓存

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

误用三:调用方缓存数据

如上图:

  • 服务提供方缓存,向调用方屏蔽数据获取的复杂性(这个没问题)
  • 服务调用方,也缓存一份数据,先读自己的缓存,再决定是否调用服务(这个有问题)

该方案存在的问题是:

  • 调用方需要关注数据获取的复杂性
  • 更严重的,服务修改db里的数据,淘汰了服务cache之后,难以通知调用方淘汰其cache里的数据,从而导致数据不一致
  • 有人说,服务可以通过MQ通知调用方淘汰数据,额,难道下游的服务要依赖上游的调用方,分层架构设计不是这么玩的

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

如上图:

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

该方案存在的问题是:

  • 可能导致key冲突,彼此冲掉对方的数据
  • 画外音:可能需要服务A和服务B提前约定好了key,以确保不冲突,常见的约定方式是使用namespace:key的方式来做key。
  • 不同服务对应的数据量,吞吐量不一样,共用一个实例容易导致一个服务把另一个服务的热数据挤出去
  • 共用一个实例,会导致服务之间的耦合,与微服务架构的“数据库,缓存私有”的设计原则是相悖的

建议的玩法是:

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

总结

缓存使用小技巧:

  • 服务与服务之间不要通过缓存传递数据
  • 如果缓存挂掉,可能导致雪崩,此时要做高可用缓存,或者水平切分
  • 调用方不宜再单独使用缓存存储服务底层的数据,容易出现数据不一致,以及反向依赖
  • 不同服务,缓存实例要做垂直拆分

【本文为51CTO专栏作者“58沈剑”原创稿件,转载请联系原作者】

戳这里,看该作者更多好文

责任编辑:赵宁宁 来源: 51CTO专栏
相关推荐

2022-05-09 07:27:50

ThreadLocaJava

2019-08-27 08:24:17

简历技能工作

2020-09-18 06:39:18

hashMap循环数据

2024-09-18 10:08:37

2021-12-25 22:28:27

缓存穿透缓存击穿缓存雪崩

2022-01-12 18:35:54

MongoDB数据查询

2022-07-26 00:00:04

Maven作用域Java

2021-10-26 00:38:10

Redis分布式

2021-10-25 09:50:57

Redis分布式技术

2019-12-18 15:11:42

数组集合数据

2018-06-29 08:36:50

2022-03-14 00:05:23

MySQL模式数据库

2021-01-20 16:26:17

Go编程语言

2017-10-10 15:30:20

JavaScript

2019-12-10 10:13:58

HTTPNginxRedirect

2018-10-07 06:30:40

代码设计模式面向对象原则

2024-01-08 08:27:11

注解Bean代理

2022-07-25 14:54:32

前端

2023-11-29 07:38:33

JavaScript异步处理
点赞
收藏

51CTO技术栈公众号