欢迎光临散文网 会员登陆 & 注册

千锋教育2023版Java面试宝典Java面试200题(含美团、字节、阿里大厂真

2023-07-17 17:39 作者:亚索15783  | 我要投稿

缓存击穿

key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,发现缓存过期后会从mysql中加载数据并回设到缓存,导致mysql被压垮

解决方案:

使用syn双重检验锁,只允许单个线程去查询数据库 效率很低

采用定时器定时查询缓存中的数据,没有就去数据库里查,并存入缓存

使用互斥锁,就是redis的事务队列,就是使用事务阻塞请求,当缓存中没有数据也返回结果,返回null。然后去查询数据库将数据存入redis。客户端会通过重试机制一直查询redis

使用springretry 去查询redis 看有没有数据 如果没有 则查询数据库给存入redis

缓存穿透

大量请求一些不存在的数据 就是请求一些不可能被响应的数据 导致数据库被压垮

解决方案:对空值进行缓存 设置白名单 使用布隆过滤器

将穿透的key存起来,返回空值,请求不会到达mysql 进行接口防刷

缓存雪崩

redis中有大量的key失效了,此时过来大量并发请求。redis无法响应 从而走mysql导致崩溃

解决方案:分散key过期的时间 不要让大量key都在同一时间过期

做双缓存,就是在redis里存两次,客户端第一次获取key_1如果key_1返回null就从key_2获取

采用熔断降级等操作以及redis要保证高可用

千锋教育2023版Java面试宝典Java面试200题(含美团、字节、阿里大厂真的评论 (共 条)

分享到微博请遵守国家法律