【问题标题】:Transactional Create with Validation in ServiceStack Redis ClientServiceStack Redis 客户端中带有验证的事务性创建
【发布时间】:2012-06-06 06:48:14
【问题描述】:

User 有 DisplayName,它对用户来说是唯一的。

我想创建用户,但首先我必须检查显示名称(显示名称不能为用户重复)

我检查了 ServiceStack 示例,但看不到带有验证检查的事务性插入/更新。

我该如何执行它。我不想为 redis db 编写“验证任务”。 我不想在 db 中出现不一致。

【问题讨论】:

    标签: redis servicestack


    【解决方案1】:

    ServiceStack.Redis 客户端确实支持 Redis 的 WATCHtransactions,其中这些 Redis 命令:

    WATCH mykey
    test = EXIST mykey
    MULTI
    SET mykey $val
    EXEC
    

    可以通过:

    var redis = new RedisClient();
    redis.Watch("mykey");
    if (!redis.ContainsKey("mykey")) return;
    
    using (var trans = redis.CreateTransaction()) {
        trans.QueueCommand(r => r.Set("mykey", "val"));
        trans.Commit();
    }
    

    【讨论】:

    • 要求是检查“输入”事务的键,但它是在您的示例中的事务之前完成的。作为示例 github.com/ServiceStack/ServiceStack/blob/master/src/… 。 AssertNoExistingUser 和 Store 操作在 CreateUserAuth 方法中必须是事务性的。
    • RedisAuthRepository 可以存储两个具有相同显示名的新用户。
    • 阅读 Redis Transactions (redis.io/topics/transactions) WATCH 会影响下一个后续事务。即,如果在 WATCH 命令和事务之间修改了任何 监视的键,则事务不会被执行并引发异常。
    • 12 年来我从未见过“Watch”风格的实现.. 我猜不出来。非常感谢。 RedisAuthRepository 仍然容易受到竞争条件的影响。但我会实施并分享它。最好的问候。
    • 我们如何建议对 ServiceStack 项目@mythz 进行代码重构或修复?
    【解决方案2】:

    可以执行redis事务。更多资讯here

    WATCH mykey
    test = EXIST mykey
    MULTI
    SET mykey $val
    EXEC
    

    使用 PHP 有更好的例子:here

    【讨论】:

    • 我不是指多次插入或多次删除。我的意思是 CheckIfNotExists 选项。
    • 我认为我的问题与redis.io/commands/eval 更相关。但我正在尝试使用 ServiceStack Redis 客户端找到解决方案。
    • 你用的是什么redis客户端?
    • 不知道 ServiceStack Redis Client,但阅读 this 文档存在第二个参数“Action onSuccessCallback”。我认为解决了。
    • 会很复杂。 “如果你有关系数据库背景,Redis 命令可能会在事务期间失败,但 Redis 仍会执行其余事务而不是回滚,这对你来说可能看起来很奇怪。[redis.io/topics/transactions]”我需要存在检查喜欢你的示例代码。不过谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多