Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

nodejs, redis. verifique se as chaves existem e crie novas se não


Há pelo menos dois problemas neste código:

  • o primeiro está ligado ao gerenciamento de fechamento de Javascript. O corpo de um loop não cria um escopo. Com Javascript, o escopo das variáveis ​​está no nível da função, não no nível do bloco. Você precisa introduzir alguma função no próprio loop para impor a criação de um encerramento adequado. Mais informações aqui.

  • a segunda é uma condição de corrida entre os comandos exist e set. Se você tiver várias conexões Redis em execução e definir comandos nas mesmas chaves, provavelmente terá algum tipo de conflito. Em vez de usar exist e set, você deve usar setnx que executa a verificação e define em uma operação atômica.

Considerando seu segundo exemplo, o problema de encerramento foi corrigido usando forEach, mas você ainda gera todas as operações get antes das operações set devido à natureza assíncrona da linguagem.

Se você realmente deseja sequenciar todas as suas operações get e set (que serão muito mais lentas), então você pode usar um pouco de programação funcional para implementar o loop usando recursão.

Exemplo :

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)

exibe:
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

Observe que a condição de corrida ainda está presente neste exemplo. Você deve usar setnx para implementar esse tipo de verificação e operações de configuração.