Aquí indico unas notas sobre estructuras básicas, si un comando acepta varias opciones los comento en la sección de ejemplos.
Claves
Parejas clave valor:
- Son únicas.
- Por defecto si no existe se crea.
- Almacenadas en formato binario (se puede cualquier elemento binario como clave).
- Valores de clave de 512 MB de tamaño máximo.
- Sensible a mayúsculas / minúsculas.
| SET key value [EX seconds] [PX milliseconds|EX seconds] [NX|XX] | Crea la clave de nombre key con valor value | O(1) |
| MSET key1 value1 key2 value2 … keyN valueN | Inserta varias claves a la vez con sus valores correspondientes | O(N) |
| GET key | Obtiene la clave de nombre key | O(1) |
| KEYS [pattern] | Recupera todas las claves | O(N) |
| SCAN slot [MATCH pattern] [COUNT count] | Recupera las claves por grupos | O(1)/O(N) |
| DEL key1 key2 … | Borra las claves indicadas, es un comando bloqueante | O(1)/O(N)/(OM) |
| UNLINK key | Borra la clave indicada de forma asíncrona | O(1)/O(N) |
| EXISTS key | Indica si la clave existe (0 indica que no existe) | O(1) |
| TTL key | Tiempo restante de la clave antes de expirar en segundos | O(1) |
| PTTL key | Tiempo restante de la clave antes de expirar en milisegundos | O(1) |
| INCR key | Aumenta en 1 el valor de key (tiene que ser un número) | O(1) |
| INCRBY key [-]incr | Aumenta o decrementa (-) en incr el valor de key (tiene que ser un número) | O(1) |
| DECRBY key decr | Decrementa en decr el valor de key (tiene que ser un número) | O(1) |
| PEXPIRE key seconds | Cambia el tiempo de expiración de key en segundos | O(1) |
| EXPIREAT key timestamp | Indica el momento en que expirará en tiempo unix en segundos | O(1) |
| PEXPIREAT key timestamp_in_milliseconds | Indica el momento en que expirará en tiempo unix en milisegundos | O(1) |
| TYPE key | Devuelve el tipo de dato de key | O(1) |
| OBJECT [ENCODING| REFCOUNT| IDLETIME| FREQ| HELP] key | Devuelve información internal de key | O(1) |
Aunque KEYS y SCAN sirven para lo mismo (devolver todas las claves) tienen algunas diferencias.
| KEYS | SCAN |
| Bloque hasta que termina | Usa un cursor para iterar, útil para producción |
| No es para producción | Devuelve una referencia a un grupo |
| Útil para depuración | Devolverá 0 o más claves por llamada |
Ejemplos
SET claves:ejemplo:clave1 valor_nuevo
– Crea una clave de nombre claves:ejemplo:clave1 con valor valor_nuevo al no tener Redis espaciones de nombres suele ser interesante separar los elementos con «:» del elemento más general al específico
SET claves:ejemplo:clave1 valor_nuevo NX
– Crea la clave solo si no existía previamente (NX=No exist)
SET claves:ejemplo:clave1 valor_nuevo XX
– Crea la clave solo si exístia previamente
SET claves:ejemplo:clave1 valor_nuevo EX 7200
– Crea la clave claves:ejemplo:clave1 que expirará en 7200 segundos
SET claves:ejemplo:clave1 PX 50000
– Crea una clave que expirará en 50000 ms
SET claves:ejemplo:clave1 EX 50
– Crea una clave que expirará en 50 s (igual que el anterior)
GET claves:ejemplo:clave1
– Devuelve el valor de esta clave, en este caso valor_nuevo
KEYS claves:ejemplo:cl*
– Devuelve todas las claves que empiecen por cl*
SCAN 0 MATCH claves:ejemplo:cl*
– Devuelve todas las claves que empiecen por cl* empezando desde el princpio 0 devolverá un nuevo valor que se usará para la siguiente llamada, por ejemplo la salido puede ser:
1) «14848»
Entonces la siguiente llamada sería:
SCAN 14848 MATCH claves:ejemplo:1*
SCAN 14848 MATCH claves:ejemplo:1* 1000
– Indicamos que queremos buscar en bloques más grandes (1000)
Rendimiento
O(1): HDEL cuando borra un solo elemento, UNLINK, SCAN en una llamada
O(N): HDEL cuando borra varios elementos, siendo N el número de elementos, UNLINK en su hilo siendo N el número de elementos, SCAN para la iteración completa siendo N el número de elementos en la colección
O(M): HDEL cuando la clave eliminada contiene una estructura como lista, conjunto, conjunto ordenado o Hash, siendo M el número de elementos dentro de la esctructura
Hashes
Conjuntos de campos clave/valor.
- Así como existe un comando para borrar campos (HDEL) no existe uno para añadir, tanto la creación como la adición de campos se hace con HSET
- HMGET recomendado para pocas claves, si van a recuperarse muchas es mejor HSCAN
- No existe un comando para decrementar
| HSET key field1:value1 fieldN:valueN… | Creación de un hashset | O(N) |
| HSETNX key field value | Establece el valor value al compo field en key solo si no existía previamente, 1 indica que se cambió el valor y 0 lo contrario | O(1) |
| HGETALL key | Devuelve todos los campos del conjunto key | O(N) |
| HDEL key field1… fieldN | Elimina el campo field del conjunto key | O(N) |
| HGET key field | Obtiene el valor del campo field del conjunto key | O(1) |
| HMGET key field…fieldN | Obtiene las claves de los valores indicados | O(N) |
| HINCRBY key field value | Incrementa el campo field con la cantidad value (tiene que ser numérico) | O(1) |
| HINCRBYFLOAT key field value | Incrementa el campo field con la cantidad value (tiene que ser numérico) | O(1) |
| HSCAN key slot [MATCH pattern] [COUNT count] | Devuelve todos los campos de key | O(1)/O(N) |
| HEXISTS key field | Comprueba si existe el campo field en key (1 existe 0 no) | O(1) |
| HKEYS key | Obtiene todas las claves (N) de un key | O(N) |
| HVALS key | Obtiene todos los valores (N) de una key | O(N) |
Ejemplos
HSCAN hash:full 0 MATCH claves:ejemplo:cl*
– Tiene el mismo efecto que SCAN para claves pero sobre el hash hash:full
Rendimiento
O(1): HSCAN en una llamada
O(N): HGETALL (siendo n el número de campos), HSCAN para la iteración completa siendo N el número de elementos en la colección
Listas
Se pueden implentar como colas o como pilas añadiendo (PUSH) y quitando (POP) elementos de los extremos. Admite hasta 4 billones de elementos.
| RPUSH list value1 …valueN | Inserta por la derecha el elemento value en la lista list | O(N) |
| LPUSH list value1 …valueN | Inserta por la izquierda el elemento value en la lista list | O(N) |
| LPOP list [N] | Devuelve y elimina N elementos por la izquierda de la lista list | O(N) |
| RPOP list | Devuelve y elimina N elementos por la derecha de la lista list | O(N) |
| LRANGE list start [-]stop | Devuelve los N elementos de la lista list desde el índice start (S) hasta stop (índice basado en 0) empezando por la izquierda si stop es negativo empezará desde la derecha | O(S+N) |
| LLEN list | Devuelve el número de elementos de la lista list | O(1) |
| LTRIM list start [-]stop | Elimina los N elementos de la lista list excepto los contenidos entre los índices start y stop (índice basado en 0) empezando por la izquierda y si stop es negativo contará desde la derecha | O(N) |
| LINSERT key [after|before] key1 value | Inserta en la lista key antes (before) o después (after) del emento key en la posición N el valor value | O(N) |
| LINDEX key index | Devuelve el elemento en el índice (index) especificado de la lista de tamaño N key | O(N) |
| LSET key index value | Inserta el elemento value en el índice (index) especificado de la lista de tamaño N key | O(N) |
| LREM key count element | Elimina las count (M) primeras ocurrencias del elemento element en la lista de tamaño N key | O(M+N) |
Ejemplos
Teniendo una lista a,b,c,d,e,f llamada list
LTRIM list 0 4
Devuelve todos los elementos desde a hasta e
LTRIM list 1 -2
Devuelve los elementos b,c,d,e (f es el elemento -1 y e es el elemento -2)
LRANGE list 0 -1
Devuelve todos los elementos de la lista
Rendimiento
O(1): LPOP, RPUSH, LLEN
O(s+n): LRANGE (donde s es la distancia al primer elemento y n el número total de elementos)
Conjuntos
Colección no ordenada de elementos no duplicados
| SADD key element1 …elementN | Agrega los elementos elementX al conjunto de clave key | O(N) |
| SCARD key | Devuelve el número de elementos en el conjunto de clave key | O(1) |
| SISMEMBER key element | Indica si el elemento element está dentro del conjunto (devuelve 1) o no (devolverá 0) | O(1) |
| SINTER key1 key2 key3 … | Realiza la intersección y devuelve los elementos de los conjuntos de claves keyX | O(N*M) |
| SDIFF key1 …keyX | Realiza la diferencia de los conjuntos keyX | O(N) |
| SREM key element …elementN | Quita los N elementos element al conjunto de clave key | O(N) |
| EXPIREAT key time | El conjunto de clave key expirará en el tiempo indicado en time (Unix timestamp) | O(1) |
| SSCAN key slot [MATCH pattern] [COUNT count] | Devuelve todos los campos de key | O(1)/O(N) |
| SPOP key [count] | Devuelve count (N) elementos aleatorios de key | O(1) |
| SUNION key1 … keyX | Realiza la unión de todos los elementos | O(N) |
Ejemplos
Teniendo un conjunto A = {A, b, C} y B = {a, b, C}:
SDIFF A B
– Devolverá la diferencia de conjuntos, los elementos que están en A y no están en en B, es decir «A»
SSCAN set:full 0 MATCH claves:ejemplo:cl*
– Tiene el mismo efecto que SCAN para claves pero sobre el hash hash:full
Rendimiento
O(N*M): SINTER, siendo N la cardinalidad del conjunto pequeño y M el número de conjuntos
O(N): SDIFF y SUNION donde N es el número total de elementos de todos los conjuntos
Conjuntos ordenados
Una colección ordenada de elementos únicos, para ordenarlos a cada elemento se le asocia una puntuación (score) que será el valor usado para la ordenación.
Si esta puntuación es igual se realiza un orden lexicográfico basado en el nombre del key. Útil para:
- Colas con prioridad
- Mostrar paneles de puntuación con baja latencia
- Índices secundarios
| ZADD key [NX|XX] [CH] [INCR] score member | Agrega un elemento a key (tamaño N) con la puntuación score y el campo member | O(log(N)) |
| ZINCRBY key [-]increment member | Incrementa o decrementa [-] el valor del campo member a key (tamaño N) en un valor increment. | O(log(N)) |
| ZRANGE key [BYSCORE|BYLEX] [REV] [LIMIT offset count] [WITHSCORES] | Devuelve M elementos desde el score más bajo al más alto de key (tamaño N) | O(log(N)+M) |
| ZRANK key member | Devuelve la posición de member dentro de key ordenada de menor a mayor (si devuelve 0 tendría el score más bajo) | O(log(N)) |
| ZREVRANK key member | Devuelve la posición de member dentro de key ordenada de mayor a menor (si devuelve 0 tendría el score más alto) | O(log(N)) |
| ZSCORE key member | Devuelve el score del elemento member dentro del conjunto de clave key | O(1) |
| ZCARD key | Devuelve el número de elementos en el conjunto de clave key | O(1) |
| ZREM key value1 …valueN | Elimina M elementos del key (tamaño N) por nombre | O(M*log(N)) |
| ZREMRANGEBYRANK key min max | Elimina M elementos de key (tamaño N) entre los índices start y stop (índice basado en 0) empezando por la izquierda y si stop es negativo contará desde la derecha | O(log(N)+M) |
| ZREMRANGEBYLEX key min max | Elimina M elementos de key (tamaño N) en el rango lexicográfico entre start y stop (índice basado en 0) empezando por la izquierda y si stop es negativo contará desde la derecha | O(log(N)+M) |
| ZREMRANGEBYSCORE key min max | Elimina M elementos de key (tamaño N) cuya puntuación esté entre start y stop (índice basado en 0) empezando por la izquierda y si stop es negativo contará desde la derecha | O(log(N)+M) |
| ZCOUNT key min max | Devuelve el número de elementos con una puntuación entre min y max en key (tamaño N) | O(log(N)) |
| ZINTERSTORE destination numkeys key1..keyN [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] | Realiza la intersección de numkeys conjuntos key1… y almacena el valor en destination | O(N*K)+O(M*log(M)) |
| ZUNIONSTORE destination numkeys key1…keyN [WEIGHTS weight [weight …]] [AGGREGATE SUM|MIN|MAX] | Realiza la union de numkeys conjuntos key1… y almacena el valor en destination | O(N)+O(M log(M)) |
Ejemplos
ZREMRANGEBYRANK list:cash 9 -1
– Elimina desde el elemento 9 hacia la derecha, es decir, el último (j)
ZRANGEBYSCORE list:cash (3 +inf
– Devuelve los elementos que tenga un score superior a 3 (3 hasta el final de la lista +inf
ZADD claves:ejemplo:clave1 30 value1 NX
– Crea la clave solo si no existía previamente (NX=No exist)
ZADDclaves:ejemplo:clave1 30 value1 XX
– Actualiza la clave solo si exístia previamente
ZADD claves:ejemplo:clave1 30 value1 CH
– Devuelve solo los elementos que hayan cambiado, por defecto devuelve los creados
ZADD claves:ejemplo:clave1 30 value1 INC
– Se comporta como ZINCRBY
ZRANGE claves:ejemplo 10 20 BYLEX
– Devuelve los elementos con score entre 10 y 20, los que tengan el mismo score estarán ordenados lexicograficamente
ZRANGE claves:ejemplo 10 20 REV
– Devuelve los elementos en orden inverso
ZRANGE claves:ejemplo 10 20 LIMIT 1 9
– Devuelve los elementos desde el 1 hasta el 19 (si count es negativo devuelve todos los elementos desde offset).
Rendimiento
O(N*K)+O(M*log(M)): ZINTERSTORE siendo N el conjunto más pequeño, K el número de conjuntos y M el número de elementos en el conjunto resultante
Bit data
Conjuntos de de bits, el offset se entiende como el desplazamiento dentro del mapa de bits de tamaño, por ejemplo un offset de 9 indicaría la novena columna de la primera fila quedando así 0000 0001 en un caso más general usaremos la fórmula offset = Y * MAX_WIDTH + X por lo que si quisiéramos marcar la primera fila de la novena columna en un mapa de tamaño N (=MAX_WIDTH) tendríamos: (suponemos un tamaño de N=20)
offset = 1 * 20 + 9 = 29 y el y el mapa de bits sería 0000 0000 0000 0000 0000 000 0000 1, si juntamos las dos coordenadas (9,0) y (9,1) y lo apilamos en líneas de 20 (N) queda:
00000000000100000000
00000000000100000000
Offset se puede indicar también usando # en este caso Redis calcula la posición del bit dependiendo del tamaño del tipo, por ejemplo #1 para u8 sería el elemento 8*1 de esta forma se tiene un número de elementos cada uno con un valor y tamaño fijo.
| SETBIT key offset value | Establece value (1 o 0) al elemento offset dentro del mapa de bits key | O(1) |
| GETBIT key [-]offset | Recupera el valor del bit para el mapa key y offset especificado, si es negativo se excluye la parte especificada | O(1) |
| BITCOUNT offset key | Devuelve el número de bits a 1 en el mapa key a partir de offset | O(N) |
| BITFIELD key [get|set|incrby] type offset value [overflow wrap| sat|fail] | Devuelve (get) se establece (set) o incrementa (incrby) un valor value a un elemento type, definido como u para unsigned e i para signed seguido del tamaño en bits, por ejemplo u5, los comandos get and set se puede acumular en la misma instrucción bitfield | O(1) |
| BITOP [and|or|xor|not] key key1 key2 | Ejecuta la operación [or] sobre key1 y key2 y almacena el resultado en key | O(N) |
| BITPOS key [0|1|start end] | Busca en key el valor 0 o 1 según se indique, si se especifican dos valores indica un intervalo a buscar, en este caso el valor 0. | O(N) |
Datos geoespaciales
Permite guardar datos usando coordenadas (latitud, longitud), se almacenan codificados en GeoHash (52 bits), se almacenan como un sorted set donde GeoHash es el score por lo que los mismos comandos de sorted set se pueden usar también aquí.
| GEOADD key longitude1 latitude1 member … [longitudeN latitudeN] | Añade una ubicación name al conjunto key de N elementos usando la longitud y latitud especificada, si se le llama con los mismos datos actualizará la posición existente. | O(log(N)) |
| GEOSEARCH key [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [BYBOX width height m|km|ft|mi][WITHDIST] [WITHCOORD] [ASC | DESC] [COUNT n] | Devuelve los N sitios en el radio (byradius) o caja (bybox) indicado de los M existentes, usando como centro la longitud y latitud especificada o el ancho y alto, WITHDIST devuelve la distancia, WITHCOORD devuelve también las coordenadas, usando ASC se devolverán los resultados en orden empezando por la más cercana o viceversa usando DESC, se puede limitar el número de resultados a devolver con COUNT, unit es la unidad de medida a devolver: m (metros) km (kilometros) mi (millas) ft (pies). | O(N+log(M)) |
| GEOSEARCHSTORE store source [FROMLONLAT longitude latitude] [BYRADIUS radius m|km|ft|mi] [BYBOX width height m|km|ft|mi] [ASC | DESC] [COUNT n] | Este comando es como GEOSEARCH pero almacena los resultados en el store indicado, si se usa la opción STOREDIST almacena los resultados en un conjunto ordenado con la distancia al centro desde el círculo o caja. | O(N+log(M)) |
| GEOHASH key member1 … [memberN] | Devuelve el valor de GeoHash para el elemento indicado dentro del sorted set de N elementos | O(log(N)) |
| GEOPOS key member1 … [memberN] | Devuelve la longitud y latitud de todos los N elementos solicitados dentro del conjunto key | O(N) |
| GEODIST key member1… [memberN] [unit] | Devuelve la distancia entre dos elementos en la unidad indicada: m (metros) km (kilometros) mi (millas) ft (pies). | O(log(N)) |
