![](/img/trans.png)
[英]How can I publish to a ServiceStack.Redis Message Queue using StackExchange.Redis?
[英]Using ServiceStack.Redis, how can I run strongly-typed read-only queries in a transaction
我知道我可以通过在事务中执行它们来提高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
变量没有使用事务的输出设置。
那么,如何在事务(或管道)中运行一系列不同的强类型读取查询并检索结果?
谢谢。
您不能在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服务器端LUA 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.