繁体   English   中英

使用ServiceStack.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()
}

这里的问题是usergroup变量没有使用事务的输出设置。

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

谢谢。

您不能在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM