什么是缓存?

缓存是将高频访问的数据暂存到内存中,是加速数据访问的存储,降低延迟,提高吞吐率的利器

缓存详细介绍

不要被 HTTP、CDN、Nginx、分布式缓存这些名词吓到,这些我放在后面再说。首先,它们本质上都在做同一件事:把“访问慢但经常用的数据”提前放到“访问快的地方”。

更通俗的说,假设你经常查一本字典:

没有缓存时:每次要查单词,都去书架上找整本字典。

有缓存时:你把最近经常查的单词写在桌面小纸条上,下次直接看纸条

现实例子 程序中的含义
书架上的字典 数据库/磁盘
桌面上的小纸条 缓存
查到数据 cache hit缓存命中
未查到数据 cache miss缓存未命中
桌面的空间不够了 缓存满了
丢掉不用的或者过期的小纸条 缓存淘汰策略

接下来我会将表格中的例子一一解释清楚;
 

1.缓存最基础的三个动作

put(key,value):放入缓存    get(key);读取缓存     delete(key);删除缓存

最简单的例子:

get(key):                                                             put(key,value):

1. 判断 key 是否在缓存中                                   1.如果key已经存在
2. 如果在:                                                             更新value,更新访问记录;
      返回 value                                                     2.如果key不存在
      更新访问记录                                                    判断缓存是否已满
3. 如果不在:                                                       3.缓存满了,根据淘汰策略删除旧数据
      返回空                                                               缓存没满,直接插入新数据

2.缓存中的主要概念

缓存命中(cache hit):用户请求 user:1001    缓存有  user:1001   返回;

缓存未命中(cache miss):用户请求   缓存没有   去数据库查询  查询后放入缓存   返回;

命中率越高,缓存效果就越好,因为响应速度快;

缓存淘汰策略:缓存淘汰策略非常重要,决定了桌面纸条满了如何清理,非常影响工作效率,常见的策略有以下四种,后面也会更新不同策略的具体细节。

a.FIFO先进先出:先进先出,这是最简单、最公平的一种算法,它认为一个数据最早进入缓存,在将来该数据被访问的可能性最小。其原理是最早进入缓存的数据应该最早被淘汰掉,即当缓存空间被占满时,最先进入的数据会被最早被淘汰。

b.LRU最近最少使用:它的设计原则借鉴了时间局部性原理,该算法认为如果数据最近被访问过,那么将来被访问的几率也更高,反之亦然。其原理是将数据按照其被访问的时间形成一个有序序列,最久未被使用的数据应该最早被淘汰掉,即当缓存空间被占满时,缓存内最长时间未被使用的数据将被淘汰掉。

c.LFU最少使用频率: 它的设计原则使用了概率思想,该算法认为如果一个对象的被访问频率很低,那么再次被访问的概率也越低。其原理是缓存空间中被访问次数最少的数据应该最早被淘汰掉,即当缓存空间被占满时,缓存内被访问频率最少的数据将被置换走。

d.TTL定时清理:每个缓存数据设置一个有效期,TTL 不是严格意义上的淘汰策略,但实际缓存系统里非常常见

基础缓存模块: 存储模块     查询模块    淘汰策略模块    过期时间模块    并发安全模块

常见的存储介质:CPU缓存,内存,SSD/硬盘,数据库,详情如下;

下一期将进入实操环节

适合小白的嵌入式软件项目(C++)详解-----卡码缓存系统(二)实现最简单缓存

适合小白的嵌入式软件项目(C++)详解-----卡码缓存系统(三)加容量限制

适合小白的嵌入式软件项目(C++)详解-----卡码缓存系统(四)实现淘汰策略

适合小白的嵌入式软件项目(C++)详解-----卡码缓存系统(五)加入过期时间 TTL

适合小白的嵌入式软件项目(C++)详解-----卡码缓存系统(六)考虑并发安全

适合小白的嵌入式软件项目(C++)详解-----卡码缓存系统(特别篇)代码必备数据结构知识

更多推荐