C# 使用ServiceStack.Redis,如何在事务中运行强类型只读查询
我知道我可以通过在事务中执行Redis查询来提高其性能(在专用管道中更是如此) 问题在于,使用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
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
,因此我无法访问数据。