缓存基于内存存储,IO 性能好。
toC 或高 QPS 的应用,通常会在 mysql 前面加缓存(例如 redis)。查询的数据如果缓存中有,则直接从缓存中返回(称为命中缓存),不再查询 mysql,减少了对 mysql 的 IO 压力。
目前缓存常见的数据结构是 key-value,从缓存中读取时,不是输入多个搜索条件来获得匹配的结果,而是输入一个 key 获得一个 value。每份缓存数据是 value,其标识是 key。
如果缓存中没有或数据已过期(未命中缓存),则走兜底逻辑查询 mysql。
给缓存设定一定过期时间,并且维护好缓存与数据库一致性,当 mysql 中数据更新时,与缓存做同步(对缓存做更新)。当然引入缓存所带来的缓存与数据库数据一致性问题,也是对技术的挑战。
通过引入缓存,把大部分 QPS 负载压力拦截在缓存层面,大大减轻了对 mysql 的压力。同时由于缓存的 IO 性能好,提高了查询的速度,加快了响应时间。
由于内存容量有限,一次性缓存所有数据是不可能的,缓存通常只存储高频热点数据(借助 LRU 算法)。
为了便于理解,缓存雪崩,缓存击穿,缓存穿透,缓存预热,本地缓存/集中式缓存等概念这里就不提了。