跳到主要内容

Redis面试题

Redis基础知识

概述与特性

  1. 什么是Redis?主要用来做什么?
  2. Redis为什么这么快?(单线程、内存存储、多路复用、高效数据结构)
  3. Redis是单线程还是多线程?为什么?
  4. Redis 6.0的多线程是怎么回事?
  5. Redis和Memcached的区别?
  6. 你们Redis什么版本?为什么使用这个版本?
  7. 你们哪些地方使用了Redis?(缓存、session、分布式锁、消息队列等)

数据类型

  1. Redis有哪些数据类型?各自的使用场景?
  2. String类型的应用场景?(计数器、分布式锁、session)
  3. Hash类型的应用场景?(存储对象)
  4. List类型的应用场景?(消息队列、时间轴)
  5. Set类型的应用场景?(去重、共同好友)
  6. ZSet类型的应用场景?(排行榜、延时队列)
  7. Redis 5.0新增了哪些数据类型?(Stream)
  8. HyperLogLog是什么?使用场景?
  9. Bitmap是什么?使用场景?
  10. GEO是什么?使用场景?

常用命令

  1. 如何设置key的过期时间?expire和expireat的区别?
  2. 如何查看key的剩余过期时间?
  3. 如何批量删除key?(scan + delete)
  4. keys和scan命令的区别?为什么不建议使用keys?
  5. 如何查看Redis内存使用情况?
  6. 如何查看Redis的配置?如何动态修改配置?

持久化机制

RDB持久化

  1. 什么是RDB?工作原理?
  2. RDB的优缺点是什么?
  3. 如何触发RDB持久化?(save、bgsave、自动触发)
  4. save和bgsave的区别?
  5. RDB文件损坏如何处理?

AOF持久化

  1. 什么是AOF?工作原理?
  2. AOF的优缺点是什么?
  3. AOF重写是什么?如何触发?
  4. AOF的三种同步策略?(always、everysec、no)
  5. AOF文件损坏如何修复?

持久化选择

  1. Redis的持久化有几种?区别是什么?
  2. RDB和AOF如何选择?你们用哪一种?
  3. Redis 4.0的混合持久化是什么?
  4. 如何在不停机的情况下从RDB切换到AOF?
  5. 持久化对性能的影响?如何优化?

内存管理

内存淘汰策略

  1. Redis的内存淘汰策略有哪些?
  2. LRU和LFU的区别?
  3. volatile和allkeys的区别?
  4. 如何设置最大内存?达到上限会怎样?
  5. 如何查看内存使用详情?(info memory)

内存优化

  1. Redis内存占用过高如何排查?
  2. 如何优化Redis内存使用?
  3. 什么是内存碎片?如何处理?
  4. Redis的内存回收机制?
  5. 你们Redis数据量有多大?如何控制内存增长?

高可用架构

主从复制

  1. Redis主从复制的原理是什么?
  2. 全量复制和增量复制的区别?
  3. 主从复制的配置步骤?
  4. 如何查看主从复制状态?
  5. 主从复制延迟如何监控和优化?
  6. 主从复制中断如何处理?

哨兵模式

  1. 什么是Redis Sentinel?作用是什么?
  2. 哨兵模式的工作原理?
  3. 哨兵如何判断主节点故障?(主观下线、客观下线)
  4. 哨兵如何选举新的主节点?
  5. 哨兵最少需要几个?为什么?
  6. Redis主从升级为哨兵后代码如何连接?

集群模式

  1. Redis Cluster的原理是什么?
  2. Redis集群和哨兵的区别是什么?
  3. 什么是槽(slot)?有多少个槽?
  4. Redis集群的数据如何分配到各个槽?(CRC16算法)
  5. 如何查找一个key在哪个节点?(cluster keyslot)
  6. 什么是重定向?MOVED和ASK的区别?
  7. 集群如何扩容和缩容?
  8. Redis主从升级为集群后代码如何连接?

架构选择

  1. 你们Redis使用的什么架构?为什么选择这种架构?
  2. 主从、哨兵、集群如何选择?
  3. Redis集群的限制有哪些?(不支持多数据库、事务限制等)

缓存问题

