Cadena dinámica simple de estructura de datos de Redis

 Uno: la estructura de una cadena dinámica simple

1: estructura SDS

struct sdshdr {
  //buf已占用的空间长度
  //等于SDS所保存的字符串长度
  int len;
  //buf中剩余的空间长度   
  int free; 
  //字符数组,用于保存字符串
  char but[];  
}

2: Ejemplo de formato de datos SDS

  • El valor del atributo libre es 5, lo que significa que esta SDS tiene 5 bytes de espacio no utilizado.
  • El valor del atributo len es 5, lo que significa que esta SDS almacena una cadena de cinco bytes.
  • El atributo buf es una matriz de tipo char. Los primeros cinco bytes de la matriz contienen cinco caracteres de 'R', 'e', ​​'d', 'i' y 'respectivamente, y el último byte se almacena Cadena vacía' \ 0 '.

Dos: las ventajas de las cadenas dinámicas simples

1: Complejidad constante para obtener la longitud de la cuerda

En comparación con el recorrido de la cadena C para obtener la longitud, SDS solo necesita obtener el atributo len en la estructura para obtener la longitud, lo que reduce la complejidad original de obtener la longitud de la cadena de O (N) a O (1)

2: poner fin al desbordamiento del búfer

Cuando la cadena C ejecuta la función strcat, si olvida comprobar si el espacio restante es suficiente antes de ejecutarlo, es probable que los datos se desborden a otras ubicaciones, provocando la modificación de otras cadenas.

Si hay dos cadenas C S1 y S2 una al lado de la otra en la memoria, S1 almacena la cadena 'Redis' y S2 almacena la cadena 'MongoDB', como se muestra en la siguiente figura

Si un programador ejecuta strcat (1, "Cluster"), los datos de S1 se desbordarán en la memoria de S2, alterando la cadena de S2.

Cuando SDS realiza el empalme de cadenas, este problema no existirá. Primero verificará si el espacio restante es suficiente antes de la ejecución. Si no es suficiente, expandirá el espacio al tamaño requerido para la ejecución y luego ejecutará la cadena en el Lenguaje C. Función de conexión, para que no haya desbordamiento de búfer

3: Reducir el número de reasignaciones de memoria cuando se modifica la cadena

  • Cuando la cadena C ejecuta la función de empalme adjunto, la memoria debe reasignarse para evitar el desbordamiento del búfer causado por una memoria insuficiente.
  • Cuando la cadena C ejecuta la función de truncamiento de recorte, la memoria debe reasignarse para liberar el espacio de memoria que no está en uso. Si se olvida este paso, se producirá una pérdida de memoria.

    Para SDS, el diseñador utilizó la preasignación de espacio y liberó espacio de forma perezosa para resolver el problema de la reasignación frecuente de memoria.

  3.1: Preasignación de espacio

      Cuando se ejecuta la función de empalme, se encuentra que la memoria no está vacía o es insuficiente, y el espacio de memoria será preasignado. Las reglas de asignación son las siguientes

  • Si la longitud modificada de la SDS es inferior a 1 M, se asignará a libre el mismo espacio de memoria que el valor del atributo len. Por ejemplo, si la longitud de la cadena S1 modificada es 13 bytes, entonces el libre albedrío también asignará 13 bytes , y la longitud real de la matriz buf es 13 + 13 + 1 = 27 bytes de longitud (1 se usa para almacenar una cadena vacía)
  • Si la longitud modificada de la SDS es mayor o igual a 1 M, el programa asignará 1 MB libre de espacio de memoria no utilizado. Si el valor del atributo len modificado de la SDS es 2 MB, entonces libre es 1 MB y la longitud real de la matriz buf es 2MB + 1MB + 1byte

  3.2: Liberación de espacio perezoso

      Cuando el SDS ejecuta la función sdstrim, la memoria liberada se incluirá en la libre y el espacio liberado se puede usar cuando la función sdscat se ejecute la próxima vez, evitando así la reasignación frecuente de memoria.

      Al mismo tiempo, SDS también tiene una función correspondiente que nos permite liberar el espacio no utilizado de la SDS cuando lo necesitemos, por lo que no hay necesidad de preocuparse por el desperdicio de memoria.

      Tanto la preasignación de espacio como la liberación diferida de espacio pueden evitar problemas frecuentes de reasignación de memoria.

4: seguridad binaria

La cadena C debe ajustarse a una determinada codificación (como ASCII) y, además del final de la cadena, la cadena no puede contener una cadena vacía; de lo contrario, se considerará como el final de la cadena, lo que restringe la cadena C ser texto. No puede guardar datos binarios como imágenes, audios, videos y archivos comprimidos.

La SDS guarda datos a través de binario y juzga si la cadena termina con el valor del atributo len en lugar de un carácter nulo. Esto asegura que Redis no solo pueda guardar datos de texto, sino también datos binarios en cualquier formato.

5: Compatible con algunas funciones de cadena C

El final de los datos en SDS se establecerá en una cadena vacía, de modo que pueda usar algunas de las funciones de <string.h>, como la función strcasecmp (), para evitar la duplicación de código innecesaria.

 

Supongo que te gusta

Origin blog.csdn.net/qq_37469055/article/details/114411035
Recomendado
Clasificación