¿Cómo funciona el almacenamiento de valores clave?
Last updated
Last updated
Como se ha mencionado anteriormente, el almacenamiento en Cosmos-SDK se basa en un almacén clave-valor, donde cada valor se guarda bajo una clave. El almacenamiento se estructura utilizando un modelo de árbol, en concreto, la estructura de árbol cosmos/iavl.
Aquí tienes una explicación de cómo funciona el almacenamiento clave-valor:
Esta es una explicación muy simplificada para ayudarte a entender los iteradores de la tienda KV.
Las letras dentro de los círculos son claves, y cada clave corresponde a un valor.
Supongamos que estos son los pares clave-valor guardados:
J -> value1
JF -> value2
JPV -> value3
JPVA -> value4
JPVD -> value5
JPVX -> value6
Recuperar un único valor con una clave conocida es una operación barata, que sólo lleva O(1) de tiempo. Pero, ¿y si necesitamos iterar sobre claves? En este caso, la iteración puede hacerse mediante prefijos.
J key, prefixes: J
JF key, prefixes: J, JF
JPV key, prefixes: J,JP, JPV
JPVA key, prefixes: J,JP, JPV, JPVA
JPVD key, prefixes: J,JP, JPV, JPVD
JPVX key, prefixes: J,JP, JPV, JPVX
range(J) devuelve todas las claves porque todas tienen J como prefijo range(JF) devuelve sólo JF
Aquí es donde se pone interesante: range(JPV) devuelve JPV, JPVA, JPVD, JPVX en orden Como puede ver no se devuelve J o JF, porque se solicitan valores después de JPV.
Pero, ¿por qué devuelve JPVA?
Las claves se guardan en el almacenamiento como cadenas de longitud fija. Por ejemplo, la representación de JPVA en el almacenamiento (suponiendo que las claves tienen 8 caracteres) sería JPVA0000. Cuando se realiza una petición de rango, el proceso en segundo plano itera sobre todas las claves desde JPV00000 hasta JPVFFFFF, y JPVA (junto con otras claves) cae dentro de este rango. Además, una consulta de rango puede ejecutarse a la inversa.
Estas son las dos únicas funcionalidades que existen: obtener un único valor, iterar.
La mayoría de las veces hay que establecer relaciones complejas entre estructuras de datos, pero lo único que tenemos es este almacenamiento limitado de valores clave.
Esto se hace mediante la construcción de índices.