当前位置:   article > 正文

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

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

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

一、正常处理流程

在这里插入图片描述
  先读cache,如果数据命中则返回;如果数据未命中则读db;将db中读取出来的数据入缓存。

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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

二、常见问题

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)设置热点数据永远不过期。

3、缓存雪崩

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

解决方案
(1)缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
(2)如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。
(3)设置热点数据永远不过期。

掌握了吧!必须加分了!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/433457
推荐阅读
相关标签
  

闽ICP备14008679号