我正在尝试使用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();
});
答案 0 :(得分: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);
});