Redis ServiceStack 使用事务时如何创建多个序列号

Posted

技术标签:

【中文标题】Redis ServiceStack 使用事务时如何创建多个序列号【英文标题】:How to create multiple sequence numbers when using a transaction with Redis 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。 【参考方案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);
);

【讨论】:

以上是关于Redis ServiceStack 使用事务时如何创建多个序列号的主要内容,如果未能解决你的问题,请参考以下文章

.Net使用Redis详解之ServiceStack.Redis

ServiceStack.Redis记录

使用 ServiceStack.ORMLite 的存储库模式中的事务

ServiceStack.Redis 使用教程

Redis客户端ServiceStack.Redis的简单使用

C# - ServiceStack.Redis