在提高系统性能的各种方案中,缓存是往往人们最容易想到且有效的一种方式。
缓存的作用便是让数据离使用者更近,访问速度更快。
缓存主要用在两种场景中:
经常读取的数据、高频访问的数据、热点数据、I/O瓶颈数据、计算昂贵的数据、不变的数据、弱一致性数据
缓存的数据一般由 Key 与 Value 两部分组成。
Key 设计考虑因素:
用户是最初始的请求发起方,与用户交互的模块称为客户端(如浏览器、电脑客户端、手机、嵌入式系统界面等)。
如浏览器缓存,当我们使用浏览器访问一些网站页面或 Http 访问时,可以根据服务端返回的缓存设置响应头将响应内容缓存到浏览器中,下次可以直接使用缓存内容或者仅需去服务端验证缓存是否过期即可。
如首页中的图片、视频、音乐等静态资源可以放在如 Nginx 等 Web 服务器上。
在这里可以缓存与用户无关的元素、页面等通用性很强的数据。
指在应用中的缓存组件,应用与缓存在同一个进程内部,没有过多网络开销。
适用于单节点的应用,将数量少、改动小、访问频率高的数据进行缓存。
常用的本地缓存组件有 HashMap、Guava Cache、Caffeine。
常用的分布式缓存包括 Redis、Memcached、Tair。其中 Redis 提供的数据结构丰富且简单易用,所以在应用实践中使用最为广泛。
如 Mysql 的 Query Cache,SQL Server 的 Procedure Cache。
这种模式由业务代码直接维护缓存。
SoR(System of Record):记录系统,即实际存储原始数据系统。
这种模式所有操作都是对 Cache 操作,然后 cache 再委托 SoR 完成数据的读、写操作。即业务代码中只能与 Cache 交互,而 Cache 则与数据库交互,进行数据读写。
这种模式叫回写模式,也称 Write Back。
与 Write Through 同步写入缓存和数据库不同,Write Back 在写操作时,先写入缓存,然后异步写入数据库。异步以后可以实现批量写、合并写、延时和限流。
在日常的实际应用中,Cache-Aside 模式较为常见。在这个模式中,缓存用来提高查询速度,可以把它当作一个辅助性的东西;当缓存出现问题时,仍可直接查询数据库完成读写操作。在 Cache-As-SoR 模式中,调用方只能直接调用缓存服务,真正的原始数据系统对其不可见;此时缓存服务发生问题,则会无法读写数据,相关的功能都会受到影响。
为缓存的数据设置失效时间,到达时间后自动清理。
时效式清理策略简单易用,限定了数据的存活时间,但是无法限定缓存的空间大小。
数目阈值式清理可以通过限制数据的数目来间接限定缓存空间的大小。在缓存中的数据达到一定的阈值后,开始根据不同的策略进行清理。
先进先出( First in First out),当缓存中的数据达到上限时,优先清理最先写入的数据
最近最少使用(Least Recently Used),如果一条数据最近被访问过,则认为它很可能接下来还会被访问;如果一条数据长期没有被访问,则它很可能接下来依旧不会被访问。
因此,当缓存清理时,优先清理长久未被访问的数据,保留最近被访问过的数据。
最不经常使用 (Least Frequently Used),优先淘汰访问频率最小的数据
概念 :调用方查询缓存中不存在的数据,导致缓存无法命中,穿透到后端数据库进行查询。当这样的请求发生高频、大量调用时,对系统造成巨大压力。
解决方案:
概念 :指大量缓存突然失效,给后端服务及数据库造成巨大压力。
解决方案:
概念 :一个高频访问的热点 Key 突然失效,大量请求同时访问数据库造成巨大压力。
解决方案:
领取专属 10元无门槛券
私享最新 技术干货