Redis面试题
Redis基础知识
概述与特性
- 什么是Redis?主要用来做什么?
- Redis为什么这么快?(单线程、内存存储、多路复用、高效数据结构)
- Redis是单线程还是多线程?为什么?
- Redis 6.0的多线程是怎么回事?
- Redis和Memcached的区别?
- 你们Redis什么版本?为什么使用这个版本?
- 你们哪些地方使用了Redis?(缓存、session、分布式锁、消息队列等)
数据类型
- Redis有哪些数据类型?各自的使用场景?
- String类型的应用场景?(计数器、分布式锁、session)
- Hash类型的应用场景?(存储对象)
- List类型的应用场景?(消息队列、时间轴)
- Set类型的应用场景?(去重、共同好友)
- ZSet类型的应用场景?(排行榜、延时队列)
- Redis 5.0新增了哪些数据类型?(Stream)
- HyperLogLog是什么?使用场景?
- Bitmap是什么?使用场景?
- GEO是什么?使用场景?
常用命令
- 如何设置key的过期时间?expire和expireat的区别?
- 如何查看key的剩余过期时间?
- 如何批量删除key?(scan + delete)
- keys和scan命令的区别?为什么不建议使用keys?
- 如何查看Redis内存使用情况?
- 如何查看Redis的配置?如何动态修改配置?
持久化机制
RDB持久化
- 什么是RDB?工作原理?
- RDB的优缺点是什么?
- 如何触发RDB持久化?(save、bgsave、自动触发)
- save和bgsave的区别?
- RDB文件损坏如何处理?
AOF持久化
- 什么是AOF?工作原理?
- AOF的优缺点是什么?
- AOF重写是什么?如何触发?
- AOF的三种同步策略?(always、everysec、no)
- AOF文件损坏如何修复?
持久化选择
- Redis的持久化有几种?区别是什么?
- RDB和AOF如何选择?你们用哪一种?
- Redis 4.0的混合持久化是什么?
- 如何在不停机的情况下从RDB切换到AOF?
- 持久化对性能的影响?如何优化?
内存管理
内存淘汰策略
- Redis的内存淘汰策略有哪些?
- LRU和LFU的区别?
- volatile和allkeys的区别?
- 如何设置最大内存?达到上限会怎样?
- 如何查看内存使用详情?(info memory)
内存优化
- Redis内存占用过高如何排查?
- 如何优化Redis内存使用?
- 什么是内存碎片?如何处理?
- Redis的内存回收机制?
- 你们Redis数据量有多大?如何控制内存增长?
高可用架构
主从复制
- Redis主从复制的原理是什么?
- 全量复制和增量复制的区别?
- 主从复制的配置步骤?
- 如何查看主从复制状态?
- 主从复制延迟如何监控和优化?
- 主从复制中断如何处理?
哨兵模式
- 什么是Redis Sentinel?作用是什么?
- 哨兵模式的工作原理?
- 哨兵如何判断主节点故障?(主观下线、客观下线)
- 哨兵如何选举新的主节点?
- 哨兵最少需要几个?为什么?
- Redis主从升级为哨兵后代码如何连接?
集群模式
- Redis Cluster的原理是什么?
- Redis集群和哨兵的区别是什么?
- 什么是槽(slot)?有多少个槽?
- Redis集群的数据如何分配到各个槽?(CRC16算法)
- 如何查找一个key在哪个节点?(cluster keyslot)
- 什么是重定向?MOVED和ASK的区别?
- 集群如何扩容和缩容?
- Redis主从升级为集群后代码如何连接?
架构选择
- 你们Redis使用的什么架构?为什么选择这种架构?
- 主从、哨兵、集群如何选择?
- Redis集群的限制有哪些?(不支持多数据库、事务限制等)
缓存问题
缓存穿透
- 什么是缓存穿透?如何解决?
- 布隆过滤器是什么?如何使用?
- 缓存空值的利弊?
缓存击穿
- 什么是缓存击穿?如何解决?
- 如何使用互斥锁防止缓存击穿?
- 如何实现热点数据永不过期?
缓存雪崩
- 什么是缓存雪崩?如何解决?
- 如何设置随机过期时间?
- 如何做缓存预热?
缓存一致性
- 如何保证缓存和数据库的一致性?
- 先更新数据库还是先更新缓存?
- 延时双删策略是什么?
- 如何处理缓存更新失败?
应用实践
分布式锁
- 如何使用Redis实现分布式锁?
- SETNX和SET的区别?
- 分布式锁需要注意哪些问题?(原子性、超时、误删)
- Redlock算法了解吗?
- Redis分布式锁和Zookeeper分布式锁的区别?
消息队列
- 如何使用Redis实现消息队列?
- List实现消息队列的优缺点?
- Pub/Sub的优缺点?会丢消息吗?
- Redis Stream了解吗?和Kafka的区别?
其他应用
- 如何使用Redis实现排行榜?
- 如何使用Redis实现计数器?
- 如何使用Redis实现限流?
- 如何使用Redis实现延时队列?
- 如何使用Redis存储Session?
性能优化
慢查询
- Redis的慢日志如何开启?
- 慢查询的阈值如何设置?
- 如何查看慢查询日志?
- 常见的慢查询原因?
性能监控
- 你们Redis都监控了哪些指标?
- 如何监控Redis的QPS?
- 如何监控命令执行时间?
- 如何监控内存使用?
- 如何监控网络流量?
优化建议
- Redis性能优化的思路?
- 如何优化大key问题?
- 如何优化热key问题?
- Pipeline有什么作用?
- 如何减少网络开销?
运维管理
数据迁移
- Redis数据迁移做过吗?如何实现?
- 如何从一个Redis集群迁移到另一个集群?
- 在线迁移如何保证数据一致性?
- 使用过哪些迁移工具?(redis-migrate-tool、redis-shake)
备份恢复
- Redis如何备份数据?
- 如何恢复Redis数据?
- 如何定时备份?
- 备份文件如何管理?
故障处理
- Redis服务启动失败如何排查?
- Redis连接不上如何排查?
- Redis内存溢出如何处理?
- Redis主从同步异常如何处理?
- 如何处理Redis的阻塞问题?
安全加固
- Redis安全需要注意哪些方面?
- 如何设置Redis密码?
- 如何限制Redis的访问IP?
- 如何禁用危险命令?(FLUSHDB、KEYS等)
- Redis未授权访问漏洞如何防范?
高级特性
事务
- Redis支持事务吗?和MySQL事务的区别?
- MULTI、EXEC、DISCARD命令的作用?
- Redis事务的ACID特性?
- WATCH命令的作用?(乐观锁)
- Redis事务的限制?
Lua脚本
- 为什么要在Redis中使用Lua脚本?
- 如何执行Lua脚本?(EVAL、EVALSHA)
- Lua脚本的原子性如何保证?
- Lua脚本的限制和注意事项?
其他特性
- Redis的发布订阅如何使用?
- Redis Module了解吗?
- Redis 6.0的ACL是什么?
- Redis的客户端缓存是什么?
实战问题
流量分析
- 如何找出Redis高流量的来源?
- 如何分析Redis的热key?
- 如何处理Redis的大key?
- 如何优化Redis的网络流量?
常见问题
- Redis和数据库双写一致性问题?
- Redis集群批量操作的限制?
- Redis的Big Key如何优化?
- Redis连接池如何配置?
- 生产环境Redis的最佳实践?
更新时间:2025-01-30