【系统设计】高可用之缓存基础

缓存的缘起

使用缓存的主要原因包括提高系统性能、降低数据库负载、提升用户体验和保证系统可用性。‌

在计算机体系结构中,由于处理器和存储器的处理时间不匹配,在处理器和一个较大较慢的设备之间插入一个更小更快的存储设备(如高速缓存)成为现代设计和实现的一个普遍观念。下图是一个典型的存储器层次结构(来自《深入理解计算机系统·第三版》 ):

进入互联网时代后,基于网络的分布式系统逐步成为主流。互联网应用的用户多、访问量大,用户对系统响应时间感知很敏感,因此对系统提出来新的要求。

与CPU的时间相比,单个用户要求的响应时间很长,如果是人工操作,可能到百毫秒级即可;如果是服务调用,可能要求在毫秒级。数量庞大的请求量则对系统的处理能力提出了新的挑战,也产生了众多的解决方案。

在这些解决方案中,主流的方案之一是使用缓存。根据应用服务功能的特性,提供各种各样的缓存机制。

应用缓存的原理:

与处理器和存储器的处理时间不匹配类似.

处理请求和响应不匹配的本质仍然是处理时间不匹配。

造成响应时间长的典型原因有以下几种:

  • 业务逻辑的复杂性增加了响应的时间;
  • 物理资源的限制引起资源的竞争、排队,从而延长了响应时间;
  • 访问量的突发性,加剧了上述问题的发生概率;
  • 利用上述特性进行主动/恶意攻击,加剧了上述问题发生几率。

缓存的分类

根据缓存所处的位置、担任的角色不同,缓存具有不同的分类方法。

根据缓存在应用中的位置,可以分为浏览器缓存、客户端缓存、服务器缓存、数据库缓存等。

根据缓存的放置方式,可以分为本地缓存、分布式缓存等。

根据缓存的生命周期,有不过期缓存和带过期时间缓存。

几点注意

由于增加了缓存这一中间交互,不可避免的增加了复杂度,也就引出了一些相关的问题点需要注意。

数据不一致

最典型的,是缓存数据和数据库的数据不一致。

其次,如果是分布式缓存,如果存在节点异常,可能会存在多个节点的数据不一致,有脏数据。

热点问题

对于突发事件、重大热点、秒杀、抢票等类似问题,如果采用缓存,相应的数据就会变成热点(hotkey),需要避免热点问题带来的系统崩溃。

缓存雪崩、穿透、击穿

缓存雪崩,是指大量的缓存(不同缓存key)同时大面积失效,导致缓存无效从而导致后端数据库系统的压力过大而崩溃。

缓存穿透,是指请求到空数据,缓存和数据库中都不存在,每次都会落到数据库查询。

缓存击穿,大量请求命中不到缓存而查到数据库,而这些请求请求的是同一条数据。这一点与缓存雪崩有显著差别。

小结

本文根据缓存的来源,简要的介绍了缓存的来源、分类和注意事项,便于对缓存有个概念上的了解。在后续内容将会介绍具体实践内容,以便于更细致的了解。

相关推荐
ZeroToOneDev1 小时前
Java(泛型和JUnit)
java·开发语言·笔记
迪尔~2 小时前
Apache POI中通过WorkBook写入图片后出现导出PDF文件时在不同页重复写入该图片问题,如何在通过sheet获取绘图对象清除该图片
java·pdf·excel
现在,此刻3 小时前
leetcode 11. 盛最多水的容器 -java
java·算法·leetcode
DKPT3 小时前
Java设计模式之开闭原则介绍与说明
java·设计模式·开闭原则
hyy27952276844 小时前
企业级WEB应用服务器TOMCAT
java·前端·tomcat
布朗克1684 小时前
Spring Boot项目通过Feign调用三方接口的详细教程
java·spring boot·feign
Arva .4 小时前
Spring基于XML的自动装配
xml·java·spring
帅得不敢出门6 小时前
Android Framework定制长按电源键关机的窗口
android·java·framework
fatfishccc6 小时前
循序渐进学 Spring (上):从 IoC/DI 核心原理到 XML 配置实战
xml·java·数据库·spring·intellij-idea·ioc·di
小厂永远得不到的男人6 小时前
一篇文章搞懂 java 反射
java·后端