前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >聊聊什么是缓存雪崩和缓存穿透

聊聊什么是缓存雪崩和缓存穿透

作者头像
Lvshen
发布2022-05-05 19:20:08
3060
发布2022-05-05 19:20:08
举报

缓存雪崩

假如一个系统,它在高峰期有每秒7000个请求,这时我们使用缓存抗住了这么高的请求。但如果在某个时间点缓存大量失效,或者缓存服务器挂掉了,那么这些请求就会直接作用在普通数据库中(如MySQL)。这么高的请求量,MySQL肯定抗不住,进而挂掉,数据库一挂,也会导致系统挂掉。

我们总结缓存雪崩触发的条件:

  • 高并发情况下
  • 缓存服务器挂了
  • 大量缓存集中失效

导致的后果就是:系统崩溃。

解决思路,对数据库增加限流排队访问,假设我们的数据库最多能抗住每秒2000的请求,那当我们请求数据库时,每秒的请求就需要控制在2000内,其余的请求就需要排队。同时我们要保证缓存服务器的高可用,就需要使用集群。另外我们也需要随机设置缓存key的失效时间,防止key在同一时间失效。

雪崩解决

关于限流操作,可以使用Spring Cloud相关的限流插件,这里我们使用Semaphore信号量模拟下限流操作。

在这里我们限定同时最多可以有5个请求访问,当我们有9个请求进来时,只有5个请求获取到可以访问的令牌,其余的4个请求在外面等待。当前面的访问结束时,会释放令牌,后面的4个请求就会去抢占这些令牌,这样反复执行。

这里我们就起到了限流的操作。

缓存穿透

假设存在一个key永远不会在缓存中存在,当黑客通过这个key去攻击系统,比如每秒发起了7000次攻击,那么无论如何都不会走缓存,攻击请求直接打在了数据库上,数据库肯定扛不住。导致了数据库崩溃,同时,系统也会崩溃。

穿透

我们的解决思路是:查询之前先判断目标数据是否存在,不存在的直接忽略。将流量拦截于缓存和数据库之前。

穿透解决

如上图,增加过滤器,在系统启动之前,我们需要将热点数据统一加载进入缓存中,当对热点数据访问时,会通过过滤器判断一一次,发现请求在缓存中不存在,就直接返回,不会经过数据库。

过滤器我们可以使用布隆过滤器,布隆过滤器的示例代码如下:

布隆过滤器主要就是将key通过hash算法计算出来的值分散到bitmap中,在bitmap中是以0和1存在的。

bitmap图

然而上面的算法存在缺陷:

“布隆过滤器并不能精准过滤。(布隆过滤器判定不存在,100%不存在,判断为存在,则可能不存在的。)理论上Hash计算值是有碰撞的(不同的内容hash计算出同样的值),导致不存在的元素可能 会被判断为存在 ”

当然,布隆过滤器并非需要拦截所有的请求,只需要将缓存击穿控制在一定的量即可。

关于缓存穿透我们还可以采用以下方案:

“缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击。 ”

不过上面的方案有个缺陷:黑客可能同时拿多个不存在的key短时间访问,一样也会访问数据库,所以实际中需要按场景进行优化改造。

缓存雪崩和缓存穿透一般会在高并发形况下遇到,也是互联网大厂高频面试内容,掌握这些知识,相信你又进入了一个新天地。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Lvshen的技术小屋 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缓存雪崩
  • 缓存穿透
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档