一、语雀-Redis面试题
1、Redis是AP的还是CP的?
2、介绍一下Redis的集群模式?
Redis有三种主要的集群模式,用于在分布式环境中实现高可用性和数据复制。这些集群模式分别是:主从复制(Master-Slave Replication)、哨兵模式(Sentinel)和Redis Cluster模式。
1. 主从复制模式
2. 哨兵模式
3. Cluster模式
3、什么是Redis的数据分片?
4、Redis 使用什么协议进行通信?
5、Redis 与 Memcached 有什么区别?
6、Redis为什么这么快?
7、Redis 支持哪几种数据类型?
8、Redis为什么要自己定义SDS?
Redis自定义SDS(Simple Dynamic String,简单动态字符串)是为了解决C语言原生字符串在性能、功能和灵活性上的不足:
- 高效操作:SDS直接存储字符串长度,获取长度时间复杂度为O(1)(C需遍历),且支持预分配和惰性释放策略,减少扩容开销;
- 二进制安全:兼容任意字节流(如图片、序列化数据),而C字符串以
\0结尾,无法处理含空字符的数据; - 内存优化:通过结构体分层设计(如
len、free字段),支持动态调整和碎片整理,提升内存利用率; - 功能扩展:提供字符串修改、拼接等操作的API,简化开发并保证高性能。
这些改进使Redis能高效处理高频读写场景,满足其作为内存数据库的核心需求。
9、Redis中的Zset是怎么实现的?
1. 何时转换
2. 跳表
10、Redis为什么被设计成是单线程的?
11、为什么Redis设计成单线程也能这么快?
多路复用的IO模型本质上仍然是同步阻塞型IO模型。
Redis 使用单线程配合 I/O 多路复用(如 epoll),其设计精妙之处在于:
-
非阻塞 I/O:网络请求通过
epoll监听,内核仅在事件就绪时通知 Redis 处理,无需阻塞线程等待数据。 -
单线程顺序执行:所有命令按顺序处理,避免了多线程的锁竞争和上下文切换开销。
-
高效性来源:
- I/O 多路复用:单线程可同时管理成千上万的客户端连接,高效分发事件。
- 内存操作:所有数据驻留内存,读写速度极快(纳秒级)。
- 无阻塞操作:耗时任务(如持久化)通过异步子进程处理,不污染主线程。