2015-10-07 10 views
1

Я работаю в блоге с использованием redis, и я застрял на уровне api. Я пытаюсь сделать следующее вещь:Приращение id и присвоение его строке с использованием ioredis для базы данных redis

MULTI 
INCR id 
SET post:{id} json_value //Stucked here 
SADD posts {id} 
EXEC 

Так как же я получаю идентификатор для SET пост: {ID}?

У меня есть следующий код, который пока не работает.

// Create post 
function cpost(json) { 
    client.pipeline() 
     .incr('id')) 
     .set('post:' + client.get('id:post', function (err, results) { 
      return results; 
     }), json) 
     .sadd('posts, client.get('id:post', function (err, results) { 
      return results; 
     })) // posts post 
     .exec(function (err, results) { 

    }); 
} 

Использование ioredis

Любые идеи о том, как получить значение идентификатора?

+0

Не эксперт узел, но вы не можете сделать это - запустить INCR вне MULTI (если только ид ** абсолютно не должны ** быть совершенно последовательным, и в этом случае проблема, как правило, с грандиознее дизайн) –

ответ

1

Я не думаю, что это правильный способ решить мою проблему, но мне нужно двигаться дальше. Простейшее решение когда-либо (счетчик):

var id = 0; 
function cpost(json) { 
    id++; 
    client.pipeline() 
     .incr('id', 'post') 
     .set('blog:post:' + id, json) // blog:post:1 
     .sadd('blog:posts', id) // blog:posts id:post 
     .exec(function (err, results) { 
    }); 
} 
2

Если вы хотите иметь сделки вы должны использовать multi() вместо pipeline() (я думаю, что это так).

Ниже приводится способ, которым я столкнулся с этой проблемой.

Я мог сделать это только двумя способами, используя обещания. Вы также можете добиться того же, используя обратные вызовы. В любом случае приращение происходит вне транзакции или партии.

function cpost(json) { 
    client.incr('id', 'post').then(function (postId) { 
     client.multi() 
      .set('blog:post:' + postId, json) 
      .sadd('blog:posts', postId) 
      .exec() 
      .then(
       function onSuccess(data) { 
        // success handling goes here 
       }, 
       function onError(data) { 
        // error handling goes here 
       } 
      ); 
}