【问题标题】:How to create multiple sequence numbers when using a transaction with Redis ServiceStackRedis ServiceStack 使用事务时如何创建多个序列号
【发布时间】:2012-07-14 11:41:46
【问题描述】:

我正在尝试使用 C# ServiceStack 将多个新实体插入 Redis。我遇到的问题是生成序列号。

根据我的阅读,您在将事务命令排队以保证原子操作时无法发出其他请求。

这意味着必须迭代我的实体集合以首先生成序列号,然后再次迭代以将事务命令排队并执行?

有没有一种有效的方法来做到这一点?

IRedisClientsManager RedisManager;

RedisManager.ExecTrans(x =>
{
    foreach (var entity in entities)
    {
        x.QueueCommand(c =>
        {
            //entity.Id = generate sequence number
            c.Store(entity);
        });
    }
    x.Commit();
});

【问题讨论】:

  • 不手动设置Id会怎样,redis会自动设置吗?
  • 此时我需要使用 Id 更新对象。否则,之后将需要另一次往返来更新 Id。

标签: c# redis servicestack


【解决方案1】:

您可以预先获取一批序列 ID,然后将它们分配给您的模型。您还可以使用 StoreAll(),它利用 Redis 的批处理 MSET 操作,因此所有模型都在同一个操作中执行/存储。

鉴于此,我将重写上面的内容:

RedisManager.ExecAs<TEntity>(r => {
   var maxSeqId = r.GetNextSequence(entities.Count);
   var newId = maxSeqId - entities.Count;
   entities.ForEach(x => x.Id = newId++);
   r.StoreAll(entities);
});

【讨论】:

    猜你喜欢
    • 2019-06-13
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 1970-01-01
    • 2012-06-10
    • 2013-01-08
    • 2021-11-09
    相关资源
    最近更新 更多