90.什么是 Redis 事务?
和众多其它数据库一样,Redis 作为 NoSQL 数据库也同样提供了事务机制。在 Redis 中,MULTI / EXEC / DISCARD / WATCH 这四个命令是我们实现事务的基石。相信对有关系型数据库开发经验的开发者而言这一概念并不陌生,即便如此,我们还是会简要的列出 Redis 中事务的实现特征:
1、在事务中的所有命令都将会被串行化的顺序执行,事务执行期间,Redis 不会再为其它客户端的请求提供任何服务,从而保证了事物中的所有命令被原子的执行。
Lua 脚本,也能实现该功能。
2、和关系型数据库中的事务相比,在 Redis 事务中如果有某一条命令执行失败,其后的命令仍然会被继续执行。
这一点,非常重要。回答错了,就回家面壁思过,一天不许喝可乐。
这一点,是 Lua 脚本不具备的。
3、我们可以通过 MULTI 命令开启一个事务,有关系型数据库开发经验的人可以将其理解为
""BEGIN TRANSACTION""
语句。在该语句之后执行的命令,都将被视为事务之内的操作,最后我们可以通过执行 EXEC / DISCARD 命令来提交 / 回滚该事务内的所有操作。这两个 Redis 命令,可被视为等同于关系型数据库中的 COMMIT / ROLLBACK 语句。开启事务后,所有语句,发送给 Redis Server ,都会暂存在 Server 中。
4、在事务开启之前,如果客户端与服务器之间出现通讯故障并导致网络断开,其后所有待执行的语句都将不会被服务器执行。然而如果网络中断事件是发生在客户端执行 EXEC 命令之后,那么该事务中的所有命令都会被服务器执行。
? 如何实现 Redis CAS 操作?
在 Redis 的事务中,WATCH 命令可用于提供 CAS(check-and-set) 功能。
假设我们通过 WATCH 命令在事务执行之前监控了多个 keys ,倘若在 WATCH 之后有任何 Key 的值发生了变化,EXEC 命令执行的事务都将被放弃,同时返回 nil
应答以通知调用者事务执行失败。
具体的示例,可以看看 《Redis 事务锁 CAS 实现以及深入误区》 。