Redis 高级面试题解析
20. 说说 Redis 哈希槽的机制?
Redis 集群采用哈希槽(Hash Slot)机制来分布和管理数据。整个哈希空间被划分为 16384 个槽,每个键通过 CRC16 校验后取模映射到一个哈希槽。每个节点负责一部分哈希槽,从而实现数据分片和负载均衡。
21. Redis 集群的主从复制模型是怎样的?
Redis 集群中的每个主节点(Master)可以有多个从节点(Slave)。主节点负责写操作,从节点负责读操作和数据备份。当主节点失效时,从节点可以通过投票机制提升为主节点,保证高可用性。
22. Redis 集群会有写操作丢失吗?为什么?
Redis 集群在网络分区或多数主节点失效时可能会丢失写操作。因为 Redis 集群采用异步复制,写操作在传播到从节点前,主节点可能会失效,导致数据丢失。
23. Redis 集群之间是如何复制的?
Redis 集群中的主从节点间采用异步复制机制。主节点在处理写操作后,将变更通知从节点,从节点异步地接收和应用这些变更。
24. Redis 集群最大节点个数是多少?
Redis 集群最大支持 1000 个节点。
25. Redis 集群如何选择数据库?
Redis 集群仅支持单个数据库,即数据库索引为 0。因此,所有数据都存储在同一个数据库中,无法像单节点 Redis 那样选择不同的数据库。
26. 怎么测试 Redis 的连通性?
可以使用 ping
命令测试 Redis 服务器的连通性:
redis-cli ping
如果连接正常,服务器会返回 PONG
。
27. 怎么理解 Redis 事务?
Redis 事务是一组原子操作的集合。事务通过 MULTI
、EXEC
、DISCARD
和 WATCH
等命令实现。事务内的所有命令按顺序执行,不会被其他命令插入。
28. Redis 事务相关的命令有哪些?
- MULTI:开始一个事务。
- EXEC:执行事务中的所有命令。
- DISCARD:放弃事务中的所有命令。
- WATCH:监视一个或多个键,若在事务执行前这些键被修改,事务将被取消。
29. Redis Key 的过期时间和永久有效分别怎么设置?
- 设置过期时间:使用
EXPIRE
命令,如设置 10 秒后过期:EXPIRE key 10
- 设置永久有效:使用
PERSIST
命令取消键的过期时间:PERSIST key
30. Redis 如何做内存优化?
- 合理使用数据类型:选择适合的数据结构存储数据。
- 压缩数据:使用合适的编码方式减少内存占用。
- 淘汰策略:配置合适的内存淘汰策略,如 LRU(最近最少使用)。
- 过期策略:合理设置键的过期时间,及时清理无用数据。
31. Redis 回收进程如何工作的?
Redis 回收进程通过定期和惰性删除机制清理过期键。当内存使用达到阈值时,Redis 根据配置的淘汰策略删除部分键,以腾出空间。
32. 有哪些办法可以降低 Redis 的内存使用情况呢?
- 使用合适的数据结构:例如使用哈希表存储小对象。
- 压缩和编码:利用 Redis 内置的对象编码(如 ZIPLIST、INTSET)优化存储。
- 设置过期时间:及时清理过期数据。
- 数据拆分:将大对象拆分成小对象存储。
33. Redis 的内存用完了会发生什么?
当 Redis 内存用完时,会根据配置的淘汰策略删除部分键。如果没有配置淘汰策略,写操作将返回错误(OOM
),无法插入新数据。
34. 一个 Redis 实例最多能存放多少的 KEYS?
Redis 理论上能存储的数据量取决于可用内存和操作系统的限制。实际中,内存是主要限制因素。64 位系统下,Redis 可以支持数十亿个键。
35. MySQL 里有 2000w 数据。Redis 中只存 20w 的数据,如何保证 Redis 中的数据都是热点数据?Redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。
可以通过以下方法保证 Redis 中存储热点数据:
- 设置合理的过期时间:确保长时间不访问的数据自动过期。
- 使用 LRU 淘汰策略:淘汰最近最少使用的数据,保持热点数据在内存中。
36. Redis 最适合的场景?
- 缓存:提高数据访问速度,减轻数据库负载。
- 会话存储:存储用户会话数据。
- 排行榜/计数器:实现快速排序和计数功能。
- 消息队列:实现发布/订阅和延迟队列等功能。
- 实时分析:处理实时数据分析和统计。
37. 假如 Redis 里面有 1亿个 Key,其中有 10w 个 Key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
可以使用 SCAN
命令配合模式匹配找出指定前缀的键:
SCAN 0 MATCH prefix* COUNT 1000
注意,SCAN
命令是增量式遍历,不会阻塞 Redis。
38. 如果有大量的 Key 需要设置同一时间过期。一般需要注意什么?
- 避免过期时间扎堆:大批量键同时过期会造成 Redis 瞬时压力增大。
- 分批设置过期时间:将过期时间分散开,减少压力。
39. 使用过 Redis 做异步队列么,你是怎么用的?
可以使用 Redis 的列表(List)结构实现异步队列:
- 生产者使用
LPUSH
将任务加入队列。 - 消费者使用
BRPOP
从队列中取出任务。
40. 使用过 Redis 分布式锁么,它是什么回事?
Redis 分布式锁用于在分布式环境下控制资源访问。实现方法:
- 使用
SET key value NX PX
设置锁,NX
确保键不存在时设置,PX
设置过期时间。 - 释放锁时,确保释放的是自己加的锁,可以使用 Lua 脚本保证原子性。