
不管是手机 APP、电脑软件、网页网站还是服务器后台系统、电脑硬件硬件结构缓存机制无处不在。绝大多数普通用户只会在软件卡顿、存储空间不足时点开设置清理缓存却始终不清楚缓存设计的核心目的是什么甚至会误以为缓存只是多余的垃圾文件。对于 IT 研发人员来说缓存更是系统性能优化里最基础也最重要的一环几乎所有高并发、高访问量的线上项目都会把缓存当作架构里必不可少的组成部分弄懂缓存的本质就能理解绝大多数软件提速的底层思路。我认为缓存最核心的本质可以概括为一句话将短时间内会被重复访问、改动频率较低的数据存储在读写速度远高于原始数据源的介质当中后续再次访问该数据时直接从高速介质读取绕过速度缓慢的原始数据源以此缩短响应时间、降低底层数据源的访问压力。我们可以用生活场景做类比理解图书馆相当于最终的原始数据源藏书数量庞大但每次借阅需要登记查找流程繁琐耗时书桌就相当于缓存空间我们把接下来几天需要反复翻看的书籍直接放在桌面上不用每次都往返图书馆借阅取用效率会大幅提升桌面的存储空间有限只能存放少量常用书籍这也对应了缓存容量有限、无法存储全部数据的特性。映射到计算机与服务器领域硬盘是计算机永久存储数据的底层介质存储空间极大但读写速度很慢内存读写速度远超硬盘程序运行时就会把需要频繁调用的数据加载进内存缓存避免程序每一次取值都读取硬盘这也是电脑开机后软件打开速度更快的原因。放到互联网服务端项目里数据库相当于硬盘负责持久化存储所有业务数据支持海量数据存储但数据库每一次查询操作都需要磁盘 IO并发请求量大时数据库处理能力会快速到达上限出现查询超时、系统卡顿甚至直接宕机崩溃的问题。此时我们引入 Redis 这类内存型缓存数据库作为中间层商品详情、首页公告、用户基础信息这类大量用户重复查看、短时间内不会频繁修改的数据会提前存入缓存。当用户发起访问请求时系统会优先查询缓存如果缓存内存在对应数据直接返回结果完全不会访问数据库只有缓存未命中、数据不存在时才会查询数据库并且把查询到的数据写入缓存供后续请求直接读取。这样一来绝大多数流量都会被缓存承接数据库仅承担少量新增、修改、删除类请求服务器整体并发承载能力能提升数倍乃至数十倍。当然了缓存并非没有缺陷缓存数据和数据库原始数据可能出现信息不一致的情况也就是数据库数据更新后缓存里还是旧数据同时缓存硬件资源成本更高无法无限制存储数据还会出现缓存空间占满需要淘汰旧数据的问题。因此正式项目中会搭配缓存过期时间、主动更新策略、数据淘汰算法、空值缓存等配套方案规避弊端。、总而言之缓存是用少量更高成本的高速存储空间换取整个系统极高的运行效率是所有高性能软件与互联网服务不可或缺的核心设计。