缓存的架构设计要点

我是乔帮主 2019-04-04 09:43:49 ⋅ 166 阅读

一、缓存的典型应用场景


下面的2中情况下,优化存储系统是无法有效提升性能的。

1. 需要经过复杂运算得出的数据

例如需要展示有多少用户在线,如果使用数据库,每次都要执行 count 操作,展示量很大的话就对数据库造成了极大压力。

2. 读多写少的数据

例如一个明星发布一条微博,可能有几千万人浏览,如果每次浏览都 select 一次的话,几千万的请求对数据库的压力非常大。

缓存就是为了减轻存储系统的压力,将可重复使用的数据放到内存中,一次生成、多次使用。

二、设计要点


缓存虽然为存储系统减负了,但给架构设计带来了复杂性,下面3点需要重点关注:

  1. 缓存穿透

  2. 缓存雪崩

  3. 缓存热点

1. 缓存穿透

指业务系统在缓存中没有查到数据,需要再次去存储系统查询。

通常有2中情况:

  1. 存储数据不存在

被访问的数据确实不存在,存储系统中没有,那么缓存中肯定也没有。

对于这类数据,每次都要查询缓存、查询存储系统,如果有人恶意大量访问一些不存在的数据,就会对系统产生严重影响。可以直接设置一个默认值放到缓存中,防止访问存储系统。

  1. 缓存数据生成需要耗费时间或者资源

存储系统中存在数据,但生成缓存耗时耗资源,缓存失效后,访问压力就集中在存储系统了。

例如商品分页,数据量巨大,不能都缓存起来,只能分页缓存,页数靠后的访问少,缓存就很容易过期消失,之后的访问需要计算、访问存储层,重新生成缓存。

正常情况这类访问不会频繁,但如果爬虫遍历的时候,系统性能就可能出问题了。

这种情况没有太好的解决方案,可以考虑:

  • 识别爬虫禁止访问,但这会影响SEO和推广;

  • 做好监控,发现问题后及时处理,爬虫不是攻击,对系统的影响是逐步的,监控发现问题后有时间处理。

2. 缓存雪崩

当缓存过期被清除后,业务系统需要重新生成缓存,访问存储系统、计算。

高并发的系统中,在新缓存还未生成的这一小段时间内,可能会有上百个请求进来,他们发现缓存中没有,就都去生成缓存,从而对存储系统造成巨大压力,引发连锁反应,造成系统崩溃。

解决方案:

  1. 更新锁

对缓存更新操作进行加锁保护,保证只有一个线程能够进行缓存更新。

对于分布式系统,可能有上百台服务器,即使每台服务器上只有一个更新线程,但总体数量大,同样会引发雪崩,需要使用分布式锁。

  1. 后台更新

缓存有效期设为永久,后台线程定时更新。

需要考虑一个情况:当缓存内存不足时,会清理掉一些缓存数据,从被清理到下次更新缓存这段时间内,业务访问时读到的就是空。

可以考虑当业务发现缓存失效后,发送一个消息,通知后台线程进行更新。

后台更新机制还适合做缓存预热。指系统上线后,定时触发了缓存加载,不用等待用户访问才加载。

3. 缓存热点

缓存中的个别数据可能是大热点,短时间内会被高频访问,虽然缓存服务器的性能好,但如果访问量过大也会带来性能压力。例如明星的某条微博被海量用户浏览。

解决方案:复制多个缓存副本,分散请求,减轻单体服务器压力。

需要注意:不同副本不要设置统一的过期时间,防止同时失效引起雪崩。可以设定一个过期时间范围,不同副本的过期时间指定范围内的随机值。

---------------END----------------

后续的内容同样精彩

长按关注“IT实战联盟”哦




