前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >缓存雪崩 & 缓存穿透

缓存雪崩 & 缓存穿透

作者头像
一个会写诗的程序员
发布2019-07-01 10:35:09
1.3K0
发布2019-07-01 10:35:09
举报
文章被收录于专栏:一个会写诗的程序员的博客

缓存雪崩 & 缓存穿透

缓存雪崩 & 缓存穿透.png

缓存流程

1.参数传入对象主键ID

2.根据key从缓存中获取对象

3.如果对象不为空,直接返回

4.如果对象为空,查询数据库

5.如果从数据库查询出的对象不为空,则放入缓存(设定过期时间)

缓存雪崩

如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了。

如果缓存数据设置的过期时间是相同的,并且Redis恰好将这部分数据全部删掉。

这就会导致在这段时间内,这些缓存同时失效,全部请求到数据库中。

缓存挂掉解决方案

  • 事发前
    • 主从架构+Sentinel
    • Cluster
    • 分布式缓存架构
    • 设置过期标志更新缓存
    • 使用锁或队列
    • 二级缓存
  • 事发中
    • 设置本地缓存(ehcache)+限流(hystrix)
  • 事发后
    • 缓存持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据

缓存过期时间集中解决方案

  • 过期时间设置随机

缓存穿透

查询缓存和数据库中都没有的数据

  • 例如:查询一个一定不存在的数据

解决方案

  • 使用布隆过滤器(BloomFilter)提前拦截
    • 将所有可能存在的数据哈希到一个足够大的bitmap中, 一个一定不存在的数据会被这个bitmap拦截掉, 从而避免了对底层存储系统的查询压力。
  • 用户鉴权校验,id校验
  • 缓存空对象,设置一个较短的过期时间,让其自动剔除

缓存击穿

爆炸查询缓存中没有但数据库中有的数据

解决方案

  • 设置热点数据永远不过期
  • 加互斥锁,防止都去数据库重复取数据,重复往缓存中更新数据情况出现

互斥锁(mutex lock)

  • 只让一个线程构建缓存,其他线程等待构建缓存的线程执行完, 重新从缓存获取数据
  • 单机
    • 用synchronized或者lock
  • 分布式
    • 分布式锁,可以用memcache的add, redis的setnx, zookeeper的添加节点操作

缓存预热

系统上线后,将相关的缓存数据直接加载到缓存系统。

定时刷新缓存

缓存更新

定时去清理过期的缓存

缓存降级

保证核心服务可用

缓存与数据库双写不一致的问题

解决方案

  • 将删除缓存、修改数据库、读取缓存等的操作 积压到队列里边,实现串行化
  • Cache Aside Pattern
    • 将需要删除的key发送到消息队列中
    • 自己消费消息,获得需要删除的key
    • 不断重试删除操作,直到成功
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.06.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缓存雪崩 & 缓存穿透
    • 缓存流程
      • 1.参数传入对象主键ID
      • 2.根据key从缓存中获取对象
      • 3.如果对象不为空,直接返回
      • 4.如果对象为空,查询数据库
      • 5.如果从数据库查询出的对象不为空,则放入缓存(设定过期时间)
    • 缓存雪崩
      • 如果我们的缓存挂掉了,这意味着我们的全部请求都跑去数据库了。
      • 如果缓存数据设置的过期时间是相同的,并且Redis恰好将这部分数据全部删掉。
      • 缓存挂掉解决方案
      • 缓存过期时间集中解决方案
    • 缓存穿透
      • 查询缓存和数据库中都没有的数据
      • 解决方案
    • 缓存击穿
      • 爆炸查询缓存中没有但数据库中有的数据
      • 解决方案
      • 互斥锁(mutex lock)
    • 缓存预热
      • 系统上线后,将相关的缓存数据直接加载到缓存系统。
      • 定时刷新缓存
    • 缓存更新
      • 定时去清理过期的缓存
    • 缓存降级
      • 保证核心服务可用
    • 缓存与数据库双写不一致的问题
      • 解决方案
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档