redis学习-12 事务及锁应用

1、Redis与 mysql事务的对比
redis学习-12 事务及锁应用
注: rollback与discard 的区别

如果已经成功执行了2条语句, 第3条语句出错.

Rollback后,前2条的语句影响消失.

Discard只是结束本次事务,前2条语句造成的影响仍然还在

2、Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

批量操作在发送 EXEC 命令前被放入队列缓存。
收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。
3、一个事务从开始到执行会经历以下三个阶段:

开始事务。
命令入队。
执行事务。
注:在mutil后面的语句中, 语句出错可能有2种情况

1: 语法就有问题,这种,exec时,报错, 所有语句得不到执行

2: 语法本身没错,但适用对象有问题. 比如 zadd 操作list对象

Exec之后,会执行正确的语句,并跳过有不适当的语句.

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。

4、监视 watch

watch key1 key2 … keyN

作用:监听key1 key2…keyN有没有变化,如果有变, 则事务取消

unwatch

作用: 取消所有watch监听

watch观察的变量若改变,事务就取消

Redis的事务中,启用的是乐观锁,只负责监测key没有被改动.

注:乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,

可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量

悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁

(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。

5、 redis 事务的相关命令:
redis学习-12 事务及锁应用
参考链接:http://www.runoob.com/redis/redis-transactions.html