我将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或类似内容成功执行?我想写一个测试,我需要一些提示。
答案 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响应。