One place for hosting & domains

      ordenados

      Cómo administrar conjuntos ordenados en Redis


      Introducción

      Redis es un almacén de datos clave-valor en memoria de código abierto. En Redis, los conjuntos ordenados son un tipo de datos similares a los conjuntos, ya que ambos son grupos de cadenas que no se repiten. La diferencia es que cada componente de un conjunto ordenado se asocia a una puntuación, lo que permite ordenarlos de la menor a la mayor. Como en el caso de los conjuntos, todos los componentes de un conjunto ordenado deben ser únicos, aunque varios pueden compartir la misma puntuación.

      En este tutorial, se explica la forma de crear conjuntos ordenados, obtener y eliminar sus componentes y crear nuevos conjuntos ordenados a partir de conjuntos existentes.

      Cómo usar esta guía

      Esta guía está escrita a modo de ayuda memoria con ejemplos independientes. Lo alentamos a ir directamente a cualquier sección que sea pertinente para la tarea que desee completar.

      Los comandos que se muestran en esta guía se probaron en un servidor de Ubuntu 18.04 con Redis 4.0.9. Para configurar un entorno similar, puede seguir el paso 1 de nuestra guía Cómo instalar y proteger Redis en Ubuntu 18.04. Mostraremos el comportamiento de estos comandos ejecutándolos con redis-cli, la interfaz de línea de comandos de Redis. Tenga en cuenta que si utiliza una interfaz de Redis diferente (por ejemplo, Redli), el resultado exacto de algunos comandos puede diferir.

      De forma alternativa, podría proporcionar una instancia de base de datos de Redis gestionada para probar estos comandos, pero tenga en cuenta que, dependiendo del nivel de control que permita su proveedor de base de datos, es posible que algunos comandos de esta guía no funcionen según lo descrito.  Para proporcionar una base de datos gestionada de DigitalOcean, consulte nuestra documentación sobre bases de datos gestionadas. Luego, debe instalar Redli o configurar un túnel TLS para establecer conexión con la base de datos gestionada mediante TLS.

      Crear conjuntos ordenados y añadir componentes

      Para crear un conjunto ordenado, utilice el comando zadd. zadd acepta como argumento el nombre de la clave que contendrá el conjunto ordenado, seguido de la puntuación del componente que añada y el valor del propio componente. Con el siguiente comando, se creará una clave de conjunto ordenado denominada faveGuitarists con un componente, "Joe Pass", que tiene una puntuación de 1:

      • zadd faveGuitarists 1 "Joe Pass"

      zadd mostrará un entero que indica la cantidad de componentes añadidos al conjunto ordenado si se creó de forma correcta.

      Output

      (integer) 1

      Puede añadir más de un componente a un conjunto ordenado con zadd. Tenga en cuenta que no es necesario que las puntuaciones sean secuenciales; puede haber brechas entre ellas, y varios componentes de un mismo conjunto ordenado pueden compartir la misma puntuación:

      • zadd faveGuitarists 4 "Stephen Malkmus" 2 "Rosetta Tharpe" 3 "Bola Sete" 3 "Doug Martsch" 8 "Elizabeth Cotten" 12 "Nancy Wilson" 4 "Memphis Minnie" 12 "Michael Houser"

      Output

      (integer) 8

      zadd puede aceptar las siguientes opciones, que debe ingresar después del nombre de clave y antes de la puntuación del primer componente:

      • NX o XX: estas opciones tienen efectos opuestos. Por lo tanto, solo puede incluir una de ellas en cualquier operación de zadd:
        • NX: indica a zadd que no actualice componentes existentes. Con esta opción, zadd añadirá únicamente elementos nuevos.
        • XX: indica a zadd a que solo actualice elementos existentes. Con esta opción, zadd nunca añadirá nuevos componentes.
      • CH: en general, zadd solo muestra la cantidad de nuevos elementos añadidos al conjunto ordenado. Con esta opción, sin embargo, zadd mostrará la cantidad de elementos modificados. Esto comprende los componentes recientemente añadidos y aquellos cuya puntuación se modificó.
      • INCR: hace que el comando aumente el valor de la puntuación del componente. Si el componente todavía no existe, el comando lo añadirá al conjunto ordenado con el aumento como puntuación, como si la puntuación original hubiera sido 0. Con INCR incluido, zadd muestra la puntuación nueva del componente si es correcta. Tenga en cuenta que solo puede incluir una puntuación o un componente a la vez cuando se utiliza esta opción.

      En lugar de pasar la opción INCR a zadd, puede usar el comando zincrby, que se comporta exactamente de la misma manera. En vez de dar al componente del conjunto ordenado el valor que indica la puntuación como zadd, aplica a la puntuación del componente un incremento equivalente a ese valor.  Por ejemplo, con el siguiente comando se aplica un incremento de 5 a la puntuación del componente "Stephen Malkmus", que originalmente era 4, con lo cual llega a 9.

      • zincrby faveGuitarists 5 "Stephen Malkmus"

      Output

      "9"

      Como en el caso de la opción INCR del comando zadd, si el componente especificado no existe, zincrby lo crea con el valor de incremento como puntuación.

      Obtener componentes de conjuntos ordenados

      La manera más básica de recuperar componentes de un conjunto ordenado es usar el comando zrange.  Este comando acepta como argumento el nombre de la clave cuyos componentes desea obtener y un intervalo de componentes que se encuentran en su interior. El intervalo está definido por dos números que representan índices basados en cero, lo cual significa que 0 representa el primer componente del conjunto ordenado (o el componente con la puntuación más baja), 1 el siguiente y así sucesivamente.

      En el siguiente ejemplo, se mostrarán los primeros cuatro componentes del conjunto ordenado faveGuitarists creado en la sección anterior:

      • zrange faveGuitarists 0 3

      Output

      1) "Joe Pass" 2) "Rosetta Tharpe" 3) "Bola Sete" 4) "Doug Martsch"

      Tenga en cuenta que si el conjunto ordenado que pasa a zrange tiene dos o más elementos con la misma puntuación, les aplicará orden lexicográfico o alfabético.

      Los índices de inicio y detención también pueden ser números negativos: -1 representa el último componente, -2 el penúltimo y así sucesivamente.

      • zrange faveGuitarists -5 -2

      Output

      1) "Memphis Minnie" 2) "Elizabeth Cotten" 3) "Stephen Malkmus" 4) "Michael Houser"

      zrange puede aceptar el argumento WITHSCORES que, cuando se incluya, también mostrará las puntuaciones de los componentes:

      • zrange faveGuitarists 5 6 WITHSCORES

      Output

      1) "Elizabeth Cotten" 2) "8" 3) "Stephen Malkmus" 4) "9"

      zrange solo puede mostrar un intervalo de componentes en orden numérico ascendente. Para revertir esto y mostrar un intervalo en orden decreciente, debe usar el comando zrevrange. Considere este comando como una reversión temporal del ordenamiento del conjunto ordenado dado antes de mostrar los componentes que se encuentran dentro del intervalo especificado. Como sucede con zrevrange, 0 representará el último componente de la clave, 1 el penúltimo y así sucesivamente:

      • zrevrange faveGuitarists 0 5

      Output

      1) "Nancy Wilson" 2) "Michael Houser" 3) "Stephen Malkmus" 4) "Elizabeth Cotten" 5) "Memphis Minnie" 6) "Doug Martsch"

      zrevrange también puede aceptar la opción WITHSCORES.

      Puede mostrar un intervalo de componentes según sus puntuaciones con el comando zrangebyscore. En el siguiente ejemplo, con el comando se mostrará cualquier componente que se encuentre en la clave faveGuitarists con una puntuación de 2, 3, o 4:

      • zrangebyscore faveGuitarists 2 4

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch" 4) "Memphis Minnie"

      En este ejemplo, el intervalo es inclusivo, lo cual significa que mostrará componentes con puntuaciones de 2 o 4. Puede excluir cualquier extremo del intervalo anteponiéndole un paréntesis abierto ((). En el siguiente ejemplo, se mostrarán todos los componentes con una puntuación superior o igual a 2, pero inferior a 4:

      • zrangebyscore faveGuitarists 2 (4

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch"

      Al igual que zrange, zrangebyscore puede aceptar el argumento WITHSCORES. También acepta la opción LIMIT, que puede usar para obtener solo una selección de elementos del resultado de zrangebyscore. Esta opción acepta un desplazamiento, que indica el primer componente del intervalo que se mostrará con el comando y un recuento que define la cantidad total de componentes que se mostrarán con el comando. Por ejemplo, con el siguiente comando se analizarán los primeros seis componentes del conjunto ordenado faveGuitarists, pero solo se mostrarán 3 componentes de él, a partir del segundo componente del intervalo, representado por 1:

      • zrangebyscore faveGuitarists 0 5 LIMIT 1 3

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch"

      Con el comando zrevrangebyscore, se muestra un intervalo invertido de componentes según sus puntuaciones. Con el siguiente comando se muestran todos los componentes del conjunto con una puntuación de entre 10 y 6:

      • zrevrangebyscore faveGuitarists 10 6

      Output

      1) "Stephen Malkmus" 2) "Elizabeth Cotten"

      Al igual que zrangebyscore, zrangebyscore puede aceptar las opciones WITHSCORES y LIMIT. Además, puede excluir cualquier extremo del intervalo anteponiéndole un paréntesis abierto.

      Puede haber momentos en que todos los componentes de un conjunto ordenado tengan la misma puntuación. En ese caso, puede hacer que Redis muestre de forma forzosa un intervalo de elementos en orden lexicográfico o alfabético con el comando zrangebylex. Para probar este comando, ejecute el siguiente comando zadd a fin de crear un conjunto ordenado en el que cada componente tenga la misma puntuación:

      • zadd SomervilleSquares 0 Davis 0 Inman 0 Union 0 porter 0 magoun 0 ball 0 assembly

      zrangebylex debe ir seguido del nombre de una clave, un intervalo de inicio y un intervalo de detención. Los intervalos de inicio y detención deben iniciarse con un paréntesis abierto (() o un corchete abierto ([), como se muestra a continuación:

      • zrangebylex SomervilleSquares [a [z

      Output

      1) "assembly" 2) "ball" 3) "magoun" 4) "porter"

      Tenga en cuenta que en este ejemplo solo se mostraron cuatro de los ocho componentes del conjunto, a pesar de que el comando buscaba un intervalo de la a a la z. Esto se debe a que los valores de Redis distinguen entre mayúsculas y minúsculas; por lo tanto, los componentes que comienzan con letras mayúsculas se excluyeron de su resultado. Para mostrarlos, puede ejecutar lo siguiente:

      • zrangebylex SomervilleSquares [A [z

      Output

      1) "Davis" 2) "Inman" 3) "Union" 4) "assembly" 5) "ball" 6) "magoun" 7) "porter"

      zrangebylex también acepta los caracteres especiales -, que representa un infinito negativo y +, que representa un infinito positivo. Por lo tanto, con la siguiente sintaxis de comando también se mostrarán todos los componentes del conjunto ordenado:

      • zrangebylex SomervilleSquares - +

      Tenga en cuenta que zrangebylex no puede mostrar componentes del conjunto en orden lexicográfico inverso (alfabético ascendente). Para hacerlo, utilice zrevrangebylex:

      • zrevrangebylex SomervilleSquares + -

      Output

      1) "porter" 2) "magoun" 3) "ball" 4) "assembly" 5) "Union" 6) "Inman" 7) "Davis"

      Debido a que está destinado a usarse con conjuntos ordenados en los que todos los componentes tienen la misma puntuación, zrangebylex no acepta la opción WITHSCORES.  Sin embargo, sí acepta la opción LIMIT.

      Obtener información sobre conjuntos ordenados

      Para averiguar la cantidad de componentes de un conjunto ordenado determinado (o, en otras palabras, su cardinalidad), utilice el comando zcard. En el siguiente ejemplo, se muestra la cantidad de componentes contenidos en la clave faveGuitarists de la primera sección de esta guía:

      Output

      (integer) 9

      zcount puede indicar la cantidad de elementos de un conjunto ordenado determinado que se encuentran dentro de un intervalo de puntuaciones. El primer número que sigue a la clave es el comienzo del intervalo y el segundo es el final:

      • zcount faveGuitarists 3 8

      Output

      (integer) 4

      zscore obtiene la puntuación de un componente especificado de un conjunto ordenado:

      • zscore faveGuitarists "Bola Sete"

      Output

      "3"

      Si el componente o la clave especificados no existen, zscore mostrará (nil).

      zrank es similar a zscore, pero, en vez de mostrar la puntuación del componente determinado, muestra su clasificación. En Redis, una clasificación es un índice basado en cero de los componentes de un conjunto ordenado por su puntuación. Por ejemplo, "Joe Pass" tiene una puntuación de 1, pero, dado que esa es la puntuación más baja de todos los componentes de la clave, tiene una clasificación de 0:

      • zrank faveGuitarists "Joe Pass"

      Output

      (integer) 0

      Hay otro comando de Redis denominado zrevrank que realiza la misma función que zrank, pero, en su lugar, invierte las clasificaciones de los componentes del conjunto. En el siguiente ejemplo, el componente "Joe Pass" tiene la puntuación más baja y, por lo tanto, la clasificación invertida más alta:

      • zrevrank faveGuitarists "Joe Pass"

      Output

      (integer) 8

      La única relación entre la puntuación de un componente y su clasificación es la posición que ocupa su puntuación en relación con las de otros miembros.  Si hay una brecha de puntuación entre dos componentes secuenciales, no se reflejará en su clasificación. Tenga en cuenta que si dos componentes tienen la misma puntuación, el primero en orden alfabético tendrá la menor clasificación.

      Al igual que zscore, zrank y zrevrank devolverán (nil) si la clave o el componente no existen.

      zlexcount puede indicar la cantidad de componentes que se encuentran en un conjunto ordenado en un intervalo lexicográfico. En el siguiente ejemplo, se utiliza el conjunto ordenado SomervilleSquares de la sección anterior:

      • zlexcount SomervilleSquares [M [t

      Output

      (integer) 5

      Este comando tiene la misma sintaxis que zrangebylex. Por lo tanto, consulte la sección anterior para obtener información detallada sobre cómo definir un intervalo de cadena.

      Eliminar componentes de conjuntos ordenados

      Con el comando zrem, es posible eliminar uno o más componentes de un conjunto ordenado:

      • zrem faveGuitarists "Doug Martsch" "Bola Sete"

      zrem mostrará un entero que indicará la cantidad de componentes que eliminó del conjunto ordenado:

      Output

      (integer) 2

      Hay tres comandos de Redis que le permiten eliminar componentes de un conjunto ordenado basado en un intervalo. Por ejemplo, si todos los componentes de un conjunto ordenado tienen la misma puntuación, puede eliminar componentes sobre la base de un intervalo lexicográfico con zremrangebylex. Este comando utiliza la misma sintaxis que zrangebylex. En el siguiente ejemplo, se eliminarán de la clave SomervilleSquares creada en la sección anterior todos los componentes que comiencen con una letra mayúscula :

      • zremrangebylex SomervilleSquares [A [Z

      zremrangebylex dará como resultado un entero que indica la cantidad de componentes que eliminó:

      Output

      (integer) 3

      También puede eliminar componentes en base a un intervalo de puntuaciones con el comando zremrangebyscore, que utiliza la misma sintaxis que el comando zrangebyscore. En el siguiente ejemplo, se eliminarán todos los componentes de faveGuitarists con una puntuación de 4, 5 o 6:

      • zremrangebyscore faveGuitarists 4 6

      Output

      (integer) 1

      Puede eliminar componentes de un conjunto en base a un intervalo de clasificaciones con el comando zremrangebyrank, que utiliza la misma sintaxis que zrangebyrank. Con el siguiente comando, se eliminarán los tres componentes del conjunto ordenado con las clasificaciones más bajas, que se definen en función de un intervalo de índices basados en cero:

      • zremrangebyrank faveGuitarists 0 2

      Output

      (integer) 3

      Tenga en cuenta que los números que se pasan a remrangebyrank también pueden ser negativos: -1 representa la clasificación más alta, -2 la siguiente y así sucesivamente.

      Crear nuevos conjuntos ordenados a partir de conjuntos existentes

      Redis incluye dos comandos que le permiten comparar componentes de varios conjuntos ordenados y crear conjuntos nuevos sobre la base de esas comparaciones: estos son zinterstore y zunionstore. Para experimentar con ellos, ejecute los siguientes comandos zadd a fin de crear conjuntos ordenados de ejemplo.

      • zadd NewKids 1 "Jonathan" 2 "Jordan" 3 "Joey" 4 "Donnie" 5 "Danny"
      • zadd Nsync 1 "Justin" 2 "Chris" 3 "Joey" 4 "Lance" 5 "JC"

      zinterstore encuentra los componentes que comparten dos o más conjuntos ordenados (en su intersección) y produce un nuevo conjunto ordenado que contiene únicamente estos componentes. Este comando debe incluir, en orden, el nombre de una clave de destino en la que los componentes de la intersección se almacenarán como conjunto ordenado, el número de claves que se pasan a zinterstore y los nombres de las claves que desea analizar:

      • zinterstore BoyBands 2 NewKids Nsync

      zinterstore mostrará un entero que indica la cantidad de elementos almacenados en el conjunto ordenado de destino. Debido a que NewKids y Nsync solo comparten un componente, "Joey", el comando mostrará 1:

      Output

      (integer) 1

      Tenga en cuenta que si la clave de destino ya existe, zinterstore sobrescribirá su contenido.

      zunionstore creará un nuevo conjunto ordenado que contendrá todos los componentes de las claves que se le pasaron. Este comando utiliza la misma sintaxis que zinterstore y requiere el nombre de una clave de destino, la cantidad de claves que se pasan al comando y los nombres de estas:

      • zunionstore SuperGroup 2 NewKids Nsync

      Al igual que zinterstore, zunionstore , mostrará un entero que indica la cantidad de elementos almacenados en la clave de destino. Si bien los dos conjuntos ordenados originales tienen cinco componentes, dado que los conjuntos ordenados no pueden tener componentes repetidos y cada clave tiene un componente denominado "Joey", el entero resultante será 9:

      Output

      (integer) 9

      Al igual que zinterstore, zunionstore sobrescribirá el contenido de la clave de destino si ya existe.

      Para tener más control sobre las puntuaciones de los componentes al crear conjuntos ordenados nuevos con zinterstore y zunionstore, los dos comandos aceptan las opciones WEIGHTS y AGGREGATE.

      La opción WEIGHTS va seguida de un número por cada conjunto ordenado incluido en el comando que pondera o multiplica la puntuación de cada componente. El primer número después de la opción WEIGHTS pondera las puntuaciones de la primera clave que se pasó al comando, el segundo número pondera la segunda y así sucesivamente.

      En el siguiente ejemplo, se crea un nuevo conjunto ordenado que contiene las claves intersecantes de los conjuntos ordenados NewKids y Nsync. Pondera las puntuaciones de la clave de NewKids en un factor de tres y las de la clave de Nsync en un factor de siete:

      • zinterstore BoyBandsWeighted 2 NewKids Nsync WEIGHTS 3 7

      Si la opción WEIGHTS no se incluye, la ponderación por defecto es 1 tanto para zinterstore como para zunionstore.

      AGGREGATE acepta tres subopciones. La primera, SUM, implementa el comportamiento predeterminado de zinterstore y zunionstore añadiendo las puntuaciones de los componentes coincidentes en los conjuntos combinados.

      Si ejecuta una operación zinterstore o zunionstore en dos conjuntos ordenados que comparten un componente, pero este tiene una puntuación diferente en cada conjunto, puede hacer que la operación asigne por la fuerza la menor de las dos puntuaciones en el nuevo conjunto con la subopción MIN.

      • zinterstore BoyBandsWeightedMin 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MIN

      Debido a que los dos conjuntos ordenados solo tienen un componente coincidente con la misma puntuación (3), este comando creará un nuevo conjunto con el componente que tenga la menor de las dos puntuaciones ponderadas:

      • zscore BoyBandsWeightedMin "Joey"

      Output

      "9"

      De la misma manera, AGGREGATE puede forzar zinterstore o zunionstore a asignar la mayor de las dos puntuaciones con la opción MAX:

      • zinterstore BoyBandsWeightedMax 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MAX

      A través de este comando, se crea un nuevo conjunto con un componente, "Joey", que tiene la mayor de las dos puntuaciones ponderadas.

      • zscore BoyBandsWeightedMax "Joey"

      Output

      "21"

      Puede ser útil considerar a WEIGHTS como una alternativa para manipular las puntuaciones de los componentes temporalmente antes de que se analicen. De la misma manera, es útil concebir a la opción AGGREGATE como una opción para decidir cómo controlar las puntuaciones de los componentes antes de añadirlos a sus nuevos conjuntos.

      Conclusión

      En esta guía, se detallan varios comandos que se utilizan para crear y administrar conjuntos ordenados en Redis. Si desea ver en esta guía descripciones de otros comandos, argumentos o procedimientos relacionados, deje sus solicitudes o sugerencias en la sección de comentarios a continuación.

      Para obtener más información sobre los comandos de Redis, consulte nuestra serie de tutoriales Cómo administrar bases de datos de Redis.



      Source link

      Como gerenciar conjuntos ordenados no Redis


      Introdução

      O Redis é um repositório de dados de valor-chave na memória, de código aberto. No Redis, os conjuntos ordenados são um tipo de dados semelhante aos conjuntos, sendo ambos grupos não repetidos de strings. A diferença é que cada membro de um conjunto ordenado está associado a uma pontuação, permitindo que eles sejam ordenados da pontuação menor para a maior. Como nos conjuntos, cada membro de um conjunto ordenado deve ser único, embora vários membros possam compartilhar a mesma pontuação.

      Este tutorial explica como criar conjuntos ordenados, recuperar e remover seus membros e criar novos conjuntos ordenados a partir de dados existentes.

      Como usar este guia

      Este guia foi escrito como uma folha de referências com exemplos independentes. Encorajamos você a ir direto para as seções que sejam relevantes para a tarefa que está tentando completar.

      Os comandos mostrados neste guia foram testados em um servidor Ubuntu 18.04 executando a versão 4.0.9 do Redis. Para configurar um ambiente semelhante, siga o Passo 1 de nosso guia sobre Como instalar e proteger o Redis no Ubuntu 18.04. Vamos demonstrar como esses comandos se comportam executando-os com o redis-cli, a interface de linha de comando do Redis. Note que caso esteja usando uma interface diferente do Redis — Redli, por exemplo — o resultado exato de certos comandos pode diferir.

      De maneira alternativa, você pode provisionar uma instância de banco de dados gerenciado do Redis para testar esses comandos, mas note que, dependendo do nível de controle permitido pelo seu provedor de banco de dados, alguns comandos neste guia podem não funcionar como descrito. Para provisionar um Banco de dados gerenciado pela DigitalOcean siga nossa documentação do produto Bancos de dados gerenciados. Em seguida, você deve instalar o Redli ou configurar um túnel TLS para se conectar ao Banco de dados gerenciado através do TLS.

      Como criar conjuntos ordenados e adicionar membros

      Para criar um conjunto ordenado, use o comando zadd. O zadd aceita como argumentos o nome da chave que conterá o conjunto ordenado, seguido da pontuação do membro que você está adicionando, e do valor do membro em si. O comando a seguir criará uma chave ordenada chamada faveGuitarists com um membro, "Joe Pass", que tem uma pontuação de 1:

      • zadd faveGuitarists 1 "Joe Pass"

      O zadd retornará um número inteiro que indica a quantidade de membros que foram adicionados ao conjunto ordenado caso tenha sido criado com sucesso.

      Output

      (integer) 1

      É possível adicionar mais de um membro a um conjunto ordenado com o zadd. Note que suas pontuações não precisam ser sequenciais, podem haver lacunas entre as pontuações e vários membros mantidos no mesmo conjunto ordenado podem compartilhar a mesma pontuação:

      • zadd faveGuitarists 4 "Stephen Malkmus" 2 "Rosetta Tharpe" 3 "Bola Sete" 3 "Doug Martsch" 8 "Elizabeth Cotten" 12 "Nancy Wilson" 4 "Memphis Minnie" 12 "Michael Houser"

      Output

      (integer) 8

      O zadd pode aceitar as seguintes opções, que você deve digitar após o nome de chave e antes da primeira pontuação de membro:

      • NX ou XX: essas opções têm efeitos opostos, de modo que você só pode incluir uma delas em qualquer operação do zadd:
        • NX: diz ao zadd para não atualizar os membros existentes. Com essa opção, o zadd adicionará apenas novos elementos.
        • XX: diz ao zadd para atualizar apenas os elementos existentes. Com essa opção, o zadd nunca adicionará novos membros.
      • CH: normalmente, o zadd retorna apenas o número de novos elementos adicionados ao conjunto ordenado. Com essa opção incluída, no entanto, o zadd retornará o número de elementos alterados. Isso inclui os novos membros e membros cujas pontuações foram alteradas.
      • INCR: isso faz o comando aumentar o valor de pontuação do membro. Caso o membro ainda não exista, o comando o adicionará ao conjunto ordenado com o incremento como sendo sua pontuação, como se sua pontuação inicial fosse 0. Com o INCR incluído, o zadd retornará a nova pontuação do membro caso seja bem-sucedido. Note que você pode incluir apenas um par de pontuação/membro por vez ao usar essa opção.

      Ao invés de passar a opção INCR para o zadd, você pode, de forma alternativa, usar o comando do zincrby, que se comporta da mesma maneira. Ao invés de dar ao membro do conjunto ordenado o valor indicado pelo valor de pontuação como o zadd, ele aumentará a pontuação do membro por aquele valor. Por exemplo, o seguinte comando incrementa a pontuação do membro "Stephen Malkmus", que era originalmente 4, em 5 até 9.

      • zincrby faveGuitarists 5 "Stephen Malkmus"

      Output

      "9"

      Como acontece com a opção INCR do comando zadd, caso o membro especificado não exista, então o zincrby o criará com o valor do incremento como sua pontuação.

      Como recuperar os membros de conjuntos ordenados

      A maneira mais fundamental de recuperar os membros mantidos dentro de um conjunto ordenado é usar o comando zrange Esse comando aceita como argumentos o nome da chave cujos membros você deseja recuperar e uma faixa de membros mantidos dentro dela. A faixa é definida por dois números que representam indexações baseadas em zero, ou seja, se 0 representa o primeiro membro no conjunto ordenado (ou, o membro com a pontuação mais baixa), 1 representa o seguinte, e assim por diante.

      O exemplo a seguir retornará os primeiros quatro membros do conjunto ordenado faveGuitarists, criado na seção anterior:

      • zrange faveGuitarists 0 3

      Output

      1) "Joe Pass" 2) "Rosetta Tharpe" 3) "Bola Sete" 4) "Doug Martsch"

      Note que, caso o conjunto ordenado que você passa para o zrange tenha dois ou mais elementos que compartilham a mesma pontuação, ele ordenará esses elementos em ordem lexicográfica ou alfabética.

      As indexações de início e parada podem também ser números negativos, com -1 representando o último membro, -2 representando o penúltimo, e assim por diante:

      • zrange faveGuitarists -5 -2

      Output

      1) "Memphis Minnie" 2) "Elizabeth Cotten" 3) "Stephen Malkmus" 4) "Michael Houser"

      O zrange pode aceitar o argumento WITHSCORES que, quando incluído, também retornará as pontuações dos membros:

      • zrange faveGuitarists 5 6 WITHSCORES

      Output

      1) "Elizabeth Cotten" 2) "8" 3) "Stephen Malkmus" 4) "9"

      O zrange só pode retornar uma faixa de membros em uma ordem numérica ascendente. Para reverter isso e retornar uma faixa em ordem descendente, você deve usar o comando zrevrange. Pense neste comando como sendo uma inversão temporária da ordem do conjunto ordenado, antes de retornar os membros que se situam dentro da faixa especificada. Assim, com o zrevrange, o 0 representará o último membro mantido na chave, 1 representará o penúltimo, e assim por diante:

      • zrevrange faveGuitarists 0 5

      Output

      1) "Nancy Wilson" 2) "Michael Houser" 3) "Stephen Malkmus" 4) "Elizabeth Cotten" 5) "Memphis Minnie" 6) "Doug Martsch"

      O zrevrange também pode aceitar a opção WITHSCORES.

      É possível retornar uma faixa de membros com base nas suas pontuações com o comando zrangebyscore. No exemplo a seguir, o comando retornará todos os membros mantidos na chave faveGuitarists com uma pontuação de 2, 3, ou 4:

      • zrangebyscore faveGuitarists 2 4

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch" 4) "Memphis Minnie"

      A faixa é inclusiva neste exemplo, o que significa que ela retornará os membros com pontuações de 2 ou 4. É possível excluir qualquer extremidade da faixa, precedendo-a com um parêntese aberto ((). O exemplo a seguir retornará todos os membros com uma pontuação maior ou igual a 2, mas inferior a 4:

      • zrangebyscore faveGuitarists 2 (4

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch"

      Assim como com o zrange, o zrangebyscore pode aceitar o argumento WITHSCORES. Ele também aceita a opção LIMIT, que você pode usar para recuperar apenas uma seleção de elementos do resultado do zrangebyscore. Essa opção aceita uma referência, que marca o primeiro membro na faixa que o comando retornará e uma contagem, que define a quantidade de membros que o comando retornará no total. Por exemplo, o seguinte comando analisará os primeiros seis membros do conjunto ordenado faveGuitarists, mas retornará apenas três membros a partir dele, começando pelo segundo membro na faixa, representado por 1:

      • zrangebyscore faveGuitarists 0 5 LIMIT 1 3

      Output

      1) "Rosetta Tharpe" 2) "Bola Sete" 3) "Doug Martsch"

      O comando zrevrangebyscore retorna uma faixa invertida de membros com base nas suas pontuações. O seguinte comando retorna todos os membros do conjunto com uma pontuação entre 10 e 6:

      • zrevrangebyscore faveGuitarists 10 6

      Output

      1) "Stephen Malkmus" 2) "Elizabeth Cotten"

      Assim como com o zrangebyscore, o zrevrangebyscore pode aceitar as opções WITHSCORES e LIMIT. Além disso, você pode excluir qualquer uma das extremidades da faixa, precedendo-a com um parêntese aberto.

      Pode haver situações em que todos os membros em um conjunto ordenado tenham a mesma pontuação. Em tais casos, você pode forçar o redis a retornar uma faixa de elementos ordenados lexicograficamente, ou em ordem alfabética, com o comando do zrangebylex. Para testar este comando, execute o seguinte comando zadd para criar um conjunto ordenado, onde cada membro tenha a mesma pontuação:

      • zadd SomervilleSquares 0 Davis 0 Inman 0 Union 0 porter 0 magoun 0 ball 0 assembly

      O zrangebylex deve ser seguido pelo nome de uma chave, um intervalo de início e um intervalo de parada. Os intervalos de início e parada devem começar com um parêntese aberto (() ou um colchete aberto ([), como isto:

      • zrangebylex SomervilleSquares [a [z

      Output

      1) "assembly" 2) "ball" 3) "magoun" 4) "porter"

      Note que este exemplo retornou apenas quatro dos oito membros no conjunto, apesar do comando ter procurado uma faixa de a a z. Isso aconteceu porque os valores do Redis são sensíveis ao caso, de modo que os membros que começam em letra maiúscula foram excluídos do resultado. Para retornar, execute o seguinte:

      • zrangebylex SomervilleSquares [A [z

      Output

      1) "Davis" 2) "Inman" 3) "Union" 4) "assembly" 5) "ball" 6) "magoun" 7) "porter"

      O zrangebylex também aceita o caractere especial - que representam o infinito negativo e o +, que representa o infinito positivo. Assim, a sintaxe de comando a seguir retornará todos os membros do conjunto ordenado:

      • zrangebylex SomervilleSquares - +

      Note que o zrangebylex não pode retornar os membros do conjunto ordenado em uma ordem lexicográfica inversa (alfabética ascendente). Para fazer isso, use o zrevrangebylex:

      • zrevrangebylex SomervilleSquares + -

      Output

      1) "porter" 2) "magoun" 3) "ball" 4) "assembly" 5) "Union" 6) "Inman" 7) "Davis"

      Como ele é destinado a ser usado com conjuntos ordenados em que cada membro tem a mesma pontuação, o zrangebylex não aceita a opção WITHSCORES. No entanto, ele aceita a opção LIMIT.

      Como recuperar informações sobre conjuntos ordenados

      Para descobrir a quantidade de membros em um conjunto ordenado determinado (ou, em outras palavras, para determinar sua cardinalidade), use o comando zcard. O exemplo a seguir mostra a quantidade de membros sendo mantidos na chave faveGuitarists, da primeira seção deste guia:

      Output

      (integer) 9

      O zcount pode dizer a você a quantidade de elementos sendo mantidos dentro de um determinado conjunto ordenado, que se situam dentro de uma faixa de pontuações. O primeiro número que vem após a chave é o início da faixa e o segundo é o final da faixa:

      • zcount faveGuitarists 3 8

      Output

      (integer) 4

      O zscore mostra como resultado a pontuação de um membro especificado de um conjunto ordenado:

      • zscore faveGuitarists "Bola Sete"

      Output

      "3"

      Caso o membro ou a chave especificada não exista, o zscore retornará (nil).

      O zrank é semelhante ao zscore, mas, ao invés de retornar a pontuação de um determinado membro, ele retorna a classificação dele. No Redis, a classificação é um índice de base zero dos membros de um conjunto, ordenado pelas pontuações. Por exemplo, "Joe Pass" tem uma pontuação de 1, mas, como essa é a pontuação mais baixa de qualquer membro na chave, ele tem uma classificação de 0:

      • zrank faveGuitarists "Joe Pass"

      Output

      (integer) 0

      Há outro comando chamado zrevrank que executa a mesma função que o zrank, mas, de maneira contrária, inverte as classificações dos membros no conjunto. No exemplo a seguir, o membro "Joe Pass" tem a pontuação mais baixa, tendo, portanto, a classificação inversa mais elevada:

      • zrevrank faveGuitarists "Joe Pass"

      Output

      (integer) 8

      A única relação entre a pontuação de um membro e a classificação dele é onde sua pontuação fica em relação à de outros membros. Caso haja uma diferença de pontuação entre dois membros sequenciais, isso não será refletido em sua classificação. Note que, caso dois membros tenham a mesma pontuação, aquele que vem primeiro na ordem alfabética, terá a classificação inferior.

      Assim como o zscore, o zrank e zrevrank retornarão (nil) caso a chave ou o membro não exista.

      O zlexcount pode dizer a você a quantidade de membros mantida em um conjunto ordenado em uma faixa lexicográfica. O exemplo a seguir utiliza o conjunto ordenado do SomervilleSquares da seção anterior:

      • zlexcount SomervilleSquares [M [t

      Output

      (integer) 5

      Esse comando segue a mesma sintaxe que o comando zrangebylex, portanto, consulte a seção anterior para mais detalhes sobre como definir uma faixa de strings.

      Como remover os membros de conjuntos ordenados

      O comando zrem pode remover um ou mais membros de um conjunto ordenado:

      • zrem faveGuitarists "Doug Martsch" "Bola Sete"

      O zrem retornará um número inteiro, indicando a quantidade de membros removidos do conjunto ordenado:

      Output

      (integer) 2

      Há três comandos do Redis que permitem que você remova os membros de um conjunto ordenado com base em uma faixa. Por exemplo, caso cada membro em um conjunto ordenado tenha a mesma pontuação, remova os membros com base em uma faixa lexicográfica com o zremrangebylex. Esse comando utiliza a mesma sintaxe que o zrangebylex. O exemplo a seguir removerá todos os membros que começam com uma letra maiúscula da chave SomervilleSquares criada na seção anterior:

      • zremrangebylex SomervilleSquares [A [Z

      O zremrangebylex dará como resultado um número inteiro, indicando a quantidade de membros que ele removeu:

      Output

      (integer) 3

      Você também pode remover os membros com base em uma faixa de pontuações com o comando zremrangebyscore, que utiliza a mesma sintaxe que o comando zrangebyscore. O exemplo a seguir removerá todos os membros mantidos em faveGuitarists com uma pontuação de 4, 5, ou 6:

      • zremrangebyscore faveGuitarists 4 6

      Output

      (integer) 1

      Você pode remover os membros de um conjunto com base em uma faixa de classificações com o comando zremrangebyrank, que utiliza a mesma sintaxe que o zrangebyrank. O comando a seguir removerá os três membros do conjunto ordenado com as classificações mais baixas, que são definidas por uma faixa de indexações com base zero:

      • zremrangebyrank faveGuitarists 0 2

      Output

      (integer) 3

      Note que os números passados para o remrangebyrank também podem ser negativos, com -1 representando a classificação mais alta, -2 a segunda mais alta e assim por diante.

      Como criar novos conjuntos ordenados a partir de outros existentes

      O Redis inclui dois comandos que permitem que você compare os membros de vários conjuntos ordenados e crie novos com base nessas comparações: o zinterstore e o zunionstore. Para testar esses comandos, execute os comandos zadd a seguir para criar alguns exemplos de conjuntos ordenados.

      • zadd NewKids 1 "Jonathan" 2 "Jordan" 3 "Joey" 4 "Donnie" 5 "Danny"
      • zadd Nsync 1 "Justin" 2 "Chris" 3 "Joey" 4 "Lance" 5 "JC"

      O zinterstore encontra os membros compartilhados por dois ou mais conjuntos ordenados — sua intersecção — e produz um novo conjunto ordenado que contenha apenas esses membros. Esse comando deve incluir, em ordem, o nome de uma chave de destino onde os membros da intersecção serão armazenados como um conjunto ordenado, o número de chaves sendo passadas para o zinterstore e os nomes das chaves que você quer analisar:

      • zinterstore BoyBands 2 NewKids Nsync

      O zinterstore retornará um número inteiro que mostra o número de elementos armazenados no conjunto ordenado de destino. Como NewKids e Nsync compartilham apenas um membro, "Joey", o comando retornará 1:

      Output

      (integer) 1

      Esteja ciente de que, caso a chave de destino já exista, o zinterstore irá sobrescrever o conteúdo dela.

      O zunionstore criará um novo conjunto ordenado que possui todos os membros das chaves passadas a ele. Este comando utiliza a mesma sintaxe que o zinterstore e exige o nome de uma chave de destino, o número de chaves sendo passadas para o comando e os nomes das chaves:

      • zunionstore SuperGroup 2 NewKids Nsync

      Assim como o zinterstore, o zunionstore retornará um número inteiro, mostrando o número de elementos armazenados na chave de destino. Embora ambos os conjuntos ordenados originais tivessem cinco membros, como os conjuntos ordenados não podem ter membros repetidos e cada chave tem um membro chamado "Joey", o número inteiro resultante será 9:

      Output

      (integer) 9

      Assim como o zinterstore, o zunionstore irá sobrepor o conteúdo da chave de destino, caso já exista.

      Para dar mais controle sobre as pontuações dos membros ao criar novos conjuntos ordenados com o zinterstore e zunionstore, ambos esses comandos aceitam as opções WEIGHTS e AGGREGATE.

      A opção WEIGHTS vem seguida de um número para cada conjunto ordenado incluído no comando que pesa, ou multiplica, as pontuações de cada membro. O primeiro número após a opção WEIGHTS pesa as pontuações da primeira chave enviadas para o comando, o segundo número pesa a segunda chave, e assim por diante.

      O exemplo a seguir cria um conjunto ordenado novo, que possui as chaves em intersecção dos conjuntos ordenados NewKids e Nsync. Ele pesa as pontuações na chave NewKids por um fator de três e pesa as que estão na chave Nsync por um fator de sete:

      • zinterstore BoyBandsWeighted 2 NewKids Nsync WEIGHTS 3 7

      Caso a opção WEIGHTS não seja incluída, a pesagem assume o padrão 1 para o zinterstore e o zunionstore.

      O AGGREGATE aceita três subopções. O primeiro deles, SUM, implementa o comportamento padrão do zinterstore e do zunionstore, adicionando as pontuações de membros correspondentes nos conjuntos combinados.

      Caso execute uma operação zinterstore ou zunionstore em dois conjuntos ordenados que partilham um membro, mas este membro tem uma pontuação diferente em cada conjunto, você pode forçar a operação a atribuir a menor das duas pontuações no novo conjunto com a subopção MIN.

      • zinterstore BoyBandsWeightedMin 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MIN

      Como os dois conjuntos ordenados têm apenas um membro correspondente com a mesma pontuação (3), este comando criará um novo conjunto com um membro que tem o menor das duas pontuações ponderadas:

      • zscore BoyBandsWeightedMin "Joey"

      Output

      "9"

      De maneira similar, o AGGREGATE pode forçar o zinterstore ou zunionstore a atribuir a maior das duas pontuações com a opção MAX:

      • zinterstore BoyBandsWeightedMax 2 NewKids Nsync WEIGHTS 3 7 AGGREGATE MAX

      Esse comando cria um novo conjunto com um membro, "Joey", que tem a mais alto das duas pontuações ponderadas:

      • zscore BoyBandsWeightedMax "Joey"

      Output

      "21"

      É útil pensar em WEIGHTS como uma maneira de manipular temporariamente as pontuações dos membros antes de serem analisadas. De maneira similar, é útil pensar na opção AGGREGATE como uma forma de decidir como controlar as pontuações dos membros antes de serem adicionadas aos seus novos conjuntos.

      Conclusão

      Esse guia detalha vários comandos usados para criar e gerenciar conjuntos ordenados no Redis. Caso haja outros comandos, argumentos ou procedimentos relacionados que você gostaria de ver apresentados neste guia, faça perguntas ou sugestões nos comentários abaixo.

      Para obter mais informações sobre os comandos do Redis, consulte nossa série de tutoriais sobre Como gerenciar um banco de dados Redis.



      Source link