sql >> Database >  >> NoSQL >> Redis

nodejs, redis. controleer of sleutels bestaan ​​en maak nieuwe aan als dat niet het geval is

Er zijn ten minste twee problemen in deze code:

  • de eerste is gekoppeld aan Javascript-afsluitingsbeheer. Het lichaam van een lus creëert geen bereik. Met Javascript is het bereik van variabelen op functieniveau, niet op blokniveau. U moet een functie in de lus zelf introduceren om het creëren van een goede sluiting af te dwingen. Meer informatie hier.

  • de tweede is een race-conditie tussen de bestaande en ingestelde commando's. Als er meerdere Redis-verbindingen actief zijn en commando's op dezelfde toetsen worden ingesteld, zult u waarschijnlijk een soort van conflicten hebben. In plaats van exist en set te gebruiken, moet u setnx gebruiken die de controle en set in één atomaire bewerking uitvoert.

Gezien uw tweede voorbeeld, is het sluitingsprobleem opgelost door forEach te gebruiken, maar u genereert nog steeds alle get-bewerkingen vóór de set-bewerkingen vanwege de asynchrone aard van de taal.

Als je echt al je get- en set-bewerkingen wilt sequencen (wat trouwens veel langzamer zal zijn), dan kun je een beetje functioneel programmeren gebruiken om de lus te implementeren met behulp van recursie.

Voorbeeld :

Dit programma:

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)

geeft weer:

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

Merk op dat de raceconditie nog steeds aanwezig is in dit voorbeeld. Het is de bedoeling dat je setnx gebruikt om dit soort controle- en setbewerkingen te implementeren.




  1. Hoe haal je alle sleutels die overeenkomen met een specifiek patroon uit een hash in redis?

  2. mongodb kon geen verbinding maken met de server

  3. C#/.NET Client voor Redis

  4. Bespotten van database in node.js?