[toc]
Q: redis事务有哪些命令?#
A:
- MULTI: 开启事务。后面执行的操作都会放进队列里而不执行。
- EXEC: 执行事务中的所有操作命令
- DISCARD: 取消事务,放弃事务队列里的所有命令
- WATCH:监视一个或多个key,如果事务在“MULTI后, EXEC前”,被修改了,则事务中断
Q: redis事务出现错误时,会怎么处理?回滚还是抛弃?#
A:
有2种情况
- 语法错误, 例如MULTI之后, 输入了一个不存在的命令"sets", 则事务终止, 后面再EXEC将不会有变化。
- 运行期错误。语法正确,但类型错误,类型错误需要等真正运行时才知道。
这时候事务不会回滚,而是跳过错误命令,继续执行
Q: redis怎么实现CAS乐观锁?#
A:
使用watch命令。
就是MULTI之后, 针对某个键执行WATCH, 当后面真正需要EXEC时,如果key变了,就会失败。
此时的redis程序需要重复MULTI WATCH EXEC的操作,直到真正执行成功
Q: 为什么redis不支持回滚?为什么mysql这类关系型数据库需要回滚?#
A:
- 失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
- 不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
对于关系型数据库,他们是日志先行,可靠性大于效率的。
只有先做到了日志线性,才能保证正常回滚,而这肯定是有性能损耗,且实现复杂度非常高的。
Q: redis满足事务ACID的哪几个属性?#
- 原子性:Redis的事务是原子性的:所有的命令,要么全部执行,要么全部不执行。而不是完全成功。 不支持原子回滚
- 一致性: redis不具备 ACID 中一致性的概念
- 隔离性: 事务之间不影响,因为是单线程
- 持久性: 通过一定策略可以保证持久性,但不保证