前言
此博客用于记录学习 Redis 缓存,此文提到的缓存都为 Redisi 对于缓存的应用。
一、什么是缓存
缓存就是数据交换的缓冲区,是贮存数据的临时地方,一般读写性能较高。
二、缓存的作用
缓存可以降低后端负担,提高读写效率,降低响应时间。有缓存的话,用户在访问页面时资源加载的快一些。
但是利用缓存也有一些问题,就是数据一致性问题,代码维护问题和运维成本问题。
数据一致性是指数据在缓存中和数据库中的数据要一致。在用户访问一个资源的时候,缓存中的值为1,但是数据库此时突然改为2,那么数据就不一致了,用户访问到的实际数据就是错误的。为了解决这个问题,还得考虑到怎么保持数据一致性,也就有了更新策略。
三、更新策略
内存淘汰 | 超时剔除 | 主动更新 | |
---|---|---|---|
说明 | 不用自己维护,利用 Redis 的内存淘汰机制,当内存不足时自动淘汰部分数据。下次查询时更新缓存 | 给缓存数据添加TTL时间,到期后自动删除缓存。下次查询时更新缓存。 | 编写业务逻辑,在修改数据库的同时,更新缓存 |
一致性 | 差 | 一般 | 好 |
维护成本 | 无 | 低 | 高 |
业务场景:
- 低一致性需求:使用内存淘汰机制。例如店铺类型的查询缓存
- 高一致性需求:使用主动更新机制,并以超时剔除机制做兜底。例如店铺详细信息
使用主动更新时,要先删除数据库再删除缓存,这样线程相对安全
- 读操作:
1.缓存命中直接返回数据。
2.缓存未命中,查询数据库,并写入缓存,设定超时时间 - 写操作:
1.先写入数据库再删除缓存
2.要确保数据库与缓存操作的原子性
四、缓存穿透
缓存穿透是指客户端请求的数据再缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。
解决方案:
- 缓存空对象
优点:实现简单,维护方便
缺点: 额外的内存消耗,可能造成短期的不一致 - 布隆过滤
- 增强id的复杂度,避免被猜测id的规律
- 做好数据的基本格式校验
- 加强用户权限校验
- 做好热点参数的限流
五、缓存雪崩
缓存雪崩是指再同一时段大量的缓存 Key 同时失效或者 Redis 服务宕机,导致大量请求到达数据库,带来巨大压力。
解决方案:
- 给不同的 Key 的 TTL 添加随机值
- 利用 Redis 集群提高服务的可用性
- 给缓存业务添加降级限流策略
- 给业务添加多级缓存
六、缓存击穿
缓存击穿问题也叫热点 Key 问题,就是一个被高并发访问并且缓存重建业务较为复杂的 Key 突然失效了,无数的请求访问会瞬间给数据库带来巨大的冲击。
解决方案:
- 互斥锁
- 逻辑过期
解决方案 | 优点 | 缺点 |
---|---|---|
互斥锁 |
|
|
逻辑过期 |
|
|