Bookslive中的Redis事务



下面的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方法可以添加许多公共断言,这些断言可以在事务期间安全地进行验证。

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

在你的情况下,我想知道"哈希"是否是一个更好的选择——所以与其说"找到所有与此模式匹配的键,从这些键中获取所有值,删除所有这些键",不如说"从这个哈希中获取所有数值,删除这个哈希"。

所以有点像(注意:手机代码!原谅打字错误)

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,如果它能让上面的操作更容易的话。

最新更新