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

Redis缓存:缓存穿透、缓存击穿、缓存雪崩

作者头像
鳄鱼儿
发布2024-05-22 08:55:04
1310
发布2024-05-22 08:55:04
举报
文章被收录于专栏:鳄鱼儿的技术分享

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情

🍀缓存穿透

缓存穿透是指数据库和缓存都没有的数据,每次都要经过缓存直接去访问数据库,大量的请求打到DB可能导致DB宕机。

强调都没有数据+并发访问

如果请求一条DB中不存在的数据,此时缓存是不命中的,会请求到DB中,DB查询不到数据因此也不会同步缓存,每次请求都要请求到DB去查询,失去了缓存的意义。在并发访问时,大量请求打到DB,DB可能就会宕机。

☘️解决思路

思路一:由于缓存穿透是因为缓存没有生效,是否可以针对DB不存在的数据设置缓存空值,让请求到缓存就OK。缓存的有效时间可以设置短点,如30s,避免误伤正常业务。

思路二:采用布隆过滤器 (Bloom Filter) ,将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个不存在的数据会被这个 bitmap 拦截掉,从而避免了对DB的查询压力。

布隆过滤器原理:当一个元素被加入集合时,通过k个散列函数将这个元素映射成一个位数组中的k个点,并将其置为1。当查询时,将元素通过散列函数得到k个点,如果这些点存在不为1的,则被检元素一定不存在,直接返回;如果都是1,则查询元素可能存在,就会查询缓存和DB。

🍀缓存击穿

缓存击穿是指数据库有,缓存没有的数据,大量请求访问这个缓存不存在的数据,最后请求打到DB可能导致DB宕机。

强调单个Key过期+并发访问

缓存击穿区别缓存穿透在于,缓存击穿是大量请求同时查询同一个key,而这个key失效了,导致大量请求打到DB,导致DB可能宕机。缓存穿透是请求DB中不存在的数据。

☘️解决思路

思路一:加分布式锁(高并发转低并发),第一个请求的线程拿到锁之后查询DB,并同步缓存,其余线程获取锁失败后会等待一段时间(如50ms),然后重新到缓存中获取数据,将访问DB(慢设备)时高并发转低并发。

思路二:对于热点数据采用隔离环境,即便热点环境宕机也不会影响到正常环境,一般而言不需要隔离,其成本比较大,只有在大型活动中才可能采用,如618、双11等。

思路三:保证热点数据在缓存中,可以设置热点缓存数据永不过期;或者采用定时任务去定时刷新缓存数据与过期时间,保证缓存数据存在。

🍀缓存雪崩

缓存雪崩是指数据库有,缓存没有的数据,大量请求访问这些缓存不存在的数据,最后请求打到DB可能导致DB宕机。

强调批量Key过期+并发访问

缓存雪崩在于大量的缓存key失效,大量请求全部打到DB,DB可能会因为瞬时大流量压力而宕机。

☘️解决思路

思路一:由于是设置的key过期时间一样,导致同一时间大量数据失效。我们可以改变缓存失效时间,在原有失效时间上增加一个随机值,最终的目的是让数据分散在不同的时间点过期。

🍀缓存一致性

缓存一致性指的是缓存与DB之间的数据一致性,我们需要通过各种手段来防止缓存与DB不一致,我们要保证缓存与DB的数据一致或者数据最终一致。

☘️解决思路

思路一:先删除缓存再更新数据。在更新DB时,先删除缓存,后续请求再次请求时会请求到DB,将DB中数据同步到缓存。存在问题,删除缓存后,期间有请求过来,可能会从DB中读取到旧数据,导致缓存不一致。

思路二:先更新数据再删除缓存。问题:更新DB和缓存删除期间,请求读到的数据还是旧数据,等待更新完,数据就会恢复一致。

思路三:异步更新缓存。DB更新完后,不直接操作缓存,通过消息队列让redis消费,消息队列可以保证数据操作顺序一致性,确保数据最终一致性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-21,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🍀缓存穿透
    • ☘️解决思路
    • 🍀缓存击穿
      • ☘️解决思路
      • 🍀缓存雪崩
        • ☘️解决思路
        • 🍀缓存一致性
          • ☘️解决思路
          相关产品与服务
          云数据库 Redis
          腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档