Redis中的“空回复”到底是什么?

时间:2018-07-18 06:28:55

标签: 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

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

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

什么是“空答复”?我的Future[Unit]是否可能会以null值或空的String或类似内容成功执行?我想写一个测试,我需要一些提示。

1 个答案:

答案 0 :(得分:7)

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

简短答案:

如果事务失败或执行中止,

exec()调用将返回Future(MultiBulk(None))

长答案:

如文档所述,

  

使用WATCH时,如果执行是   流产了。

并链接到NULL reply的说明

  

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

     

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

     

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

这表明服务器将以NULL响应进行响应,而客户端必须对其进行处理。它不能为空字符串,并且在此库中用于将服务器的响应解码并映射为MultiBulk(None)

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