架构设计——缓存:缓存的原理与应用
网站访问特点和现实世界的财富分配一样遵循二八定律:80%的业务访问集中在20%的数据上。既然大部分的业务访问集中在一小部分数据上,那么就可以把这一小部分数据缓存在内存中,可以减少数据库的访问压力,提高整个网站的数据访问速度,改善数据的写入性能。
网站性能优化第一定律:优先考虑使用缓存优化性能。
本文参照:
《大型数据技术架构——核心原理与案例分析》 ——李智慧
《亿级流量网站架构核心技术》 ——张开涛
极客时间:《左耳听风》——64:性能设计篇之"缓存"
缓存无处不在
在整个网站应用中,缓存几乎无处不在,既存在于浏览器,也存在于应用服务器和数据库服务器;既可以对数据缓存,也可以对文件缓存,还可以对页面片段缓存。
-
CDN:英文全称为content delivery network,即内容分发网络,部署在距离终端用户最近的网络服务商,用户的请求总是最先达到他的网络服务商那里,将网站的一些静态资源缓存在这里,可以就近以最快的速度返回给用户。如视频网站和用户网站会将用户访问量大的热点内容部署在CDN。
-
反向代理:属于网站前端架构的一部分,部署在网站的前端,当用户请求到达网站的数据中心时,最先访问到的就是反向代理服务器,这里缓存网站的静态资源,无需将请求继续转发给应用服务器就能返回给用户。
-
本地缓存:在应用服务器本地缓存热点数据,应用可以直接在本机内存中访问数据,无需访问数据库。
-
分布式缓存:本地缓存受到应用服务器内存限制,其缓存数量有限,而且会出现和应用程序竞争内存的情况。将数据缓存在分布式缓存集群中,应用程序通过网络通信访问缓存数据。
什么样的数据需要缓存
- 数据访问热点不均匀:某些数据会被更频繁地访问,这些数据应该放在缓存中;
- 不会很快过期:数据在某个时间段内有效,不会很快过期,否则缓存的数据就会因为失效而产生脏读,影响结果的正确性。
缓存的基本原理
缓存是指将数据存储在相对较高访问速度的存储介质中,以供系统处理。
缓存的本质是一个内存Hash表,Hash表数据读写的时间复杂度是O(1),下图是一对Key、Value在Hash表中的存储。
计算Key的HashCode对应的Hash表索引,可以快速访问Hash表中的数据。通过HashCode值可以得到Hash表的索引下标,最简单的就是余数法,使用Hash表数组长度对HashCode求余,余数即为Hash表索引。
缓存主要用来存放那些读写比很高、很少变化的数据。如商品的类目信息,热门词的搜索列表信息,热门商品信息等。
缓存失效策略\缓存淘汰算法
当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据。常用的淘汰算法有下面几种:
- FIFO:First In First Out,先进先出。判断被存储的时间,离目前最远的数据优先被淘汰。
- LRU:Least Recently Used,最近最少使用。判断最近被使用的时间,目前最远的数据优先被淘汰(淘汰最近不使用的页面)。
- LFU:Least Frequently Used,最不经常使用(最近使用次数最少)。在一段时间内,数据被使用次数最少的,优先被淘汰( 淘汰使用次数最少的页面)。
https://www.cnblogs.com/s-b-b/p/6047954.html
LRU的实现思路
最常见的实现是使用一个链表保存缓存数据,详细算法实现如下:
- 新数据插入到链表头部;
- 每当缓存命中(即缓存数据被访问),则将数据移到链表头部;
- 当链表满的时候,将链表尾部的数据丢弃。