sql >> Databáze >  >> NoSQL >> Redis

nodejs, redis. zkontrolujte, zda klíče existují, a pokud ne, vytvořte nové

V tomto kódu jsou nejméně dva problémy:

  • první je spojen se správou uzavření Javascriptu. Tělo smyčky nevytváří rozsah. U Javascriptu je rozsah proměnných na úrovni funkcí, nikoli na úrovni bloku. Musíte zavést nějakou funkci v samotné smyčce, abyste vynutili vytvoření správného uzavření. Více informací zde.

  • druhý je spor mezi příkazy exist a set. Pokud máte několik spuštěných připojení Redis a nastavujete příkazy na stejné klávesy, pravděpodobně budete mít nějaké konflikty. Místo použití exists a set byste měli použít setnx, které provedou kontrolu a nastavení v jedné atomické operaci.

Vzhledem k vašemu druhému příkladu byl problém s uzavřením vyřešen použitím forEach, ale stále generujete všechny operace get před operacemi set kvůli asynchronní povaze jazyka.

Pokud opravdu chcete sekvenovat všechny své get a set operace (které budou mimochodem mnohem pomalejší), pak můžete použít trochu funkčního programování k implementaci smyčky pomocí rekurze.

Příklad :

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

zobrazí:

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

Všimněte si, že spor je v tomto příkladu stále přítomen. K implementaci tohoto druhu operací kontroly a nastavení byste měli použít setnx.




  1. Laravel 5.1 Session a Socket.IO + Redis – Odesílání upozornění přihlášeným (známým) uživatelům a skupině uživatelů

  2. Jak nasadit Percona Server pro MongoDB pro vysokou dostupnost

  3. MongoDB Vztah jeden k mnoha

  4. mongodb $exists vždy vrací 0