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

标签 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 查询并检索结果?

谢谢。

最佳答案

自从 transactions work in 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 server-side LUA .

关于c# - 使用 ServiceStack.Redis,如何在事务中运行强类型只读查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21776021/

相关文章:

c# - 编辑 WPF 应用程序中的所有标签颜色

c# - 如何在 C# 中保存文件和在数据库中插入记录之间创建 Transactionscope

mysql - 如何防止 selectfound_rows 在竞争条件下中断?

java - 如何在 Spring Boot 应用程序中缓存复杂对象,例如 Map<String, List<Car>>

java - 将Set <byte []>转换为List <String>

c# - C# 中空泛型参数 <,> 的术语是什么?

c# - LINQ 和 ExcelQueryFactory

c# - 无法使用 C# 在 shell 扩展中添加图标

PHP MySqli 插入

python - 将 CSV 表转换为 Redis 数据结构