雷迪斯的"Null reply"到底是什么?



我将Redis与Scala一起使用(redscala库(。我需要创建这样的交易:

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值、空字符串或类似的情况下成功?我想写一个测试,我需要一些提示。

一次校正,redisTransaction.exec()上没有void方法。

简短回答:

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

长答案:

正如文件所说,

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

并链接到NULL回复的解释

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

"$-1rn"这被称为Null批量字符串。

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

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

有一个测试用例用于解码来自redis的NULL响应。

最新更新