面试题答案
一键面试Redis SDS空间预分配策略
- SDS结构:Redis的SDS(Simple Dynamic String)结构包含了长度信息(len)、已使用空间(free)等字段。
- 预分配策略:
- 当SDS的长度(len)小于1MB时,每次进行空间扩展时,会额外分配与len相同大小的未使用空间。例如,若当前SDS长度为5字节,进行扩展操作时,除了满足实际需要的空间外,还会额外分配5字节的未使用空间。
- 当SDS的长度(len)大于等于1MB时,每次扩展会额外分配1MB的未使用空间。
追加操作时空间预分配的执行
- 检查空间:在执行追加操作前,先检查SDS的未使用空间(free)是否足够容纳追加的内容。
- 不足时扩展:如果未使用空间不足,则根据上述预分配策略进行空间扩展。计算出需要的总空间大小(当前已使用空间 + 追加内容大小 + 预分配空间),然后重新分配内存。将原SDS内容复制到新分配的内存空间,再将追加内容写入,同时更新SDS结构中的len和free字段。
对Redis性能和内存管理的重要意义
- 性能方面:
- 减少内存重新分配次数:通过预分配策略,在一定程度上减少了频繁追加操作时内存重新分配的次数。因为有了预分配的空间,后续追加操作若在预分配范围内,就无需立即进行内存重新分配,从而提升了追加操作的效率。
- 降低碎片化:合理的预分配有助于减少内存碎片化。如果每次追加都只分配刚好够用的空间,随着频繁的追加和删除操作,内存中容易产生大量碎片,影响内存分配效率。预分配策略可以使得内存分配更加连续,减少碎片的产生。
- 内存管理方面:
- 优化内存使用:预分配策略既保证了有足够的空间来应对后续可能的追加操作,又不会过度分配导致内存浪费。在SDS长度较小时,按比例预分配;长度较大时,固定预分配1MB,这种方式根据SDS的不同规模,合理地控制了预分配空间的大小,优化了内存使用。