Redis学习笔记(八)事务 和 连接相关命令
1. 事务
1. 事务的概念和原理
- Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis中的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
- 事务的原理是先将属于一个事务的命令发送给Redis,然后在让Redis一次执行这些命令。
2. 事务相关命令
- MULTI
- 标记一个事务块的开始。 随后的指令将在执行EXEC时作为一个原子执行。
- EXEC
- 执行事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行。
127.0.0.1:6379> MULTI //事务块的开始标记
OK
127.0.0.1:6379> INCR counter1
QUEUED //将命令暂存在事务队列中
127.0.0.1:6379> INCR counter2
QUEUED
127.0.0.1:6379> INCR counter3
QUEUED
127.0.0.1:6379> PING
QUEUED
127.0.0.1:6379> GET counter1
QUEUED
127.0.0.1:6379> EXEC //将等待执行的事务队列中的所有命令(返回QUEUED的命令)按照发送顺序一次执行
1) (integer) 1
2) (integer) 1
3) (integer) 1
4) PONG
5) "1"
//EXEC的返回值就是这些命令的返回值组成的列表,返回值顺序和命令的顺序相同。
- Redis保证一个事务中的所有命令要么被都不执行,要么都执行。
- 如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行;
- 一旦客户端发送了EXEC命令,所有的命令都会被执行,即使伺候客户端断线也没关系,因为Redis会记录所有要执行的命令。
- WATCH key [key …]
- 标记所有指定的key 被监视起来,在事务中有条件的执行(乐观锁)。
- 被监控的键一旦被修改或删除,之后的事务就不会执行。
- 监控一直会持续到EXEC命令。
- UNWATCH
- 取消一个事务中已被监视的所有key。
- 如果执行EXEC 或者DISCARD, 则不需要手动执行UNWATCH 。
127.0.0.1:6379> GET counter1
"1"
127.0.0.1:6379> GET counter2
"1"
127.0.0.1:6379> WATCH counter1 counter2 //监控这两个键
OK
127.0.0.1:6379> MULTI //标记事务块的开始
OK
127.0.0.1:6379> INCR counter1
QUEUED
127.0.0.1:6379> INCR counter2
QUEUED
//在执行EXEC命令之前,打开另一个客户端修改counter1的值
127.0.0.1:6379> GET counter1
"1"
127.0.0.1:6379> SET counter1 100
OK
127.0.0.1:6379> GET counter1
"100"
//返回执行事务的客户端,执行EXEC命令
127.0.0.1:6379> EXEC
(nil) //EXEC命令执行失败,因为被监控的键被修改
127.0.0.1:6379> GET counter1
"100" //counter1值被另一个客户端修改为100
127.0.0.1:6379> GET counter2
"1" //counter2的值不变
127.0.0.1:6379> MULTI //正常执行事务
OK
127.0.0.1:6379> INCR counter1
QUEUED
127.0.0.1:6379> INCR counter2
QUEUED
127.0.0.1:6379> EXEC //键值都被修改
1) (integer) 101
2) (integer) 2
127.0.0.1:6379> UNWATCH //取消被监控的键
OK
- DISCARD
- 取消一个事务中所有在排队等待的指令,并且将连接状态恢复到正常。
- 如果已使用WATCH,DISCARD将释放所有被WATCH的key。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET counter4 10
QUEUED
127.0.0.1:6379> INCR counter4
QUEUED
127.0.0.1:6379> DISCARD //取消所有的事务
OK
127.0.0.1:6379> EXISTS counter4 //counter4不存在因为事务被取消
(integer) 0
3. 事务中的错误处理
- 语法错误:命令不存在或命令参数个数不对。只要有一个命令有语法错误,执行EXEC命令后就会直接返回错误,语法正确的命令也不会执行。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET test1 hello
QUEUED
127.0.0.1:6379> SET key
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> ERROCOMMAND key
(error) ERR unknown command 'ERROCOMMAND'
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> EXISTS test1 //正确的命令不被执行
(integer) 0
- 运行错误:运行错误指在命令执行时出现错误。如果事务里的一个命令出现运行错误,事务里其他命令依然会继续执行。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET key 1
QUEUED
127.0.0.1:6379> SADD key 2 //散列类型的命令操作集合类型的键出现运行错误。
QUEUED
127.0.0.1:6379> SET key 3 //错误之后的命令依然会继续执。
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (error) WRONGTYPE Operation against a key holding the wrong kind of value
3) OK
127.0.0.1:6379> GET key //键值被错误命令之后的命令修改
"3"
在关系数据库事务提供回滚(rollback)功能,但是redis不支持,因为redis在事务上保持简洁和快速。
2. 连接相关命令
- PING [message]
- 如果后面没有参数时返回PONG,否则会返回后面带的参数。
- 这个命令经常用来测试一个连接是否还是可用的,或者用来测试一个连接的延时。
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> PING test
"test"
- ECHO message
- 返回消息。
127.0.0.1:6379> ECHO test
"test"
- QUIT
- 请求服务器关闭连接。连接将会尽可能快的将未完成的客户端请求完成处理。
127.0.0.1:6379> QUIT
➜ ~
127.0.0.1:6379> EXIT
➜ ~
//退出,而shutdown则是关闭服务器和客户端
- AUTH
- 为redis服务请求设置一个密码。redis可以设置在客户端执行commands请求前需要通过密码验证。通过修改配置文件的requirepass就可以设置密码。 如果密码与配置文件里面设置的密码一致,服务端就会发会一个OK的状态码,接受客户端发送其他的请求命令,否则服务端会返回一个错误码,客户端需要尝试使用新的密码来进行连接。
127.0.0.1:6379> CONFIG SET requirepass menwen //设置密码
OK
127.0.0.1:6379> GET test //需要验证
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH errorpasswd //验证失败
(error) ERR invalid password
127.0.0.1:6379> AUTH menwen //验证成功
OK
127.0.0.1:6379> GET test //可以查看键值
"this is a test"
//或者在登录时指定-a选项加密码就直接能够验证,如下:
➜ ~ redis-cli -a menwen
127.0.0.1:6379> GET test
"this is a test"
- SELECT
- 选择一个数据库,下标值从0开始,一个新连接默认连接的数据库是DB0。
127.0.0.1:6379> SELECT 1 //默认为数据库0
OK
127.0.0.1:6379[1]> SELECT 2 //切换到数据库1
OK
127.0.0.1:6379[2]> SELECT 0
OK