2

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();
});
4

1 に答える 1

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);
});
于 2012-07-15T17:57:14.390 に答える