我知道我可以通过在事务中执行它们来提高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 查询并检索结果?
感谢。
答案 0 :(得分:3)
您不能在Redis事务中执行任何依赖读取(依赖于其他读取值的操作),因为transactions work in Redis的方式是所有命令都被批处理并发送到redis和作为一个单元执行,因此没有机会在同一个交易中使用读取值。
您可以确保完整性的方法是使用Redis WATCH命令在事务之前监视任何键,并且如果在事务提交之前它将抛出的事务之前更改了任何键。 e.g:
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。