面试题答案
一键面试Redis SDS结构特点
- 结构体定义:
struct sdshdr { int len; int free; char buf[]; };
- len字段:记录了SDS字符串中已使用的字节数。通过这个字段,获取字符串长度时间复杂度为O(1),而传统C字符串获取长度需遍历整个字符串,时间复杂度为O(n)。
- free字段:记录了SDS字符串中未使用的字节数。这使得在字符串进行拼接等操作时,如果空间足够,不需要频繁分配内存,减少了内存分配和释放的开销。
- buf数组:用于存储实际的字符串内容,并且以'\0'结尾,这样可以直接使用一部分C语言标准库中处理字符串的函数。
在消息推送系统中优化存储结构适应消息数据存储和处理
- 节省内存:
- 消息推送系统可能有大量的消息,SDS的free字段可以避免频繁的内存分配和释放。例如,对于一些短小且频繁更新的消息(如消息状态更新),利用SDS的预分配策略,减少内存碎片,提高内存利用率。
- 高效的追加操作:
- 在消息推送过程中,可能需要不断追加新的消息内容(如将多个短消息合并为长消息进行推送)。SDS的append操作可以直接利用free空间,当空间不足时,也会按照一定的策略扩展空间,整体操作时间复杂度接近O(1),比传统C字符串在追加操作时每次都需重新分配内存要高效得多。
- 二进制安全:
- 消息数据可能包含二进制数据(如图片、音频等二进制格式数据的元信息),SDS以len字段记录长度,而非像C字符串依赖'\0'作为结束标志,所以可以存储包含'\0'的数据,保证了消息数据存储的完整性和准确性。
- 减少内存重分配次数:
- 当消息数据增长时,SDS会预分配额外的空间。如果增长后的长度小于1MB,会预分配和len相同大小的空间;如果增长后长度大于等于1MB,会预分配1MB的空间。这大大减少了在消息不断更新时内存重分配的次数,提升了系统性能,对于高并发的消息推送系统至关重要。