我将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响应。