Redis的"空回复"究竟是什么?

kci*_*ski 8 scala redis

我使用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
Run Code Online (Sandbox Code Playgroud)

最后一个表达式应该返回一个Future[Unit]我希望在事务失败时失败的表达式.但是,Redis文档指出:

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

什么是"空回复"?我的Future[Unit]遗嘱可能是一个null值,还是空字符串或类似的东西?我想写一个测试,我需要一些关于它的提示.

cur*_*ous 7

一次修正,没有void办法redisTransaction.exec().

简短回答:

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

答案很长:

正如文件所说,

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

并链接到NULL回复的解释

RESP Bulk Strings也可用于使用用于表示Null值的特殊格式来表示值的不存在.在这种特殊格式中,长度为-1,并且没有数据,因此Null表示为:

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

当服务器使用Null Bulk String回复时,客户端库API不应返回空字符串,而应返回nil对象.例如,Ruby库应返回'nil',而C库应返回NULL(或在reply对象中设置特殊标志),依此类推

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

有一个用于解码redis的NULL响应的测试用例.

  • 谢谢!对于`.void`方法,它是来自Cats库的`Functor`扩展,基本上将`F [A]`转换为`F [Unit]`.我使用它是因为我预计`Future`会因失败的事务而失败,但我会放弃它以便现在检查`MultiBulk(None)`. (2认同)