前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【Redis实战】面试热点:缓存穿透、缓存击穿、缓存雪崩的区别和解决方案

【Redis实战】面试热点:缓存穿透、缓存击穿、缓存雪崩的区别和解决方案

作者头像
程序员云帆哥
发布2022-05-12 08:57:06
发布2022-05-12 08:57:06
31500
代码可运行
举报
文章被收录于专栏:程序员云帆哥程序员云帆哥
运行总次数:0
代码可运行

这个是大厂面试热点!只要问到Redis,没有不问这个的。

一、正常处理流程

  先读cache,如果数据命中则返回;如果数据未命中则读db;将db中读取出来的数据入缓存。

代码语言:javascript
代码运行次数:0
运行
复制
private Map cache = new ConcrrentHashMap();
Object getFromCache(String key){
	Object value = cache.get(key);
	if(value==null){
		value = getByKey(key);
		cache.put(key,value);
	}
	return value;
}

二、常见问题

1、缓存穿透

  访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。

解决方案 (1)采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤;(注意:说完布隆过滤器,就要被问到布隆过滤器的原理了,准备下!) (2)拦截器,接⼝层增加校验,如给id做校验,id<=0的直接拦截。 (3)从cache和db都取不到,可以将key-value写为key-null,设置较短过期时间,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。

2、缓存击穿

  一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。

解决方案 (1)设置热点数据永远不过期。 (2)加互斥锁。

3、缓存雪崩

  大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。

解决方案   主要说前三个就可以啦! (1)缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。 (2)如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。 (3)设置热点数据永远不过期。 (4)使用互斥锁,但是该方案吞吐量明显下降了。 (5)双缓存。我们有两个缓存,缓存A和缓存B。缓存A的失效时间为20分钟,缓存B不设失效时间。自己做缓存预热操作。然后细分以下几个小点:

  • 从缓存A读数据,有则直接返回
  • A没有数据,直接从B读数据,直接返回,并且异步启动一个更新线程。
  • 更新线程同时更新缓存A和缓存B。

掌握了吧!必须加分了!

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、正常处理流程
  • 二、常见问题
    • 1、缓存穿透
    • 2、缓存击穿
    • 3、缓存雪崩
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档