1. Redis 基础篇(必懂核心)

  1. Redis 是什么?它和 Memcached 有什么核心区别?

    • 解析:Redis 是开源的内存数据库(支持持久化),支持多种数据结构;Memcached 是纯内存缓存,仅支持字符串。核心区别:
      维度RedisMemcached
      数据结构 字符串、哈希、列表等 仅字符串
      持久化 支持 RDB/AOF 不支持(重启丢失)
      并发性能 单线程(避免线程切换) 多线程
      分布式 原生支持集群 需依赖客户端分片
  2. Redis 支持哪些数据结构?各自的典型使用场景是什么?

    • 解析:核心 6 种数据结构及场景:
      • 字符串(String):缓存用户信息、计数器(如文章阅读量);
      • 哈希(Hash):缓存对象(如用户资料,field 存属性、value 存值);
      • 列表(List):消息队列(如秒杀排队)、最新消息排行;
      • 集合(Set):去重(如用户标签去重)、交集 / 并集(如共同好友);
      • 有序集合(ZSet):排行榜(如积分排名,score 存分数、value 存用户 ID);
      • 位图(Bitmap):海量数据布尔判断(如签到记录,1 位存 1 天状态)。
  3. Redis 的单线程模型是什么?为什么单线程还能支撑高并发?

    • 解析:Redis 基于 “IO 多路复用模型” 实现单线程(指处理命令的核心线程是单线程,持久化等用多线程)。高并发原因:
      1. 内存操作:数据存内存,读写速度远快于磁盘;
      2. 避免线程开销:单线程无需线程切换、锁竞争;
      3. IO 多路复用:通过 select/poll/epoll 监听多个 IO 事件,高效处理并发连接。
  4. Redis 的默认端口是多少?如何设置密码?如何验证密码?

    • 解析:默认端口 6379;设置密码:config set requirepass 密码(临时生效,永久需改配置文件requirepass字段);验证密码:auth 密码(每次连接或重启后需验证)。
  5. Redis 的 key 有什么命名规范?如何查看所有 key?如何删除指定 key?

    • 解析:命名规范:用 “:”分隔层级(如user:100:info),简洁且语义清晰;查看key:keys 模式(如keys user:*,生产环境慎用,会阻塞线程)、scan(迭代查询,非阻塞);删除key:del key1 key2(删除指定key)、flushdb(删除当前库所有key)、flushall`(删除所有库 key)。

2. Redis 持久化篇(数据不丢的关键)

  1. Redis 有哪两种持久化机制?各自的原理是什么?

    • 解析:两种机制核心是将内存数据落盘,避免重启丢失:
      • RDB(Redis Database):定时快照,在指定时间间隔内,将内存中所有数据生成快照存到磁盘(.rdb 文件);触发方式:手动(save阻塞、bgsave非阻塞)、配置自动触发(如save 60 1000:60 秒内 1000 次写操作触发)。
      • AOF(Append Only File):日志追加,将所有写命令(如 set、hset)以文本形式追加到.aof 文件,重启时重新执行命令恢复数据。
  2. RDB 和 AOF 各有什么优缺点?生产环境如何选择?

    • 解析:
      特性RDBAOF
      优点 文件小、恢复速度快 数据更安全(可配置刷盘策略)
      缺点 数据一致性低(快照间隔内丢失) 文件大、恢复速度慢
      生产选择 适合数据备份(如每日备份) 适合核心业务(需高一致性)

      • 进阶:生产环境常开启 “RDB+AOF 混合模式”(Redis 4.0 + 支持):用 AOF 保证数据不丢,用 RDB 加速恢复。
  3. AOF 的刷盘策略有哪几种?默认是哪种?

    • 解析:刷盘策略由appendfsync配置控制,决定 “命令写入 AOF 缓冲区后,何时刷到磁盘”:
      • always:每次写命令都刷盘(最安全,性能最差);
      • everysec:每秒刷盘 1 次(平衡安全与性能,默认值);
      • no:由操作系统决定刷盘时机(性能最好,最不安全)。
  4. Redis 重启时,如何选择加载 RDB 还是 AOF 文件?

    • 解析:优先级:AOF > RDB。若 AOF 开启且文件存在,优先加载 AOF;若 AOF 未开启或文件损坏,再加载 RDB;若两者都不存在,启动后为空白数据库。

3. Redis 高可用篇(集群与故障转移)

  1. Redis 主从复制的原理是什么?有什么作用?

    • 解析:主从复制是 “1 主多从” 架构,主库(master)写入数据,从库(slave)同步主库数据并提供读服务。
    • 原理:
      1. 从库连接主库,发送SYNC命令;
      2. 主库执行bgsave生成 RDB,发送给从库,从库加载 RDB 初始化数据;
      3. 主库将后续写命令实时同步给从库,从库执行命令保持数据一致。
    • 作用:读写分离(主写从读,减轻主库压力)、数据备份(从库可作为备份节点)。
  2. Redis 哨兵(Sentinel)的作用是什么?它如何实现故障转移?

    • 解析:哨兵是 Redis 的 “高可用监控组件”,解决主从架构中 “主库故障后手动切换” 的问题。
    • 核心作用:监控主从节点、自动故障转移、通知客户端新主库地址。
    • 故障转移流程:
      1. 哨兵集群检测到主库下线(主观下线 + 客观下线:多个哨兵确认主库不可达);
      2. 哨兵集群投票选举一个从库升级为新主库;
      3. 其他从库切换到新主库,执行主从复制;
      4. 原主库恢复后,作为从库连接新主库。
  3. Redis Cluster(集群)的核心作用是什么?它如何实现数据分片?

    • 解析:Redis Cluster 是 Redis 官方分布式解决方案,解决 “单节点内存上限” 和 “高并发扩容” 问题,支持多主多从(默认 3 主 3 从)。
    • 数据分片原理:采用 “哈希槽(Hash Slot) ” 机制,共 16384 个槽;
      1. 每个主库负责一部分槽(如主库 1 负责 0-5460,主库 2 负责 5461-10922);
      2. 存储 key 时,计算CRC16(key) % 16384得到槽位,将 key 分配到对应主库;
      3. 从库复制主库的槽数据,主库故障时从库升级为主库。
  4. Redis Cluster 中,如何处理 “槽位迁移”?(比如新增主库时)

    • 解析:槽位迁移是将已有主库的部分槽转移到新主库,实现负载均衡。流程:
      1. 客户端执行cluster addslots为新主库分配待迁移槽;
      2. 原主库将槽内数据迁移到新主库(通过migrate命令);
      3. 迁移完成后,更新集群槽位映射表,客户端后续访问该槽会路由到新主库。

4. Redis 缓存问题篇(生产避坑重点)

  1. 什么是缓存穿透?如何解决?

    • 解析:缓存穿透是 “请求查询不存在的数据”,导致请求直接穿透缓存打到数据库(如查询用户 ID=-1,缓存和 DB 都没有),高并发下会压垮 DB。
    • 解决方案:
      1. 空值缓存:查询 DB 无结果时,缓存空值(如set user:-1 null EX 300,设置短期过期);
      2. 布隆过滤器:在缓存前加布隆过滤器,提前过滤不存在的 key(布隆过滤器判断 “不存在” 则一定不存在,直接返回)。
  2. 什么是缓存击穿?如何解决?

    • 解析:缓存击穿是 “某个热点 key 过期瞬间,大量请求同时访问该 key”,穿透缓存打到 DB(如秒杀商品的库存 key 过期)。
    • 解决方案:
      1. 互斥锁:多个请求同时查询时,只有一个请求能获取锁去查 DB,其他请求等待重试(如用 Redis 的setnx实现锁);
      2. 热点 key 永不过期:核心热点 key 不设置过期时间,通过后台线程定期更新(避免过期瞬间的并发问题)。
  3. 什么是缓存雪崩?如何解决?

    • 解析:缓存雪崩是 “大量缓存 key 在同一时间过期”,或 “缓存集群宕机”,导致所有请求瞬间打到 DB,DB 直接崩溃。
    • 解决方案:
      1. 过期时间随机化:给 key 设置过期时间时加随机值(如EX 3600 + rand(0, 600)),避免同时过期;
      2. 缓存集群高可用:部署 Redis Cluster 或哨兵,避免单集群宕机;
      3. 降级熔断:DB 压力过大时,通过降级策略返回默认值(如 “服务繁忙,请稍后重试”),保护 DB。
  4. Redis 的缓存和数据库数据不一致怎么解决?

    • 解析:不一致原因通常是 “写操作顺序不当”(如先更缓存还是先更 DB),常见解决方案:
      1. 写操作顺序:先更 DB,再删缓存(而非 “先更缓存”,避免 DB 更新失败导致缓存脏数据);
      2. 延迟双删:先删缓存,再更 DB,隔 100ms 再删一次缓存(解决 “DB 更新后,缓存未删完” 的并发问题);
      3. 最终一致性:若业务允许短期不一致,可通过定时任务(如每 5 分钟)对比缓存和 DB 数据,修复不一致。

5. Redis 进阶篇(深入原理与实战)

  1. Redis 的过期键删除策略是什么?为什么不用 “实时删除” 或 “定时删除”?

    • 解析:Redis 采用 “惰性删除 + 定期删除” 结合的策略:
      • 惰性删除:访问 key 时才判断是否过期,过期则删除(优点:不浪费 CPU;缺点:过期 key 占内存);
      • 定期删除:每隔一段时间(如 100ms),随机扫描部分过期 key 并删除(平衡 CPU 和内存)。
    • 不选实时删除:每次写操作都判断过期,CPU 开销过大;不选定时代理:全量扫描所有 key,CPU 和时间开销大。
  2. Redis 如何实现分布式锁?有什么注意事项?

    • 解析:基于 Redis 实现分布式锁的核心是 “原子性操作”,常用方案:
      • 加锁:set lock:key 随机值 EX 30 NX(NX:仅当 key 不存在时设置,保证互斥;EX:设置过期时间,避免死锁);
      • 解锁:通过 Lua 脚本原子执行 “判断随机值 + 删除 key”(避免误删其他线程的锁),脚本:
         
        if redis.call('get', KEYS[1]) == ARGV[1] then
            return redis.call('del', KEYS[1])
        else
            return 0
        end
        
         
    • 注意事项:设置合理过期时间(避免锁提前过期,可配合 “锁续约” 机制)、保证解锁的原子性(必须用 Lua 脚本)、避免单点故障(用 Redis Cluster)。
  3. Redis 的内存淘汰策略有哪些?生产环境如何选择?

    • 解析:当 Redis 内存达到maxmemory限制时,触发内存淘汰策略,删除部分 key 释放内存。核心策略(Redis 4.0+):
      策略类型具体策略(配置值)适用场景
      淘汰过期 key volatile-lru(最近最少使用) 有过期时间的 key 占多数
        volatile-ttl(剩余时间最短) 优先删除快过期的 key
      淘汰所有 key allkeys-lru(最近最少使用) 无过期时间的 key 占多数
        allkeys-random(随机删除) 所有 key 访问概率均匀
      不淘汰(报错) noeviction(默认) 不允许删除 key,写操作报错
    • 生产选择:若缓存以 “热点数据” 为主,选volatile-lruallkeys-lru(优先保留常用数据);若对数据删除无偏好,选random(性能略高)。

通过以上 20 个问题,可快速覆盖 Redis 的核心知识点,结合 “问题 + 解析 + 场景” 的形式,能高效理解并记忆关键内容,达到 “短时间掌握核心” 的目标。若需原视频的具体讲解,可尝试完成百度好看视频的安全验证(如滑块转正、扫码验证),或检查网络后刷新页面获取视频内容。
 posted on 2025-09-06 16:11  xibuhaohao  阅读(5)  评论(0)    收藏  举报