C# Booksleve中的Redis交易
下面的3个命令在按原样执行时工作正常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);
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
}