如何在一个事务中运行两个异步方法?
例如:
var batchIds = new ConcurrentBag<int>();
var trans = redis.CreateTransaction();
var task = trans.ListRangeAsync(AllItems, 0L, batchSize - 1).ContinueWith(t =>
{
t?.Result.ToList().ForEach(x => batchIds.Add(JsonConvert.DeserializeObject<StockItemDto>(x).Id));
}).ContinueWith(t=>{ trans.ListTrimAsync(AllItems, batchSize, -1); }); // This not work
// This work but I'm not sure if taskRemove run exaclly after task
var taskRemove = trans.ListTrimAsync(AllItems, batchSize, -1);
trans.Execute(CommandFlags.FireAndForget);
Task.WaitAll(task, taskRemove);也许有人知道如何从列表中获得一个范围,然后在事务处理中删除这个范围?
发布于 2015-10-08 07:29:52
你不能这么做。
解决方案是为读操作创建一个常规的IDatabase,为写操作创建一个ITransaction。
为什么.?因为StackExchange.Redis事务是Redis的MULTI/EXEC命令的抽象。也就是说,事务是批量发送给Redis的命令队列,它们的执行是原子的。一旦调用ITransaction.Execute,整个传入批处理部件就完成了。
这就是不能在Redis事务中执行读取操作的原因。命令是在批处理中排队和执行的,因此,一旦bacthing结束,您就可以继续执行任何命令,并且这不会作为包装事务的一部分.
OP在一些评论中说..。
也许你能给我点建议?因为我需要从列表中获取项目,并在删除这些项目之后。这些操作必须是线程安全的。
线程安全与Redis事务毫无关系。是您负责将某些锁定方法作为应用程序层的一部分来实现。那么,您可能可以使用Redis作为进程间或多线程锁标志存储来实现该锁。从官方的Redis网站上了解到这篇文章。
事实上,查看另一个Q&A:StackExchange.Redis - LockTake / LockRelease用法
https://stackoverflow.com/questions/33008639
复制相似问题