2026/4/6 6:23:09
网站建设
项目流程
企业的网站设计能否以为导向,便宜的国外云服务器,网站建设要会哪些方面,苏州网站排名优化系统缓存穿透、缓存击穿、缓存雪崩是经典的老八股文啦#xff0c;之前去面试一个银行#xff0c;就被问到啦#xff0c;本文跟大家聊聊怎么回答哈~~1.缓存穿透问题先来看一个常见的缓存使用方式#xff1a;读请求来了#xff0c;先查下缓存#xff0c;缓存有值命中#xff0…缓存穿透、缓存击穿、缓存雪崩是经典的老八股文啦之前去面试一个银行就被问到啦本文跟大家聊聊怎么回答哈~~1.缓存穿透问题先来看一个常见的缓存使用方式读请求来了先查下缓存缓存有值命中就直接返回缓存没命中就去查数据库然后把数据库的值更新到缓存再返回。1.1 什么是缓存穿透问题缓存穿透指查询一个一定不存在的数据由于缓存是不命中时需要从数据库查询查不到数据则不写入缓存这将导致这个不存在的数据每次请求都要到数据库去查询进而给数据库带来压力。通俗点说读请求访问时缓存和数据库都没有某个值这样就会导致每次对这个值的查询请求都会穿透到数据库这就是缓存穿透。1.2 缓存穿透产生原因缓存穿透一般都是这几种情况产生的业务逻辑设计不合理:比如大多数用户都没开守护但是你的每个请求都去查询缓存查询某个userid有没有开守护~黑客非法请求攻击比如黑客故意捏造大量非法请求以读取不存在的业务数据。数据生命周期管理问题某些数据被删除后缓存没有及时更新导致后续查询穿透。如何避免缓存穿透呢 一般有三种方法。用户请求进行有效性检查它的核心思想是对请求参数进行合法性校验提前过滤掉明显无效的请求。主要包括数据格式校验、数据范围校验、权限校验等等缓存空值如果查询数据库为空我们可以给缓存设置个空值或者一个特殊标记的默认值设置一个较短的过期时间避免频繁访问数据库。业务上比较常用简单有效使用布隆过滤器快速判断数据是否存在。即一个查询请求过来时先通过布隆过滤器判断值是否存在存在才继续往下查。如果不存在就不访问数据库啦~~布隆过滤器原理它由初始值为0的位图数组和N个哈希函数组成。一个对一个key进行N个hash算法获取N个值在比特数组中将这N个值散列后设定为1然后查的时候如果特定的这几个位置都为1那么布隆过滤器判断该key存在否则不存在。2.缓存雪崩问题缓存雪崩在某个时间点大量缓存数据同时过期 导致大量请求直接访问数据库引起数据库压力过大甚至down机。2.1 缓存雪崩常见原因缓存设置了集中的过期时间大量缓存数据设置了相同或者相似的过期时间导致它们在同一时间段内集体过期。缓存预热不充分系统启动时缓存数据加载不充分导致大量请求直接访问数据库。缓存服务器宕机redis集群中多个节点同时宕机导致大量缓存数据不可用常见一些经典场景促销活动结束大量商品缓存同时失效、或者定时任务触发比如凌晨批量更新缓存固定过期时间触发雪崩2.2 如何解决缓存雪崩的问题通过分散过期时间是解决缓存雪崩最简单有效的解决方案~~可通过均匀设置过期时间解决即让过期时间相对离散一点。如采用一个较大固定值一个较小的随机值1小时0到100秒酱紫。Redis 故障宕机也可能引起缓存雪奔。这就需要构造Redis高可用集群啦。比如redis主从、哨兵模式、集群模式Redis cluster。当然还有最后的防线就是限流和降级~~3. 缓存击穿问题缓存击穿是指某个热点数据在缓存中过期的同时大量并发请求访问该数据导致这些请求直接访问数据库造成数据库压力骤增。缓存击穿看着跟缓存雪崩有点像其实它两区别是缓存击穿针对单个热点 Key缓存雪崩针对大量Key或整个缓存服务影响结果不一样缓存击穿导致数据库短期压力剧增缓存雪崩则可能导致数据库被压垮3.1 缓存击穿常见原因高并发场景比如秒杀活动呀热点新闻等管理员手动误清除运维人员误删或主动清理某个热点Key如商品价格调整删除后突发流量访问。3.2 缓存击穿的解决方案常见的解决方案使用互斥锁方案。缓存失效时不是立即去加载db数据而是先使用某些带成功返回的原子操作命令如(Redis的setnx去操作成功的时候再去加载db数据库数据和设置缓存。否则就去重试获取缓存。“永不过期”是指没有设置过期时间但是热点数据快要过期时异步线程去更新和设置过期时间。随机过期时间通过为热点数据设置略有差异的过期时间避免大量热点数据同时失效~~