常用命令:
开启事务队列:multi
关闭事务队列:discard
执行事务队列:exec
事务队列两种错误类型:
第一种:
在开启事务队列进行组队的时候redis命令出错,则执行整个事务队列的时候会让整个事务队列不执行,例如:
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> set k4 v4
QUEUED
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
由于“set k3”是一条错误的命令,所以整个事务队列将不会执行。
第二种:
在执行事务队列的时候出错,出错的命令,不会被执行,但是其它的命令会被执行,例如:
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> incr k2
QUEUED
127.0.0.1:6379(TX)> set k3 v3
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) (error) ERR value is not an integer or out of range
4) OK
由于“v2"是字符串类型,所以“incr k2”是个错误的命令,但是在组队的时候,redis无法判断k2的value,所以在组队的时候不出错,但是执行的过程出错,“incr k2”命令不执行,但是其余命令执行。
Redis两种锁模式:
悲观锁:
每次操作redis数据时都会把数据上锁,只能当前线程才可以进行操作,操作完毕后进行解锁。上锁过程中其他线程无法操作。
乐观锁:
当前线程a1对redis数据v1进行操作时,会获取一个版本号,同时其它线程也可以对v1进行操作,但是在a1操作完数据v1的时候会去匹配一下现在的v1的版本号,如果同操作前的版本号相同,则对v1进行更新,如果版本号不相符,则不进行更新