Redis学习笔记(八)事务 和 连接相关命令

转自:http://blog.csdn.net/men_wen/article/details/62075751


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的返回值就是这些命令的返回值组成的列表,返回值顺序和命令的顺序相同。
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  1. Redis保证一个事务中的所有命令要么被都不执行,要么都执行
  2. 如果在发送EXEC命令前客户端断线了,则Redis会清空事务队列,事务中的所有命令都不会执行;
  3. 一旦客户端发送了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的值不变
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
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
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 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
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 运行错误:运行错误指在命令执行时出现错误。如果事务里的一个命令出现运行错误,事务里其他命令依然会继续执行。
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"
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在关系数据库事务提供回滚(rollback)功能,但是redis不支持,因为redis在事务上保持简洁和快速。

2. 连接相关命令

  • PING [message] 
    • 如果后面没有参数时返回PONG,否则会返回后面带的参数。
    • 这个命令经常用来测试一个连接是否还是可用的,或者用来测试一个连接的延时。
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> PING test
"test"
 
 
  • 1
  • 2
  • 3
  • 4
  • ECHO message 
    • 返回消息。
127.0.0.1:6379> ECHO test
"test"
 
 
  • 1
  • 2
  • QUIT 
    • 请求服务器关闭连接。连接将会尽可能快的将未完成的客户端请求完成处理。
127.0.0.1:6379> QUIT
➜  ~ 
127.0.0.1:6379> EXIT
➜  ~ 
//退出,而shutdown则是关闭服务器和客户端
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 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"
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值