sql >> Databasteknik >  >> NoSQL >> Redis

nodejs, redis. kontrollera om nycklar finns och skapa nya om inte

Det finns minst två problem i den här koden:

  • den första är kopplad till Javascript-stängningshantering. En loops kropp skapar inte ett omfång. Med Javascript är omfattningen av variabler på funktionsnivå, inte blocknivå. Du måste införa någon funktion i själva slingan för att genomdriva skapandet av en ordentlig stängning. Mer information här.

  • den andra är ett rasvillkor mellan existens- och set-kommandona. Om du har flera Redis-anslutningar igång och ställer in kommandon på samma nycklar, kommer du sannolikt att ha någon form av konflikter. Istället för att använda exists och set, bör du använda setnx som utför kontrollen och set i en atomär operation.

Med tanke på ditt andra exempel har stängningsproblemet åtgärdats genom att använda forEach, men du genererar fortfarande alla get-operationer före inställningsoperationerna på grund av språkets asynkrona natur.

Om du verkligen vill sekvensera alla dina get- och set-operationer (vilket kommer att vara mycket långsammare btw), så kan du använda lite funktionell programmering för att implementera slingan med hjälp av rekursion.

Exempel :

Detta program:

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)

visar:

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

Observera att rasvillkoret fortfarande finns i detta exempel. Du ska använda setnx för att implementera den här typen av kontroll- och inställningsoperationer.




  1. Kombinera två Redis-instanser till en enda instans med två dbs

  2. Jag försöker köra mongod server på ubuntu :undantag i initAndListen:29 Datakatalogen /data/db hittades inte., avslutas

  3. Hur man bygger en URL Shortener med Node.js och MongoDB

  4. Till vilken nivå låser MongoDB skrivningar? (eller:vad betyder det per anslutning