缓存,是互联网分层架构中,非常重要的一个部分,通常用它来降低数据库压力,提升系统整体性能,缩短访问时间。
有架构师说“缓存是万金油,哪里有问题,加个缓存,就能优化”,缓存的滥用,可能会导致一些错误用法。
缓存,你真的用对了么?
误用一:把缓存作为服务与服务之间传递数据的媒介
如上图:
该方案存在的问题是:
《服务通过缓存传递数据,绝不推荐》一文中有更加深刻的讨论,此处不再展开。
误用二:使用缓存未考虑雪崩
常规的缓存玩法,如上图:
什么时候会产生雪崩?
答:如果缓存挂掉,所有的请求会压到数据库,如果未提前做容量预估,可能会把数据库压垮(在缓存恢复之前,数据库可能一直都起不来),导致系统整体不可服务。
如何应对潜在的雪崩?
答:提前做容量预估,如果缓存挂掉,数据库仍能扛住,才能执行上述方案。
否则,就要进一步设计。
常见方案一:高可用缓存
如上图:使用高可用缓存集群,一个缓存实例挂掉后,能够自动做故障转移。
常见方案二:缓存水平切分
如上图:使用缓存水平切分,一个缓存实例挂掉后,不至于所有的流量都压到数据库上。
误用三:调用方缓存数据
如上图:
该方案存在的问题是:
误用四:多服务共用缓存实例
如上图:
该方案存在的问题是:
画外音:可能需要服务A和服务B提前约定好了key,以确保不冲突,常见的约定方式是使用namespace:key的方式来做key。
建议的玩法是:
如上图:各个服务私有化自己的数据存储,对上游屏蔽底层的复杂性。
总结
缓存使用小技巧: