使用ServiceStack.Redis,如何在事务中运行强类型的只读查询

时间:2014-02-14 09:54:23

标签: c# transactions redis servicestack

我知道我可以通过在事务中执行它们来提高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()
}

此处的问题是usergroup变量未使用事务输出设置。

那么,如何在事务(或管道)中运行一系列不同的强类型 read 查询并检索结果?

感谢。

1 个答案:

答案 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