servicestack,C#,Transactions,Redis,servicestack" /> servicestack,C#,Transactions,Redis,servicestack" />

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

C# 使用ServiceStack.Redis,如何在事务中运行强类型只读查询,c#,transactions,redis,servicestack,C#,Transactions,Redis,servicestack,我知道我可以通过在事务中执行Redis查询来提高其性能(在专用管道中更是如此) 问题在于,使用ServiceStack Redis客户端,我可以在事务中执行读取,但无法访问结果。以下是我的代码: User user = null; Group group = null; using (IRedisClient cacheClient = new RedisClient()) using (var trans = cacheClient.CreateTransaction()) { tr

我知道我可以通过在事务中执行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=null;
组=空;
使用(IRedisClient cacheClient=new RedisClient())
使用(var trans=cacheClient.CreateTransaction())
{
trans.QueueCommand(x=>
{
var userClient=x.As();
var userHash=userClient.GetHash(“用户”);
user=userClient.GetValueFromHash(userHash,userKey);
});
trans.QueueCommand(y=>
{
//从缓存中检索模块
var groupClient=y.As();
var groupHash=groupClient.GetHash(“组”);
group=groupClient.GetValueFromHash(groupHash,groupKey);
});
trans.Commit()
}
这里的问题是
用户
变量没有与事务的输出一起设置

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


谢谢。

您不能在Redis事务中执行任何依赖于的读取操作(操作依赖于其他读取值),因为所有命令都是成批发送到Redis并作为单个单元执行的,因此没有机会在同一事务中使用读取值

确保完整性的方法是在事务之前使用命令监视任何键,如果在事务之前更改了任何键,则在提交事务时将抛出该键。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();
}
var cacheClient=new RedisClient();
cacheClient.Watch(“用户”、“组”);
var userHash=cacheClient.As().GetHash(“用户”);
var groupHash=cacheClient.As.GetHash(“组”);
使用(var trans=cacheClient.CreateTransaction())
{
trans.QueueCommand(x=>
{
user=x.As().GetValueFromHash(userHash,userKey);
});
trans.QueueCommand(y=>
{
group=y.As().GetValueFromHash(groupHash,groupKey);
});
trans.Commit();
}

交易的另一种选择是使用。

谢谢您的解释。结果就是我做不到?澄清一下,我不太关心数据完整性,也不关心进行依赖读取,只关心最小化调用数量。我可以将写操作排队,但无法排队并使用读操作,这似乎很奇怪。@Digbyswift WATCH允许您这样做,使用事务中的读取值。您可以对读取进行排队,但如前所述,无法使用来自同一事务中另一个操作的读取(根据设计,同一事务中的所有操作都作为单个单元执行)。使用WATCH是解决方案。对不起,我已经将您的实现用于WATCH,但我无法让它工作<一旦提交发生,code>user和
group
总是
null
,因此我无法访问数据。