Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Booksleve中的Redis交易_C#_Redis_Booksleeve - Fatal编程技术网

C# Booksleve中的Redis交易

C# Booksleve中的Redis交易,c#,redis,booksleeve,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);

下面的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”,然后以原子单位发送。如果你在执行官面前“等待”,你永远不会发送任何东西。只有在调用execute之后,才需要“等待”事务中的操作

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

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

在您的情况下,我想知道“散列”是否是一个更好的选择-因此,与其“查找与此模式匹配的所有键,从这些键中获取所有值,删除所有键”,不如将其作为“从该散列中获取所有值,删除此散列”

比如(注意:手机代码!请原谅打字错误)


我可以添加一个GetAllString,如果它能简化上述操作。

var result2…是如何工作的?在您的示例中,result1现在是一个任务,并且所有键不再存在。我想我的问题可以总结为:如何将result1的结果作为参数传递给getString?这很好,谢谢。GetAllString会更简单,但不需要。再次感谢!
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
}