什么是缓存


一、什么是缓存?
定义:
- 缓存是数据交换的缓冲区(Cache)
- 临时存储数据的地方
- 读写性能较高
简单理解:
缓存 = 临时仓库
- 把常用的东西放在临时仓库(缓存)
- 需要时快速取用
- 比从主仓库(数据库)取快很多
二、缓存的层次结构
| 层次 | 位置 | 作用 | 速度 | 容量 |
|---|---|---|---|---|
| 浏览器缓存 | 用户浏览器 | 缓存网页、图片等 | 最快 | 较小 |
| 应用层缓存 | 应用服务器(如Tomcat) | 缓存业务数据 | 快 | 中等 |
| 数据库缓存 | 数据库服务器 | 缓存查询结果 | 较快 | 较大 |
| CPU缓存 | CPU内部 | 缓存指令和数据 | 极快 | 很小 |
| 磁盘缓存 | 硬盘 | 缓存磁盘数据 | 快 | 较大 |
数据流向:
浏览器缓存
↓(未命中)
应用层缓存(如Redis)
↓(未命中)
数据库缓存
↓(未命中)
CPU缓存/磁盘缓存
↓(未命中)
数据库/硬盘
三、缓存的作用(优点)
| 作用 | 说明 | 例子 |
|---|---|---|
| 降低后端负载 | 减少对数据库的访问 | 1000个请求,900个从缓存取,只有100个查数据库 |
| 提高读写效率 | 缓存速度快,响应快 | 从缓存取数据:1ms,从数据库取:100ms |
| 降低响应时间 | 用户等待时间更短 | 有缓存:0.1秒,无缓存:1秒 |
实际效果:
无缓存:
用户请求 → 查数据库(慢)→ 返回结果(1秒)有缓存:
用户请求 → 查缓存(快)→ 返回结果(0.01秒)
四、缓存的成本(缺点)
| 成本 | 说明 | 解决方案 |
|---|---|---|
| 数据一致性成本 | 缓存和数据库数据可能不一致 | 设置过期时间、更新时同步 |
| 代码维护成本 | 需要写缓存逻辑,代码更复杂 | 封装缓存工具类 |
| 运维成本 | 需要维护缓存服务器(如Redis) | 监控、备份、扩容 |
实际影响:
数据一致性:
- 数据库更新了,缓存可能还是旧数据
- 需要同步更新缓存代码维护:
- 需要写:查缓存 → 查数据库 → 更新缓存
- 代码更复杂运维成本:
- Redis服务器需要维护
- 需要监控、备份
五、缓存使用场景
| 场景 | 是否适合用缓存 | 原因 |
|---|---|---|
| 热点数据 | ✅ 适合 | 访问频繁,缓存效果好 |
| 读多写少 | ✅ 适合 | 读操作多,缓存命中率高 |
| 实时性要求低 | ✅ 适合 | 可以接受短暂的数据延迟 |
| 实时性要求高 | ❌ 不适合 | 需要实时数据,缓存可能延迟 |
| 写多读少 | ❌ 不适合 | 写操作多,缓存命中率低 |
六、缓存最佳实践
| 实践 | 说明 | 例子 |
|---|---|---|
| 设置过期时间 | 避免数据一直存在 | 验证码2分钟过期 |
| 更新时同步 | 数据库更新时更新缓存 | 用户信息更新,同时更新Redis |
| 缓存穿透防护 | 防止查询不存在的数据 | 查询空结果也缓存(短时间) |
| 缓存雪崩防护 | 避免大量缓存同时过期 | 过期时间加随机值 |
| 监控缓存命中率 | 了解缓存效果 | 命中率90%以上较好 |
七、缓存存在哪里
| 问题 | 答案 |
|---|---|
| 缓存存在哪里? | 主要在内存中 |
| 为什么用内存? | 速度快,适合临时存储 |
| Redis存在哪里? | Redis服务器的内存中 |
| 断电后数据会丢失吗? | 会(但可以配置持久化) |
| 你的项目缓存存在哪里? | Redis服务器的内存中 |