全部评论: 0

    我有话说:

    高性能缓存架构设计(超实用)

    缓存虽然能够大大减轻存储系统压力,但同时也给架构引入了更多复杂性。

    微服务架构若干常用设计模式

    在我们选择了用微服务架构设计、交付数字化应用后,因微服务架构本身所带来一些共性问题。

    架构实战篇:MyBatis一级、二级,并整合ehcache分布式缓存使用,附演示实例

    ehcache是一个纯Java进程内缓存框架,是一种广泛使用开源Java分布式缓存,具有快速、精干等特点,是Hibernate中默认CacheProvider。

    架构设计原则 - 高并发

    高并发设计可以从以下几方面考虑:无状态拆分服务化消息队列数据异构缓存并发化1. 无状态无状态应用容易进行水......

    精品推荐:缓存架构之实战演练Elastic Job定时实现redis缓存预热、缓存更新

    缓存预热就是系统上线后,将相关缓存数据直接加载到缓存系统。这样就可以避免在用户请求时候,先查询数据库,然后再将数据缓存问题!用户直接查询事先被预热缓存数据!

    创业团队如何设计支撑百万并发数据库架构

    我们来聊一下对于一个支撑日活百万用户高并系统,他数据库架构应该如何设计?

    「轻阅读」聊一聊6种常用架构设计模式(上)

      许多现代应用都需要在企业级规模上进行构建,有时甚至需要在互联网规模上进行构建。这些应用都需要满足可扩展性、可用性、安全性、可靠性和弹性需求。 在本文中,我将谈论一些设计模式,这些模式

    精品推荐:微服务架构下静态数据通用缓存机制

    在分布式系统中,特别是最近很火微服务架构下,有没有或者能不能总结出一个业务静态数据通用缓存处理机制或方案,这篇文章将结合一些实际研发经验,尝试理清其中存在关键问题以及探寻通用解决之道。

    「转载」使用DDD指导业务设计一点思考

    领域驱动设计(DDD) 是 Eric Evans 提出一种软件设计方法和思想,主要解决业务系统设计和建模。DDD 有大量难以理解概念,尤其是翻译原因,某些词汇非常生涩,例如:模型、限界上下文

    架构实战篇(十四):Spring Boot 多缓存实战

    多场景下不同缓存策略解决方案

    微服务架构:搭建网站扫码登录功能设计

    微信扫码登录大家都是应用比较多登录方式了,现在大购物网站像京东、淘宝等都支持使用APP扫码登录网站了。今天就用APP扫码登录网站实例来举例说明微服务架构搭建过程。

    「轻阅读」从MySQL高可用架构看高可用架构设计

    高可用HA(High Availability)是分布式系统架构设计中必须考虑因素之一

    京东技术:京东系统架构师如何让笨重架构变得灵巧

    京东系统架构师,从事架构设计与开发工作,熟悉各种开源软件架构。在Web开发、架构优化上有较丰富实战经历。

    面试官:如何设计数据库秒级平滑扩容架构

    该方案能够实现n库扩2n库秒级、平滑扩容,增加数据库服务能力,降低单库一半数据量,其核心原理是:成倍扩容,避免数据迁移。

    【分享】一次单体架构改造成微服务架构拆分实践

    从5个方面设计这次微服务拆分方案,以及经验总结!

    架构实战篇:一个可供中小团队参考微服务架构技术栈

    作者近年一直在一线互联网公司(携程,拍拍贷等)开展微服务架构实践,根据我个人一线实践经验和我平时对Spring Cloud调研,我认为Spring Cloud技术栈中有些组件离生产级开发尚有

    「轻阅读」阿里云-开放平台高级技术家教你搭建微服务架构四大金刚利器

    孔凡勇,花名云狄,阿里云-开放平台高级技术家,对高并发、高性能、高可用、可伸缩分布式系统架构设计有丰富经验,Cloud Native坚定拥护者,坚守开发一线打磨匠艺架构师。

    架构实战篇:认识一下微服务架构

    微服务是一个新兴软件架构,就是把一个大型单个应用程序和服务拆分为数十个支持微服务。

    Nginx架构详解:nginx 安装和配置

    Nginx (engine x) 是一个高性能HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。