Redis 缓存穿透、缓存击穿、缓存雪崩以及缓存一致性问题

缓存穿透

问题描述:用户不断的进行查询 Redis 中不存在的数据,并且该数据在数据库中也没有

解决办法

  1. 将查询的 key 存入 Redis 中,value 为 ”null“
  2. 服务端做前置校验与过载保护
  3. 布隆过滤器

缓存击穿

问题描述:高并发的系统中,大量的请求同时查询一个 key 时,这个 key 刚好失效

解决办法

  1. 加互斥锁,只让第一个线程去查数据库,其余阻塞
  2. 缓存不过期

缓存雪崩

问题描述

  1. Redis 中的缓存集体失效

  2. 某个缓存服务器节点宕机

解决办法

  1. 缓存失效时间分散开
  2. 集群缓存
  3. 缓存不过期

缓存一致性

方案一

通过 Redis 过期时间更新缓存,数据库更新不会触发 Redis 更新,只有当 key 过期时才会更新

缺点

  1. 长时间数据不一致,产生脏数据
  2. 完全依赖过期时间,时间太短频繁失效,时间太长长时间更新延迟

方案二

更新 MySQL 同时更新 Redis

缺点:更新 MySQL 成功,更新 Redis 失败,就成了方案一

方案三

方案二的基础上,增加消息队列,将 Redis 更新交由 MQ 由消息队列保证可靠性,异步更新 Redis

缺点

  1. 时序问题,多个业务对一条数据进行更新,数据先后顺序可能会乱
  2. 引入 MQ,增加复杂性

方案四

MySQL 更新与 Redis 更新放在一个事务中,达到强一致性

缺点

  1. MySQL 与 Redis 一个出现问题,集体魂滚
  2. 网络超时出现回滚和并发问题

方案五

通过订阅 Binlog 更新 Redis

缺点:单独搭建同步服务,引入 Binlog 同步机制

本文地址:https://blog.csdn.net/u013570834/article/details/107866669

(0)
上一篇 2022年3月21日
下一篇 2022年3月21日

相关推荐