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.ORMLite 的存储库模式中的事务