2哥:3妹,这么晚了还不睡觉啊,在干嘛呢。
3妹:在学习呢,白天上班比较忙,只能在晚上的时间看会儿书了。
2哥:3妹加油,你尽早也会成为你羡慕的大牛的。
3妹:哈哈,多谢2哥。2哥,考考你,你知道redis为什么性能这么高吗?
2哥:这个不难,之前我也研究地,因为是基于内存、单线程、多路复用、特殊的数据结构等。
3妹:哇,2哥厉害,再给我讲讲呗。
2哥:行啊,不过说好,讲完就要睡觉了,熬夜对身体不好。身体是革命的本钱啊。
3妹:好的好的~
如何解决Redis缓存穿透问题?
Redis 缓存穿透指的是攻击者故意大量请求一些Redis缓存中不存在key的数据,导致请 求打到数据库上,导致数据库压力过大。
解决方案如下:
1.做好参数校验,无效的请求直接返回,只能避免一部分情况,攻击者总是可以找到一些没有覆盖的情况。
2.对缓存中找不到的key,需要去数据库查找的key,缓存到Redis中,但是可能会导致Redis中缓存大量无效的key,可以设置一个很短的过期时间,例如1分钟。
3.也可以使用布隆过滤器,将所有可能的存在的数据通过去hash值的方式存入到一个足够大的bitmap中去,处理请求时,通过在bitmap中查找,可以将不存在的数据拦截掉。
如何解决Redis缓存击穿问题?
缓存击穿主要指的是某个热点key失效,导致大量请求全部转向数据库,导致数据库压力过大。
解决方案如下 :
1.对热点key设置永不过期。
2.加互斥锁,缓存中没有热点key对应的数据时,等待100ms,由获得锁的线程去读取数据库然后设置缓存。
如何解决Redis缓存雪崩问题?
缓存雪崩主要指的是短时间内大量key失效,导致所有请求全部转向数据库,导致数据库压力过大。
解决方案如下 :
1.在给缓存设置失效时间时加一个随机值,避免集体失效。
2.双缓存机制,缓存A的失效时间为20分钟,缓存B的失效时间会比A长一些,从缓存A读取数据,缓存A中没有时,去缓存B中读取数据,并且启动一个异步线程来更新缓存A(如果已经有异步线程正在更新了,就不用重复更新了)。以及更新缓存B,以便延迟B的过期时间。
相关阅读
1.Redis概述 https://www.jianshu.com/p/41619e4a00b1
2.Redis的底层数据结构 https://www.jianshu.com/p/f74697b90a4e
3.Redis的过期策略和内存淘汰机制 https://www.jianshu.com/p/be681a4d65ff