sql >> Base de Datos >  >> NoSQL >> Redis

nodejs, redis. compruebe si existen claves y cree nuevas si no

Hay al menos dos problemas en este código:

  • el primero está vinculado a la gestión de cierre de Javascript. El cuerpo de un bucle no crea un alcance. Con Javascript, el alcance de las variables está a nivel de función, no a nivel de bloque. Debe introducir alguna función en el bucle mismo para forzar la creación de un cierre adecuado. Más información aquí.

  • la segunda es una condición de carrera entre los comandos exist y set. Si tiene varias conexiones de Redis en ejecución y establece comandos en las mismas teclas, es probable que tenga algún tipo de conflicto. En lugar de usar exist y set, debe usar setnx, que realiza la verificación y el set en una operación atómica.

Teniendo en cuenta su segundo ejemplo, el problema de cierre se ha solucionado mediante el uso de forEach, pero todavía genera todas las operaciones de obtención antes de las operaciones de establecimiento debido a la naturaleza asíncrona del lenguaje.

Si realmente desea secuenciar todas sus operaciones get y set (que serán mucho más lentas por cierto), entonces puede usar un poco de programación funcional para implementar el bucle usando la recursividad.

Ejemplo :

Este programa:

var redis = require('redis')
var rc = redis.createClient(6379, 'localhost');

var tags = [
  "apple",
  "tiger",
  "mouse",
  "apple",
  "apple",
  "apple",
  "tiger",
  "mouse",
  "mouse",
];

var count = 0;

function loop(tags) {
  function rec_loop(tags,i) {
     if ( i >= tags.length )
        return
     rc.get("tag:"+tags[i],function(err,rr) {
        console.log("get tag "+tags[i]+" result code "+rr);
        if ( rr == null ) {
           rc.set("tag:"+tags[i],"info",function(err,rr) {
              count++;
              console.log('set tag '+tags[i]+' '+rr+' objects count '+count);
              rec_loop(tags,++i)
           })
        } else
          rec_loop(tags,++i)
     })
  }
  rec_loop(tags,0)
}

loop(tags)

muestra:

get tag apple result code null
set tag apple OK objects count 1
get tag tiger result code null
set tag tiger OK objects count 2
get tag mouse result code null
set tag mouse OK objects count 3
get tag apple result code info
get tag apple result code info
get tag apple result code info
get tag tiger result code info
get tag mouse result code info
get tag mouse result code info

Tenga en cuenta que la condición de carrera todavía está presente en este ejemplo. Se supone que debes usar setnx para implementar este tipo de operaciones de verificación y configuración.