sql >> Database teknologi >  >> NoSQL >> Redis

nodejs, redis. tjek om der findes nøgler og opret nye hvis ikke

Der er mindst to problemer i denne kode:

  • den første er knyttet til Javascript-lukningsstyring. En løkkes krop skaber ikke et omfang. Med Javascript er omfanget af variabler på funktionsniveau, ikke blokniveau. Du skal indføre en eller anden funktion i selve løkken for at gennemtvinge oprettelsen af ​​en ordentlig lukning. Mere information her.

  • den anden er en racetilstand mellem de eksisterende og de indstillede kommandoer. Hvis du har flere Redis-forbindelser kørende og indstiller kommandoer på de samme taster, vil du sandsynligvis have en form for konflikter. I stedet for at bruge exists og set, bør du bruge setnx, som udfører kontrollen og set i én atomoperation.

I betragtning af dit andet eksempel er lukningsproblemet blevet løst ved at bruge forEach, men du genererer stadig alle get-operationer før de indstillede operationer på grund af sprogets asynkrone natur.

Hvis du virkelig ønsker at sekvensere alle dine get- og set-operationer (som vil være meget langsommere forresten), så kan du bruge lidt funktionel programmering til at implementere løkken ved hjælp af rekursion.

Eksempel :

Dette 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)

viser:

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

Bemærk, at racebetingelsen stadig er til stede i dette eksempel. Det er meningen, at du skal bruge setnx til at implementere denne form for kontrol og sæt operationer.




  1. Sådan konverteres Redis-dato til R

  2. Hvordan får man array fra mongoDB-samlingen?

  3. Problemer med at køre eksempler i Meteor

  4. Flere Redis-forekomster