下面的 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/