缓存穿透

  1. 什么是缓存穿透?如何解决?
  2. 布隆过滤器是什么?如何使用?
  3. 缓存空值的利弊?

缓存击穿

  1. 什么是缓存击穿?如何解决?
  2. 如何使用互斥锁防止缓存击穿?
  3. 如何实现热点数据永不过期?

缓存雪崩

  1. 什么是缓存雪崩?如何解决?
  2. 如何设置随机过期时间?
  3. 如何做缓存预热?

缓存一致性

  1. 如何保证缓存和数据库的一致性?
  2. 先更新数据库还是先更新缓存?
  3. 延时双删策略是什么?
  4. 如何处理缓存更新失败?

应用实践

分布式锁

  1. 如何使用Redis实现分布式锁?
  2. SETNX和SET的区别?
  3. 分布式锁需要注意哪些问题?(原子性、超时、误删)
  4. Redlock算法了解吗?
  5. Redis分布式锁和Zookeeper分布式锁的区别?

消息队列

  1. 如何使用Redis实现消息队列?
  2. List实现消息队列的优缺点?
  3. Pub/Sub的优缺点?会丢消息吗?
  4. Redis Stream了解吗?和Kafka的区别?

其他应用

  1. 如何使用Redis实现排行榜?
  2. 如何使用Redis实现计数器?
  3. 如何使用Redis实现限流?
  4. 如何使用Redis实现延时队列?
  5. 如何使用Redis存储Session?

性能优化

慢查询

  1. Redis的慢日志如何开启?
  2. 慢查询的阈值如何设置?
  3. 如何查看慢查询日志?
  4. 常见的慢查询原因?

性能监控

  1. 你们Redis都监控了哪些指标?
  2. 如何监控Redis的QPS?
  3. 如何监控命令执行时间?
  4. 如何监控内存使用?
  5. 如何监控网络流量?

优化建议

  1. Redis性能优化的思路?
  2. 如何优化大key问题?
  3. 如何优化热key问题?
  4. Pipeline有什么作用?
  5. 如何减少网络开销?

运维管理

数据迁移

  1. Redis数据迁移做过吗?如何实现?
  2. 如何从一个Redis集群迁移到另一个集群?
  3. 在线迁移如何保证数据一致性?
  4. 使用过哪些迁移工具?(redis-migrate-tool、redis-shake)

备份恢复

  1. Redis如何备份数据?
  2. 如何恢复Redis数据?
  3. 如何定时备份?
  4. 备份文件如何管理?

故障处理

  1. Redis服务启动失败如何排查?
  2. Redis连接不上如何排查?
  3. Redis内存溢出如何处理?
  4. Redis主从同步异常如何处理?
  5. 如何处理Redis的阻塞问题?

安全加固

  1. Redis安全需要注意哪些方面?
  2. 如何设置Redis密码?
  3. 如何限制Redis的访问IP?
  4. 如何禁用危险命令?(FLUSHDB、KEYS等)
  5. Redis未授权访问漏洞如何防范?

高级特性

事务

  1. Redis支持事务吗?和MySQL事务的区别?
  2. MULTI、EXEC、DISCARD命令的作用?
  3. Redis事务的ACID特性?
  4. WATCH命令的作用?(乐观锁)
  5. Redis事务的限制?

Lua脚本

  1. 为什么要在Redis中使用Lua脚本?
  2. 如何执行Lua脚本?(EVAL、EVALSHA)
  3. Lua脚本的原子性如何保证?
  4. Lua脚本的限制和注意事项?

其他特性

  1. Redis的发布订阅如何使用?
  2. Redis Module了解吗?
  3. Redis 6.0的ACL是什么?
  4. Redis的客户端缓存是什么?

实战问题

流量分析

  1. 如何找出Redis高流量的来源?
  2. 如何分析Redis的热key?
  3. 如何处理Redis的大key?
  4. 如何优化Redis的网络流量?

常见问题

  1. Redis和数据库双写一致性问题?
  2. Redis集群批量操作的限制?
  3. Redis的Big Key如何优化?
  4. Redis连接池如何配置?
  5. 生产环境Redis的最佳实践?

更新时间:2025-01-30