【Redis面试准备】

文章详细介绍了Redis在缓存管理中的应用,包括缓存穿透的解决方案(空数据缓存和布隆过滤器)、缓存击穿的处理(互斥锁和逻辑过期)、缓存雪崩的预防措施以及双写一致性的挑战。此外,还讨论了Redis的持久化机制(RDB和AOF)和数据过期策略。文章还提到了Redis在分布式锁实现中的角色,如setnx和redisson,并简要提及了Redis集群的相关概念。

Redis开篇

使用场景:

  • 缓存 穿透、击穿、雪崩;双写一致、持久化;数据过期、淘汰策略

    img

    • 缓存穿透:查询一个不存在的数据,Mysql查询不到数据库也不会直接写入缓存,就会导致每次请求都查询数据库

      1. 解决方案一:缓存空数据,查询返回的数据为空时仍把这个空结果进行缓存

        优点: 简单

        缺点: 消耗内存,可能会发生不一致问题

      2. 解决方案二: 布隆过滤器

        img

        **优点:**内存占用少,没有多余key

        **缺点:**实现复杂,存在误判

      问题1: Redis的使用场景

      • 根据自己简历上的业务进行回答
      • 缓存 穿透、击穿、雪崩、双写一致、持久化、数据过期、淘汰策略
      • 分布式锁 setnx、redisson

      问题二: 什么是缓存穿透,怎么解决

      • 缓存穿透:查询一个不存在的数据,Mysql查询不到数据库也不会直接写入缓存,就会导致每次请求都查数据库
      • 解决方案一:缓存空数据
      • 解决方案二:布隆过滤器
    • 缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key又大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮

      1. 解决方案一: 互斥锁
      2. 解决方案二: 逻辑过期

      img

    • 缓存雪崩:是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。

      img

      1. 给不同的key的TTL添加随机值 (同一时段大量的缓存key同时失效)
      2. 利用Redis集群提高服务的可用性 (Redis服务强宕机) 哨兵模式、集群模式
      3. 给缓存业务添加降级限流策略 ngxin或spring cloud gateway 降级可作为系统的保底策略,适用于穿透、击穿、雪崩
      4. 给业务添加多级缓存 Guava或Caffeine

      缓存三兄弟

      穿透无中生有key,布隆过滤null隔离

      缓存击穿过期key,锁与非期解难题

      雪崩大量过期key,过期时间要随机

      面试必考三兄弟,可用限流来保底

    • 双写一致性: 当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致

      img

      不管是先删除还是先修改数据库,都会有情况导致缓存和数据库中数据不一致的情况

      删除两次缓存是为了降低脏数据的出现

      因为数据库的主从模式的,数据同步从主节点到从节点需要一段时间,所以需要延迟双删

      img

      分布式锁的性能比较低

      读写锁中,共享锁读与读互斥,读写不互斥,排他锁读写互斥。它可以保持数据的强一致性,但是性能以然不高

      以下两种方法都适用于允许延时一致的业务

      异步通知保证数据的最终一致性

      img

      基于Canal的异步通知:

      img

      Canal通知会有短暂延迟

      Redis持久化

      • RDB全称Redis Database Backup file(Redis数据备份文件),也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后,从磁盘读取快照文件,恢复数据。

      img

      • AOF全称为Append Only File(追加文件)。Redis处理的每一个写命令都会记录在AOF文件,可以看作是命令日志文件。

      因为是记录命令,AOF文件会比RDB文件大的多。而且AOF会记录对同一个key的多次写操作,但只有最后一次写操作才有意义。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果

      img

    • 数据过期策略:Redis对数据设置数据的有效时间,数据过期之后,就需要将数据从内存中删掉。可以按照不同的规则进行删除,这种删除规则就被称之为数据的过期策略。 惰性删除,过期删除

      • 惰性删除:设置key过期时间后,我们不去管它,当需要该key时,我们再检查其是否过期,如果过期,我们就删掉它,反之返回该key

        优点: 对CPU友好,只会在使用该key时才会经行过期检查,对于很多用不到的key不用浪费时间进行过期检查

        缺点: 对内存不友好,如果一个key已经过期,但是一直没有使用,那么该key就会一直存在内存中,内存永远不会释放。

      • 定期删除:每隔一段时间,我们就对一些key进行检查,删除里面过期的key(从一定数量的数据库中取出一定数量的随机key进行检查,并删除其中的过期key)。

        定期清理有两种模式:

        • SLOW模式时定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf的hz选项来调整这个次数。
        • FAST模式执行频率不固定,但两次间隔不低于2ms,每次耗时不超过1ms

        优点: 可以通过限制删除操作执行的时长和频率来减少删除操作对CPU的影响。另外定期删除,也能有效释放过期键占用的内存。

        缺点: 难以确定删除操作执行的时长和频率。

        Redis的过期删除策略:惰性删除+定期删除两种策略进行配合使用

    • 数据淘汰策略: 当Redis中的内存不够用时,此时在向Redis中添加新的key,那么Redis就会按照某一种规则将内存中的数据删除掉,这种数据的删除规则被称之为内存的淘汰策略。

    外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhZ1Bvzo-1684599814722)

  • 分布式锁 setnx、redisson

    多用于抢票、秒杀等场景

    • redis分布式锁 Redis实现分布式锁主要利用Redis的setnx命令。setnx是SET if not exists(如果不存在,则写SET)的简写。

      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dTkdpxwJ-1684599814723)

      • redisson实现的分布式锁-执行流程

        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kHZCY5Q0-1684599814725)

        三个关键点:

        1. Watch dog可以给锁续期(默认是每隔10秒续期一次)
        2. 抢不到锁的线程会进行尝试等待
        3. 所有的redis命令是基于lua脚本完成的,保证执行的原子性
      • redisson实现的分布式锁-课重入

        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eVPdrZ90-1684599814726)]

      • redisson实现的分布式锁-主从一致性

        RedLock(红锁): 不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁(n/2 + 1),避免在一个redis实例上加锁。

        外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fbgNAvbJ-1684599814726)]

        redisson提供的红锁可以解决主从一致性,但是性能会大大降低,如果业务中非要保证数据的强一致性,可以采用zookeeper实现的分布式锁。

  • 计数器

  • 保存token 数据类型

  • 消息队列 数据类型

  • 延迟队列 数据类型

其他面试题

  • 集群 主从、哨兵、集群

    • 主从复制: 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。

      • 主从全量同步

      img

      • 主从增量同步

        img

    • 哨兵的作用: Redis提供了哨兵(Sentinel)机制来实现主从集群的自动故障恢复。哨兵的结构和作用如下

      img

      • 服务状态监控

        Sentinel基于心跳机制监测服务状态,每隔1秒向集群的每个实例发送ping命令:

        • 主管下线: 如果某sentinel节点发现某实例未在规定时间响应,则认为该实例主观下线
        • 客观下线: 若超过指定数量(quorum)的sentinel都认为该实例主观下线,则该实例客观下线。quorum值最好超过Sentinel实例数量的一半。

        img

    • redis集群(哨兵模式)脑裂

      img

  • 事务

  • Redis为什么快

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值