복붙노트

[REDIS] nodejs, 레디 스. 키가 존재하는지 확인하고 새하지 않을 경우 생성

REDIS

nodejs, 레디 스. 키가 존재하는지 확인하고 새하지 않을 경우 생성

나는 nodejs에 새로 온 사람과 어쩌면 그것이 작동하는 방법을 이벤트 시스템을 가지고하지 않습니다. 버그를 찾을 수 없습니다. 제발 조언. 나는 간단한 작업을 필요 - 확인을 태그에 대한이 존재하지 않는 경우, 태그에 대한 새 키와 정보를 설정합니다. 문제는 - 나는 처음 스크립트를 실행, 그것은 반환 '키가없는 존재'항상. redisdb 키를 확인합니다 - 그것은 많은 태그를 생성 여기 내 코드입니다

for (x = 0; x < rows.length; x++) {
    if (rows[x].term_taxonomy_id != 1) {
        var taxonomy = findOne(rterms, rows[x].term_taxonomy_id);
        rc.exists('tag:' + taxonomy.name, function (err, rexists) {
            if (rexists == false) {
                rc.incr('tags:count', function (err, id) {
                    console.log(taxonomy.name+' not exists. result ' + rexists);
                    rc.set('tag:' + taxonomy.name,id);
                    rc.hmset('tag:' + id,
                        'id', id,
                        'title',taxonomy.name,
                        'url', taxonomy.slug
                    );
                });//incr
            }else{
                console.log(taxonomy.name+' exists!'+rexists);
            };
        });//exists
    };//ifrows
});

여기에 또 다른 하나의 예는

var tags = [
  "apple",
  "tiger",
  "mouse",
  "apple",
  "apple",
  "apple",
  "tiger",
  "mouse",
  "mouse",
];
var count =0;
Object.keys(tags).forEach (function (tag) {
  rc.get("tag:"+tags[tag],function(err,rr){
    console.log("get tag "+tags[tag]+" result code "+rr);
    if (rr == null) {
      rc.set("tag:"+tags[tag],"info",function(err,rr){
        count++;
        console.log('set tag '+tags[tag]+' '+rr+' objects count '+count);
      });
    };
  });
})

출력 :

get tag apple result code null
get tag tiger result code null
get tag mouse result code null
get tag apple result code null
get tag apple result code null
get tag apple result code null
get tag tiger result code null
get tag mouse result code null
get tag mouse result code null
set tag apple OK objects count 1
set tag tiger OK objects count 2
set tag mouse OK objects count 3
set tag apple OK objects count 4
set tag apple OK objects count 5
set tag apple OK objects count 6
set tag tiger OK objects count 7
set tag mouse OK objects count 8
set tag mouse OK objects count 9

nodejs이 실행처럼 보이는 모든 '수'명령과 해당 '설정'명령 후. 그래서 ... 내가 이해, 모든 때문에 비동기 작업입니다. 그러나 어떻게 작동되도록하려면?

해결법

  1. ==============================

    1.이 코드에서 적어도 두 가지 문제가 있습니다 :

    이 코드에서 적어도 두 가지 문제가 있습니다 :

    두 번째 예를 고려, 폐쇄 문제는 대해 forEach를 사용하여 수정되었습니다,하지만 당신은 여전히 ​​인해 언어의 비동기 특성으로 설정 작업하기 전에 모든 가져 오기 작업을 생성합니다.

    당신이 정말로 모든 GET과 (훨씬 느린 BTW 것) 세트 작업을 시퀀스 싶은 경우에, 당신은 재귀를 사용하여 루프를 구현하기 위해 함수형 프로그래밍의 비트를 사용할 수 있습니다.

    예:

    이 프로그램:

    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)
    

    디스플레이 :

    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
    

    경쟁 조건은 여전히이 예에 존재합니다. 당신은 확인 및 설정 작업의 종류를 구현하는 setnx를 사용하기로되어있다.

  2. from https://stackoverflow.com/questions/11000911/nodejs-redis-check-if-keys-exists-and-create-new-if-not by cc-by-sa and MIT license