Redis面试问题一

锦通  金牌会员 | 2024-7-13 05:41:00 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 980|帖子 980|积分 2940

Redis在面试中有很大的概率会问到,因此我们肯定要学会回答此方面的问题。 Redis主要涉及到使用场景已经一些其他方面的问题。

下面是有可能涉及到的问题。

问题一:你近来的项目中那些场景用到了Redis呢?

必要联合简历项目上的业务进行具体阐明。该问题一是验证你项目场景的真实性,二是作为深入发问的切入点。
如果回答有关缓存的内容,那么接下来有可能就会问你有关缓存三兄弟(穿透、击穿、雪崩)、双写一致、持久化、数据逾期策略、数据镌汰策略方面的问题。
若回答有关分布式锁的内容,那么下面就有可能问你setnx、redisson等。
若回答有关消息队列、延迟队列方面内容,那么接下来就有可能对接纳何种数据范例进行提问。
以是可根据回答内容对有关方面进行强化。
问题二:如果发生了缓存穿透、击穿、雪崩,该怎样解决?

1.缓存穿透

Redis缓存穿透是一个在缓存系统中常见的问题,它指的是当缓存和数据库中都不存在某个查询的数据时,大量的哀求会直接穿透缓存层,直接访问数据库,导致数据库的压力骤增,甚至可能引发系统瓦解或拒绝服务(DoS)攻击。以下是关于Redis缓存穿透的具体分析:

Redis缓存穿透的原因

数据不存在:查询的数据在数据库中本身就不存在,每次查询都会直接访问数据库。
恶意攻击:攻击者故意查询大量不存在的数据,以绕过缓存层,直接对数据库造成压力。
业务逻辑问题:由于代码缺陷或数据非常,导致系统频繁查询不存在的数据。
Redis缓存穿透的解决方案

缓存空对象
原理:当数据库中查询的数据为空时,将空结果也缓存起来,并设置较短的逾期时间。如许,在缓存有用期内,对于相同的查询哀求,可以直接从缓存中返回空结果,避免对数据库的再次查询。
应用场景:适用于查询结果可能为空,且对实时性要求不高的场景。
布隆过滤器(Bloom Filter)
原理:布隆过滤器主要由一个很长的二进制向量(位数组)和一系列随机映射函数(哈希函数)组成。当必要存储一个元素时,该元素通过多个哈希函数盘算出一系列位置,并将这些位置在二进制向量中对应的位设置为1。当必要查询一个元素是否存在于聚会合时,也通过同样的哈希函数盘算出位置,并检查这些位置上的位是否都为1。如果都为1,则认为该元素可能存在于聚会合;如果有任何一个位置上的位不为1,则可以确定该元素肯定不存在于聚会合。在查询缓存之前,使用布隆过滤器过滤掉可能不存在于数据库中的哀求。


缺点
存在误判率:由于哈希函数的碰撞问题,布隆过滤器在判断元素是否存在时存在肯定的误判率。即,有可能将不存在的元素误判为存在。
无法删除元素:布隆过滤器中的元素一旦被添加,其对应的位就会被设置为1,之后无法再将这些位恢复为0,因此布隆过滤器不支持元素的删除操作。
应用场景:适用于查询数据量大,且对误判率有肯定容忍度的场景。
2.缓存击穿

**缓存击穿(Cache Breakdown)给某一个key设置了逾期时间,当key逾期的时候,恰好这时间点对这个key有大量的并发哀求过来,这些并发的哀求可能会刹时把DB压垮

解决方案:

互斥锁(Mutex Lock):在缓存失效后,第一个哀求线程去查询数据库并重新构建缓存,其他线程则等候构建完成,然后直接从缓存中读取数据。这种方式可以镌汰对数据库的访问次数,但会增长线程等候时间。强一致性,但性能差

逻辑逾期:逻辑逾期是一种处理缓存数据失效时间的策略,与物理逾期(即直接设置缓存项的逾期时间)不同。在逻辑逾期的方式中,缓存数据并不会在逾期时被直接删除,而是会在缓存中保留该数据,但标记其为“逾期”,表示该数据已经不再是最新的,大概已经不可用。高可用性,性能优,但不能包管数据绝对一致

3.缓存雪崩

缓存雪崩是指在缓存系统中,大量缓存key在同一时间失效Redis服务宕机,导致大量哀求直接到达数据库,造成后端系统的压力骤增,甚至引起系统瓦解的征象。
解决方案

1.给不同key的TTL添加随机值,设置随机的失效时间:为缓存对象设置稍微有差别的随机失效时间,避免大量缓存对象在同一时间失效。
2.利用Redis集群进步服务的可用性:如Redis哨兵模式或Redis集群部署方式,确保个别Redis节点下线时,整个缓存层依然可用。
哨兵模式实现原理
监控:哨兵节点定期向所有主节点和从节点发送PING下令,以检查它们的运行状态。
主观下线:如果哨兵节点在给定的时间内(通过sentinel down-after-milliseconds配置)未收到某个节点的有用响应,则将该节点标记为主观下线。
客观下线:当多个哨兵节点(到达配置的quorum值)都将某个主节点标记为主观下线时,该主节点被标记为客观下线。
故障转移:在主节点被标记为客观下线后,哨兵节点会进行故障转移操作,包括从所有康健的从节点中推选一个新的主节点,并将所有从节点切换到新的主节点上。
集群模式实现原理
数据分片:Redis Cluster将数据分为16384个槽(slot),每个节点可以处理0个或多个槽。
节点通信:节点之间通过Gossip协议进行通信,交换彼此的状态信息和槽的分配环境。
故障检测:节点之间会定期发送PING消息来检测对方是否在线。如果某个节点在一段时间内未收到其他节点的响应,则将该节点标记为疑似下线。当足够多的节点都认为某个节点已下线时,该节点被正式标记为已下线。
故障转移:当主节点下线时,集群中的从节点会进行推选,推选出一个新的主节点来接受原来的槽和数据。
3.给缓存业务添加降级限流策略
降级可作为系统的保底策略,适用于穿透、击穿、雪崩
自动降级:系统可以根据一些关键数据进行自动降级,如CPU使用率、内存占用率、响应时间等。当这些指标超过预设的阈值时,系统可以自动关闭一些非焦点服务或功能,以开释资源,保护焦点服务。
人工降级:在某些环境下,如系统升级、维护或遇到严肃错误时,管理员可以手动触发降级操作,以镌汰对系统的影响。
流量控制:通过设置系统的最大并发数,当哀求超过这个数值时,系统可以拒绝新的哀求或将其放入队列等候处理。通过限制单位时间内的哀求数量,如每秒哀求数(QPS),来防止系统被过量的哀求压垮。
流量整形:通过平滑突发哀求,将哀求流量整形为稳固的流量,以避免系统资源的突然颠簸。
排队与哀求:当哀求超过系统处理本事时,可以将哀求放入队列中等候处理。同时,可以设置公道的等候时间和超时时间,以避免用户长时间等候或系统资源被无效占用。
4.给业务添加多级缓存:固然这会增长Redis的存储空间需求,但可以避免大量缓存同时失效的问题。
助记

《缓存三兄弟》
穿透无中生有key,布隆过滤null隔离。
缓存击穿逾期key,锁与非期解难题。
雪崩大量逾期key,逾期时间要随机。
面试必考三兄弟,可用限流来保底。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

锦通

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表