【1 Redis—问题】写在前面Redis 是一种 NoSQL 数据库 , 包含多种数据结构、支持网络、基于内存、可选持久性的键值对存储数据库 , 在我们的日常开发中会经常使用 Redis 来解决许多问题 , 比如排行榜、消息队列系统、计数器 以及 缓存系统等 。
在作为缓存使用时 , 不可避免的会遇到缓存穿透、缓存雪崩、缓存击穿(热点 key) 的问题 , 那么究竟这些问题具体值的是什么 , 又该如何解决呢?
什么是缓存穿透缓存穿透是指客户端请求的数据在缓存和数据库中都不存在 , 引起缓存失效 , 并会对数据库造成极大的压力 。常见的解决方案有两种:
- 缓存空对象
- 优点:实现简单 , 维护方便
- 缺点:
- 额外的内存消耗
- 可能造成短期的不一致
- 布隆过滤
- 优点:内存占用少 , 没有多余的key
- 缺点:
- 实现复杂
- 可能存在误判
- 增加 id 的复杂度 , 避免被猜到 id 规律 。
- 做好数据的基础格式校验 。
- 加强用户的权限校验 。
- 做好热点参数的限流(sentinel) 。
什么是缓存雪崩缓存雪崩是指在同一时间段大量的缓存 key 同时失效或者 Redis 服务宕机 , 导致大量请求到达数据库 , 对数据库造成极大的压力 。常见的解决方案有:
- 给不同的 key 的 TTL添加随机值 。
- 利用 Redis 集群提高服务的可用性 。(Redis 主从 , 哨兵)
- 给缓存业务添加降级限流策略(sentinel) 。
- 给业务添加多级缓存 。
什么是缓存击穿缓存击穿也叫热点 key 问题 , 是指一个被高并发访问并且缓存重建业务比较复杂的key 突然失效了 , 无数的请求访问会在瞬间给数据库带来巨大的冲击 。常见的解决方案有:
- 互斥锁
- 优点:
- 没有额外的内存消耗
- 保证一致性
- 失效简单
- 缺点:
- 线程需要等待 , 性能收到影响
- 可能有死锁的风险
- 优点:
- 逻辑过期
- 优点:
- 线程无需等待 , 性能较好
- 缺点:
- 不保证一致性
- 具有额外内存消耗
- 实现复杂
总结以上就是对缓存穿透、缓存雪崩、缓存击穿问题的简单介绍和解决办法 , 更加具体的实现方法 , 正在整理中...
经验总结扩展阅读
- 豆芽煮多久能熟
- 之四 2流高手速成记:SpringBoot整合redis及mongodb
- 自己动手写线程池——向JDK线程池进发
- 没有房产证的房子存在哪些隐患问题 房产证办理流程是怎样的
- 4平米卫生间改造费用 4平米卫生间改造关注哪些问题
- 飘窗装修需注意什么问题 飘窗怎么利用
- 甲醛真的会造成白血病吗 甲醛超标会引起哪些健康问题
- 『现学现忘』Git分支 — 39、Git中分支与对象的关系
- 虚拟化_Vmware——敬请期待!
- 虚拟化_Xen——敬请期待!