c# - Booksleve 中的 Redis 事务

标签 c# redis booksleeve

下面的 3 个命令在按原样执行时可以完美地工作。

using (var redis = NewRedisConnection)
{
    await redis.Open();
    var allKeys = await redis.Keys.Find(db, "searchPattern");
    var allVals = await redis.Strings.GetString(db, allKeys);
    await redis.Keys.Remove(db, allKeys);

    //process the data I pull from redis
}

但是当我尝试将它们包装在事务中时,它停止工作。不会抛出异常,但如果我调试,执行似乎会停止在 var allKeys = ... 设置事务时我是否遗漏了什么?

using (var redis = NewRedisConnection)
{
    await redis.Open();
    var tran = redis.Createtransaction();

    var allKeys = await tran.Keys.Find(db, "searchPattern");
    var allVals = await tran.Strings.GetString(db, allKeys);
    await tran.Keys.Remove(db, allKeys);

    await tran.Execute();
    //process the data I pull from redis
}

最佳答案

交易在本地缓冲,直到您调用“exec”,然后以原子单元发送。如果你在 exec 之前“等待”,你将永远不会发送任何东西。只有调用execute 之后,才需要“等待”事务中的操作。

其次,您无法在交易期间查询数据。更具体地说,您可以,但只有在调用“执行”时才能得到结果。这是 redis 工作原理的基本部分:简单地说,redis 事务与 SQL 事务不同。这意味着您无法根据交易期间查询的数据做出决策。但是,您可以查询事务外部 的数据,然后确保它不会更改。使用 booksleeve,事务上的 AddConstraint 方法可以添加一些可以在事务期间安全验证的常见断言。

第三,Keys.Find 不应用作例程代码的一部分 - 应该很少使用,通常在调试和数据库分析期间使用。

在你的情况下,我想知道“散列”是否是一个更好的选择 - 所以与其“找到所有匹配此模式的键,从这些键中获取所有值,删除所有这些键”,不如这样做“从这个散列中获取所有值,删除这个散列”。

类似(注意:手 secret 码!请原谅打字错误)

using(var tran = conn.CreateTransaction())
{
    valsPending = tran.Hashes.GetAll(db, key);
    tran.Keys.Remove(db, key);
    await tran.Execute();
    var vals = await valsPending;
    // iterate dictionary in "vals", decoding each .Value with UTF-8
}

如果 GetAllString 能让上面的操作更简单,我可以添加它。

关于c# - Booksleve 中的 Redis 事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435797/

相关文章:

c# - 为调用堆栈创建一个变量 last

c# - MSB3073 错误代码 9009

node.js - 我可以在 Redis Pub/Sub 中设置延迟吗?

node.js - redis expireAt 在服务器中没有过期

c# - 如何使用 Booksleeve 在 Redis 中处理数字/整数值

redis - 如何从 BookSleeve 调用 BGSAVE?

c# - WP 8.1应用程序未连接调试器时崩溃

c# - 如何使 RectTransform 跟随位于不同父级下的另一个 RectTransform?

java - 无法从池中获取资源 JedisConnectionException

.net - Redis:我如何 INCR 和插入?