Redis setnx

Redis setnx

Tipo de datos de cadena redis

Redis es un almacén de datos en memoria que admite estructuras de datos más complejas en comparación con otras tiendas de datos de valor clave. Entre todas estas estructuras de datos complejas, como conjuntos, hashes, mapas de bits y listas, también admite los tipos de cadenas más sencillos. En ese caso, una tecla de cadena se mapea a un valor de cadena. Por lo general, los comandos SET y GET se utilizan para crear y obtener datos de valor clave desde la tienda Redis. Además, el comando set crea una nueva clave en la memoria y me asigna un valor de cadena, nada más que eso. Sobrescribirá el valor si la clave ya existe.

No se implementa ningún mecanismo de seguridad con el comando SET de forma predeterminada para manejar las mutaciones de valor por varios clientes sin acuerdo mutuo. Este comando debe llamarse con mediciones de seguridad en su lugar, como un mecanismo de bloqueo.

Establecer un valor clave condicionalmente

Siempre es mejor seguir una medida de seguridad al mutar un valor que se almacena en una clave dada. Por lo tanto, Redis ha introducido una opción para el comando establecer Nx que está en su lugar y no mutará el valor de una clave ya existente. El mismo comportamiento se ha implementado con un nuevo comando que se explica en la siguiente sección.

El comando setnx

El comando setnx, como su nombre sugiere, "establecido si no existe " lo que significa que el comando solo establecerá un valor si y solo si la clave especificada no existe en el almacén de datos. Siempre que la clave especificada ya exista, el comando no realizará ninguna operación en esa clave. Con esa restricción, el comando setnx es más seguro que el comando set. Además, este comando tiene una complejidad de tiempo constante.

Sintaxis:

Valor setnx redis_key

Redis_key: El identificador único de una entrada de par de valores clave Redis.

valor: El valor asociado con la clave Redis.

Este comando devolverá una respuesta entera donde la clave de 1 medios se ha establecido con un nuevo valor. Si el valor devuelto es 0, la clave no está configurada y la clave existente contendrá el valor anterior.

Ejemplo 01 - Mecanismo de bloqueo con SETNX

Supongamos un juego en línea donde varios jugadores accederán a un cubo de oro común propiedad de su equipo. Los jugadores pueden acceder al cubo de oro y llenarlo con el oro que han encontrado explorando el mundo. Imagine que el jugador uno accede al cubo de oro y deja un poco de oro en un período fijo. Al mismo tiempo, el jugador dos intenta consumir algo de oro del mismo cubo. En ese caso, el acceso no debe entregarse al jugador dos hasta que el jugador uno libera el cubo de oro. Esto se puede implementar con el comando setnx con un mecanismo de bloqueo simple.

El Jugador 1 puede usar el comando setnx para establecer la cantidad total de oro en el balde. Supongamos que vamos a almacenar la cantidad de oro en la llave Goldbucket.

setnx Goldbucket 100

Como se esperaba, el Goldbucket La clave se ha creado con un valor de 100. Ahora, Jugador 1 tiene la cerradura. Digamos Jugador: 2 va a llamar al comando setnx para establecer la nueva cantidad de oro.

setnx Goldbucket 200

Esta vez el comando devuelve 0 porque la clave Goldbucket existe. En otras palabras, la tecla está bloqueada por el Jugador 1 ya. Por lo tanto, el jugador: 2 tiene que esperar hasta que el jugador: 1 libera el bloqueo eliminando o el tiempo de espera automático.

Verifiquemos el valor asociado con el Goldbucket clave, como se muestra en lo siguiente.

Obtener Goldbucket

Como se esperaba, el valor sigue siendo 100, lo que significa el Jugador 1 ya ha bloqueado el valor de los datos. Por eso, Jugador: 2 necesita seguir esperando hasta que expire el tiempo de espera y Jugador 1 lo libera.

Puede haber una situación de punto muerto si el cliente se bloquea o falla debido a una falla de la red y el cliente no ha lanzado el bloqueo. Múltiples clientes pueden notar esto e intentar eliminar el bloqueo utilizando el comando Del. Como resultado, cada cliente eliminará sus propias claves repetidamente, lo que conducirá a un punto muerto.

Se puede resolver al verificar cada cliente la marca de tiempo por adelantado usando el comando getSet y luego adquirir el bloqueo usando el comando setnx si y solo si la marca de tiempo está expirada.

Conclusión

Para resumir, Redis es un almacén de valor clave que admite los tipos de datos de cadena más simples entre las otras estructuras de datos complejas como hashes, conjuntos, mapas de bits y listas. Como todos saben, establecer y obtener son los comandos más básicos que se pueden usar para crear y obtener pares de valores clave Redis. El método establecido se utiliza para crear pares de valor clave en la base de datos de Redis que eventualmente sobrescribe el valor asociado para una clave especificada si la clave ya existe en la base de datos. Como se destacó anteriormente en el artículo, esta mutación de valor inseguro se puede restringir con el comando Redis setNX. El comando setnx establece el valor para una clave dada si la tecla aún no existe. Siempre que exista una clave, el comando no realiza nada y devuelve 0. Por lo tanto, el comando setNX se utiliza para implementar mecanismos de bloqueo en aplicaciones en tiempo real.