面试题答案
一键面试1. SDS 简介
SDS(Simple Dynamic String)是 Redis 中用于表示字符串的数据结构。它具有如下特点:
- 长度信息明确:SDS 结构体中记录了字符串的长度,获取长度时间复杂度为 O(1),相比 C 字符串遍历获取长度的 O(N) 效率更高。
- 内存预分配:当 SDS 进行扩展时,会预先分配额外的空间,减少连续内存分配次数,提升性能。
- 惰性空间释放:当缩短 SDS 时,并不会立即释放多余的空间,而是留作备用,减少内存分配开销。
2. 在分布式 Redis 集群中助力数据一致性维护的方式
- 数据传输与同步:在分布式 Redis 集群中,节点间需要传输和同步数据。SDS 的二进制安全特性,确保了无论数据内容是什么(包括二进制数据),都能准确无误地在节点间传输,不会因为数据中的特殊字符等问题导致数据不一致。例如,当一个节点向其他节点同步某个包含二进制图片数据的键值对时,SDS 能保证图片数据完整传输,接收节点还原的数据与源数据一致。
3. 网络分区场景下
- 数据分区与一致性:当发生网络分区时,集群被分割成多个子网。假设网络分区将集群分为 A、B 两个子网。在子网内部,由于 SDS 的特性,数据的读写操作都能正常进行,保持子网内数据一致性。例如,子网 A 中的节点对某个使用 SDS 存储的字符串键值对进行修改,由于 SDS 能准确记录长度和保证二进制安全,该操作不会因为数据格式问题导致数据错误。
- 分区恢复后的合并:当网络分区恢复后,需要合并两个子网的数据。SDS 的内存预分配和惰性空间释放特性有助于在数据合并时减少内存操作开销,从而更快地恢复数据一致性。比如,子网 A 和子网 B 对同一个键有不同修改,在合并时,SDS 结构能高效地处理数据整合,减少因内存分配和释放导致的数据不一致风险。
4. 节点故障场景下
- 数据恢复:当某个节点发生故障后重启,需要从其他节点同步数据。SDS 的明确长度信息使得同步过程中能准确识别数据边界,确保数据完整恢复。例如,故障节点重启后从其他节点同步一个长字符串数据,SDS 能让接收端准确知道该字符串的长度,避免接收数据不完整或错误截断,保证恢复的数据与原数据一致。
- 副本同步:在 Redis 集群的主从复制场景下,主节点将数据同步给从节点。SDS 的二进制安全和高效的内存管理特性,保证了主从节点间数据副本的一致性。即使主节点上存储的是复杂的二进制数据(如序列化后的对象),通过 SDS 也能准确无误地同步到从节点,维持数据一致性。