Redis中的事务自动增量ID(ServiceStack RedisClient)

时间:2012-06-06 03:40:34

标签: c# redis servicestack

使用IncrementKey的ActionSuccess回调在事务中不起作用:

public class Article
{
    public long Id { get; set; }
    public string Name { get; set; }
}

[Test]
public void Can_create_article_with_autoincremental-id()
{
    Article a = new Article() { Name = "I Love Writing Test" };
    using (var trans = Redis.CreateTransaction())
    {
        trans.QueueCommand(r => r.IncrementValue("id:article"), id => a.Id = id);
        trans.QueueCommand(r => r.Store<Article>(a));

        trans.Commit();
    }

    Assert.That(Redis.Get<Article>("1").Id,Is.Equal("1"));
}

1 个答案:

答案 0 :(得分:0)

Redis事务全部在回调仅在整个事务完成后触发的同时执行。因此,您不能在该事务的另一部分中的同一事务中的回调中使用返回值。

如果您只想存储带有自动增量Id计数器的文章,您可以这样做:

var a = new Article { 
   Id = Redis.As<Article>().GetNextSequence(), 
   Name = "I Love Writing Test" 
};
Redis.Store(a);

这不需要交易。要在事务中使用Redis中的值,只有在没有更改任何值时才执行该事务,请使用WATCH命令。请参阅我之前的回答for an example