我知道我可以通过在事务中执行它们来提高 Redis 查询的性能(甚至在专用管道中更是如此)。
问题是,使用 ServiceStack Redis 客户端,我可以在事务中执行读取,但无法访问结果。这是我下面的代码:
User user = null;
Group group = null;
using (IRedisClient cacheClient = new RedisClient())
using (var trans = cacheClient.CreateTransaction())
{
trans.QueueCommand(x =>
{
var userClient = x.As<User>();
var userHash = userClient.GetHash<string>("Users");
user = userClient.GetValueFromHash(userHash, userKey);
});
trans.QueueCommand(y =>
{
// Retrieve modules from cache
var groupClient = y.As<Group>();
var groupHash = groupClient.GetHash<string>("Groups");
group = groupClient.GetValueFromHash(groupHash, groupKey);
});
trans.Commit()
}
这里的问题是 user
和 group
变量没有设置交易的输出。
那么,如何在事务(或管道)中运行一系列不同的强类型read 查询并检索结果?
谢谢。
最佳答案
自从 transactions work in Redis 以来,您不能在 Redis 事务中执行任何依赖读取(依赖于其他读取值的操作)是它们的所有命令都被分批发送到 Redis 并作为一个单元执行,因此没有机会在同一事务中使用读取值。
确保完整性的方法是使用 Redis WATCH命令在事务之前监视任何键,如果在事务之前更改了任何键,它将在事务提交时抛出。例如:
var cacheClient = new RedisClient();
cacheClient.Watch("Users", "Groups");
var userHash = cacheClient.As<User>().GetHash<string>("Users");
var groupHash = cacheClient.As<Group>.GetHash<string>("Groups");
using (var trans = cacheClient.CreateTransaction())
{
trans.QueueCommand(x =>
{
user = x.As<User>().GetValueFromHash(userHash, userKey);
});
trans.QueueCommand(y =>
{
group = y.As<Group>().GetValueFromHash(groupHash, groupKey);
});
trans.Commit();
}
事务的另一种替代方法是使用 Redis server-side LUA .
关于c# - 使用 ServiceStack.Redis,如何在事务中运行强类型只读查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21776021/