阿清今天的内容很轻松,近来收集了一下Redis在面试中常考的问题。
阿清在这里为大家总结一下答案,大家就当个咖啡伴侣读一读吧~
今天要和大家聊4个问题的解决方案,分别是:
缓存可见一致性、缓存击穿、缓存穿透、缓存雪崩。
01
—
缓存一致性
什么是缓存一致性问题?
如A、B两个事务同时对一个数据进行修改。A要将age改为18,B要将age改为20。
A先修改完数据库–>B修改数据–>B修改缓存–>A修改缓存,从下图我们也可以看见这种情况会造成数据库和缓存数据的不一致问题。
走完上述流程后,数据库中age 为20, redis中数据为18。
解决办法:
1、先删除缓存,再修改数据库
2、更新缓存时加锁
3、设置较短的过期时间 (没有直接接解决缓存一致性问题,可以控制数据不一致的时长。)
02
—
缓存击穿
缓存击穿出现在数据过期的场景里。在同一个时间里,大量的热点数据同时失效,这时,前端的高并发的请求直接打在了数据库上,造成了数据库的崩溃。
解决办法:
1、热点数据设置不同的过期时间,避免大量的热点数据同时过期,导致大量并发请求同时进入数据库。
2、把过期时间控制在系统低流量的时间段,比如凌晨三四点。
3、不设置过期时间,这种可以避免热点数据失效的问题,但通常不建议。
03
—
缓存穿透
缓存穿透通常是说,请求的数据在缓存里面不存在,同时在数据库也不存在。因为系统里面根本不存在该数据,所以请求总是无法命中缓存,每次都会进入数据库,从而会导致数据库承受不来大量的请求导致崩溃的风险。通常有恶意的攻击导致。
解决办法:
1、缓存null值
这种情况下的解决方案是如果数据不存在的情况下,缓存一个对应key的null值,当请求下次进来的时候发现缓存对应的null就直接返回结果,不再穿透到数据库查询,不过这种方案只能应对一下可预知的一定范围的请求,如果是有意为之的恶意攻击,那么通常都是随机一些参数进行请求的,如果缓存null来应对,那么这样就会造成缓存大量null数据,那么也会导致缓存的风险。
2、布隆过滤器
布隆过滤器的核心思想就是不保存实际数据,而是在内存中创建一个一定长度的位图来用0和1来标记对应的数据是否存在系统。
-
首先根据多个哈希函数计算出不同的哈希值。 -
然后用哈希值对位图的长度进行取模,最后得到位图的下标位。 -
然后在对应的下标位上进行标记。
然后在验证数据是否存在系统的时候也是一样,先通过多个哈希函数得到多个哈希值,然后哈希值与位图的长度进行取模得到多个下标。如果多个下标都被标记成1了,那么说明数据存在于系统,不过只要有一个下标为0那么就说明该数据肯定不存在于系统中。
04
—
缓存雪崩
缓存的确提升了系统的性能,但是使用缓存也会伴随着风险,当我们系统的大量数据都保存在缓存中,大部分请求都已经是走缓存了,那么此时缓存自身的可用性就显得尤为重要了,如果缓存出现了问题这时候大量请求都穿透到数据库,导致数据库也崩溃,从而造成整个系统不可用,这个就是缓存雪崩。
解决办法:
1、缓存本身的可用性保障
-
集群部署多个节点,来缓解某一个节点的压力,另外通过做冗余备份,保证一个节点挂掉之后,另一个节点能补上。
-
缓存分片:
缓存分片主要目的是分流,把缓存的数据拆分到多个节点分别存储,每个节点会存储一部分的缓存数据,通过某种算法把请求分发到对应的节点,减轻了单个缓存节点的访问压力达到分流效果,通过分片既能减轻节点的请求压力也避免了整个缓存不可用的风险。
缓存分片的算法通常会在哈希算法、一致性哈希哈希算法中选择。
(1)哈希算法:
将key的hashCode 对节点数量进行一次取余操作。(适合节点数量固定的情况)
(2)一致性哈希算法:
一致性哈希算法优势在于可以动态的扩容缩容,缓存数据可能会保存的不均匀,(适合未来节点数量不确定的情况)
-
缓存热备选主
这种方式是通过冗余多个备用节点,当主节点发生故障时,通过一种算法从备用节点中重新选举出一个主节点来对外提供服务,
拿redis来说就是通过sentinel来监控每个redis节点的状态,定时发送心跳机制,当一定时间没有收到主节点的响应心跳时,就认为主节点已经挂了,然后从备选节点里面选举出一个新的主节点来对外提供服务。
2、系统保护机制(限流、熔断、降级)
限流
限流是通过事先预防的机制来保护系统,我们通过事先对系统可承受的流量进行估算,从而设定一个阈值,超过这个阈值后的请求 不再向下层发送,而是直接拒绝超过阈值的请求。
熔断
限流是事先预防,而熔断更多的是事后保护机制,当某些功能出现延时或者故障后,系统会触发熔断机制,直接拒绝处理请求,从而防止故障进一步的扩散,引发雪崩效应。
降级
当系统流量太大,超出系统负荷时,避免大负荷量拖垮我们整个系统,这个时候我们就有必要对业务的功能进行取舍了,为了保证核心业务能正常运转,从而暂时关闭一些非核心的业务,根据我们的系统业务等级划分来保护关键业务的正常运行。
05
—
总结
今天的内容很简单直接,希望大家在后面的面试中被问到这些问题后,能够对答如流~
06
—
参考文献
-
https://zhuanlan.zhihu.com/p/350101013
关注六只栗子,面试不迷路~
作者 阿清
编辑 一口栗子
原文始发于微信公众号(六只栗子):Redis的快问小抄
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/88355.html