MST

星途 面试题库

面试题:Redis SDS在海量数据存储时如何减少内存碎片?

在海量数据存储场景下,内存碎片是影响性能和存储效率的关键因素。请阐述Redis SDS(简单动态字符串)结构在应对这一问题时采取了哪些策略,从而有效减少内存碎片的产生。
26.7万 热度难度
数据库Redis

知识考点

AI 面试

面试题答案

一键面试
  1. 空间预分配策略
    • 当SDS进行字符串修改操作时,如果修改后SDS的长度(len)小于1MB,那么Redis会分配和len属性同样大小的未使用空间(free),即分配的总空间大小为2倍len + 1(1字节用于保存字符串结束符'\0')。例如,原本SDS存储的字符串长度为10字节,修改后长度变为20字节,那么此时除了保存20字节的字符串内容外,还会额外分配20字节的未使用空间。
    • 当修改后SDS的长度大于等于1MB时,Redis会分配1MB的未使用空间。这样在后续字符串增长操作时,如果增长幅度在预分配的空间范围内,就无需频繁重新分配内存,从而减少了内存碎片的产生。
  2. 惰性空间释放策略
    • 当SDS字符串缩短时,Redis并不会立即释放多余的空间,而是将这些空间记录在free属性中。例如,原本SDS存储一个长度为100字节的字符串,当删除部分内容使其长度变为50字节时,Redis不会马上回收这50字节的空间,而是将free属性值设为50。这样当下次需要扩展字符串时,如果扩展的长度不超过free空间的大小,就可以直接使用这些空间,避免了重新分配内存,减少了内存碎片。
  3. 连续内存存储
    • SDS采用连续的内存空间来存储字符串数据。相比于一些采用链表等非连续数据结构存储字符串的方式,连续内存存储可以避免由于频繁插入和删除操作导致的内存碎片化。在连续内存空间中,内存分配和释放更加高效,操作系统的内存管理机制可以更好地管理这些连续的内存块,减少内存碎片的产生。同时,连续内存存储也有利于提高缓存命中率,因为CPU缓存通常以连续内存块为单位进行缓存,连续存储的SDS字符串可以更好地利用缓存,提升性能。