redis - StackExchange.Redis 事务方法卡住

标签 redis stackexchange.redis

我有这段代码可以在 Stackexchange.Redis 中添加对象和索引字段。 事务卡住线程中的所有方法。 为什么?

  var transaction = Database.CreateTransaction();

  //this line freeze thread. WHY ?
  await transaction.StringSetAsync(KeyProvider.GetForID(obj.ID), PreSaveObject(obj));
  await transaction.HashSetAsync(emailKey, new[] { new HashEntry(obj.Email, Convert.ToString(obj.ID)) });

  return await transaction.ExecuteAsync();

最佳答案

在您执行事务之后之前,在事务内执行的命令不会返回结果。这只是 Redis 中事务工作方式的一个特性。目前,您正在等待尚未发送的内容(交易在本地缓冲直至执行)——但即使已发送:在交易完成之前,结果根本不可用

如果您想要结果,您应该存储(而不是等待)任务,并在执行之后等待它:

var fooTask = tran.SomeCommandAsync(...);
if(await tran.ExecuteAsync()) {
    var foo = await fooTask;
}

请注意,这比看起来要便宜:当事务执行时,嵌套任务会同时获得它们的结果 - 而 await 可以有效地处理这种情况。

关于redis - StackExchange.Redis 事务方法卡住,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25976231/

相关文章:

Redis 组合键和内存使用命令

redis - 如何在redis中设置用户名和密码?

node.js - 使用 Node Redis 客户端进行错误处理

Redis 写入主机从从机读取

bash - 如何使用 Bash 调用 redis-cli get?

redis - 将 StackExchange.Redis 与 ElastiCache 结合使用

redis - 第一次将过期设置为已经过去的时间返回 True

c# - 如何准备一个推送和弹出到 redis 队列的控制台应用程序?

Redis哨兵中的C#操作

redis - 按值查找键