这篇文章主要介绍Redis中缓存穿透、击穿、雪崩是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
在某一时刻,大量的key失效,用户大量请求直接请求数据库,导致数据库宕机。此时的Redis形同虚设,用户大量请求都命中不了,导致数据库服务器压力过大,Redis本身是用来减少数据库的压力,那么此时如何解决呢?
缓存雪崩解决方案
1.随机设置缓存的过期时间,以防同时过期大量缓存数据。
var time = Math.random()*10000;>setex name time mango
2.如果是在集群环境中,将热点数据均匀分布在不同的缓存数据库中。
3.也可以热点数据永不过期,如果有数据更新就直接更新redis即可。
>set name mango>set name zhangsan #修改key的value值
缓存里面的一个key非常的火爆,在某一时间这个key刚好过期,大并发数据量击穿了缓存直接请求数据库,导致数据库压力过大,严重情况会导致数据库崩溃,这就是缓存击穿。例如:微博热点新闻,某个明星又出绯闻了,然后大量的粉丝刷文章刷评论,一时间热火朝天,突然请求这条微博的缓存过期,那么大量的请求直接涌向数据库,建立大量连接,数据库还没反应过来就崩了。
缓存击穿解决方案
1.设置这个key永远不会过期
>hset 156486453215 title "mango上热搜" describe "mango太帅了"
2.程序控制请求数据库的次数,比如添加互斥锁、延时请求(1s后请求)
public static string GetData(string key){ //从redis查数据 string result = RedisHelper.GetDataByKey(key); if(string.IsNull(result)) //获取到空数据 { lock(obj) //锁定资源 { //从数据库获取数据 result = DB.GetDataByKey(key); //校验 if(!string.IsNull(result)) { RedisHelper.SetData(key,result); //缓存且返回 return result; } } Thread.sleep(1000); //先睡一觉 }}
意思大概是这么个意思,代码的话,哈哈哈,明白意思最重要。
3.服务器熔断、降级,限制每个用户的访问次数,并且如果获取不到数据即返回一个固定的推荐页面。
用户不断地请求一个缓存没有并且数据库也没有的数据,服务器疯狂的跟数据库建立连接从而压倒数据库。比如说:根据产品id获取产品详情的接口,那么我用一个id=-1去请求,那肯定是获取不到任何数据的。一般这样的情况有可能服务器遭到了恶意攻击。
缓存穿透解决方案
1.在用户请求的接口层增加一些校验,例如:用户鉴权校验、参数传值校验等不合法的参数请求即直接返回。开发者应该保持一个悲观的态度,不要相信任何客户端因为计算机本身不知道操作者是谁,任何参数都应该考虑到。
if(id < 0){ return("参数不合法");}
2.使用Redis高级数据结构布隆过滤器(Redis如何实现刷抖音不重复-布隆过滤器(Bloom Filter)),他就是检测数据库中是否存在该key,不存在就直接返回即可。
>bf.mexists user(integer) 0 #如果不存在,则return
写到最后
缓存的雪崩、击穿、穿透其实都是客户端请求直接越过缓存直接请求数据库,但是他们从意义上来讲又有微妙的不同。大家一定要理解这三者是如何产生的,才能对症下药。
在用户请求的时候我们可以配置服务器的熔断+降级,保证服务器不会崩溃,用户请求频繁可以限制它的请求次数,或者可以牺牲部分用户的性能。
一般来讲数据到达一定量后,为了保证服务器的高可用,我们会对redis建立集群或者是主从+哨兵模式,避免redis直接挂掉没有任何的机器代替。也可以使用redis持久化,如果Redis崩溃,重启后且恢复数据
当然,我们也要保证数据库本身具有一定的抗压性,比如我们添加一主多从的数据库,保证数据库不会那么容易崩溃。
以上是“Redis中缓存穿透、击穿、雪崩是什么”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。