【问题标题】:What exactly is a "Null reply" in Redis?Redis 中的“空回复”到底是什么?
【发布时间】:2018-07-24 02:54:51
【问题描述】:

我使用 Redis 和 Scala(rediscala 库)。我需要像这样创建一个事务:

redisTransaction.watch(key)
redisTransaction.zremrangebyscore(key, limit, limit) *>
redisTransaction.zadd(key, (someValue, entry)) *>
redisTransaction.set[ByteString](s"$lastSeqNumKey", sequenceNum) *>
redisTransaction.exec().void

最后一个表达式应该返回一个Future[Unit],如果交易失败,我希望它会失败。但是,Redis 文档指出:

使用 WATCH 时,如果执行被中止,EXEC 可以返回 Null 回复。

究竟什么是“空回复”?我的Future[Unit] 是否有可能以null 值或空字符串或类似的东西成功?我想写一个测试,我需要一些提示。

【问题讨论】:

    标签: scala redis


    【解决方案1】:

    更正一下,redisTransaction.exec()上没有void方法。

    简答:

    如果事务失败或执行被中止,exec() 调用将返回Future(MultiBulk(None))

    长答案:

    正如文档所说,

    使用 WATCH 时,如果执行是 中止。

    并链接到NULL reply的解释

    也可以使用 RESP 批量字符串来表示不存在 使用特殊格式的值,用于表示 Null 值。 在这种特殊格式中,长度为 -1,并且没有数据,所以 Null 表示为:

    "$-1\r\n" 这称为 Null Bulk String。

    客户端库 API 不应返回空字符串,而应返回 nil 对象,当服务器以 Null Bulk String 回复时。例如一个 Ruby 库应返回“nil”,而 C 库应返回 NULL (或在回复对象中设置特殊标志),等等

    这表明服务器将回复一个 NULL 响应并且客户端必须处理它。它不能是空字符串,在这个库中,它被用来解码和映射来自服务器的响应为MultiBulk(None)

    有一个 test case 用于解码来自 redis 的 NULL 响应。

    【讨论】:

    • 谢谢!至于.void 方法,它是Cats 库的Functor 扩展,基本上是将F[A] 转换为F[Unit]。我之所以使用它,是因为我预计 Future 会因事务失败而失败,但我会放弃它以便现在检查 MultiBulk(None)
    • 啊,好吧,你在用猫。当我看到 *> 运算符时,我现在意识到了这一点。无论如何,我希望我的回答有所帮助。
    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2014-10-26
    • 2020-05-02
    • 2010-09-26
    • 2020-07-16
    • 1970-01-01
    相关资源
    最近更新 更多