作者:芋荌源 | 来源:互联网 | 2023-09-02 01:19
缓存穿透问题描述:用户不断的进行查询Redis中不存在的数据,并且该数据在数据库中也没有解决办法将查询的key存入Redis中,value为”null“服务端做前置校验与过载保护布
缓存穿透
问题描述:用户不断的进行查询 Redis 中不存在的数据,并且该数据在数据库中也没有
解决办法
将查询的 key 存入 Redis 中,value 为 ”null“
服务端做前置校验与过载保护
布隆过滤器
缓存击穿
问题描述:高并发的系统中,大量的请求同时查询一个 key 时,这个 key 刚好失效
解决办法
加互斥锁,只让第一个线程去查数据库,其余阻塞
缓存不过期
缓存雪崩
问题描述
Redis 中的缓存集体失效
某个缓存服务器节点宕机
解决办法
缓存失效时间分散开
集群缓存
缓存不过期
缓存一致性
方案一
通过 Redis 过期时间更新缓存,数据库更新不会触发 Redis 更新,只有当 key 过期时才会更新
缺点
长时间数据不一致,产生脏数据
完全依赖过期时间,时间太短频繁失效,时间太长长时间更新延迟
方案二
更新 MySQL 同时更新 Redis
缺点:更新 MySQL 成功,更新 Redis 失败,就成了方案一
方案三
方案二的基础上,增加消息队列,将 Redis 更新交由 MQ 由消息队列保证可靠性,异步更新 Redis
缺点
时序问题,多个业务对一条数据进行更新,数据先后顺序可能会乱
引入 MQ,增加复杂性
方案四
MySQL 更新与 Redis 更新放在一个事务中,达到强一致性
缺点
MySQL 与 Redis 一个出现问题,集体魂滚
网络超时出现回滚和并发问题
方案五
通过订阅 Binlog 更新 Redis
缺点:单独搭建同步服务,引入 Binlog 同步机制
本文地址:https://blog.csdn.net/u013570834/article/details/107866669