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

来源:互联网 发布:淘宝店铺的货源怎么找 编辑:程序博客网 时间:2024/06/07 22:46

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

1. 事务

1. 事务的概念和原理

  • Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis中的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
  • 事务的原理是先将属于一个事务的命令发送给Redis,然后在让Redis一次执行这些命令

2. 事务相关命令

  • MULTI
    • 标记一个事务块的开始。 随后的指令将在执行EXEC时作为一个原子执行。
  • EXEC
    • 执行事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行。
127.0.0.1:6379> MULTI   //事务块的开始标记OK127.0.0.1:6379> INCR counter1QUEUED      //将命令暂存在事务队列中127.0.0.1:6379> INCR counter2QUEUED127.0.0.1:6379> INCR counter3QUEUED127.0.0.1:6379> PINGQUEUED127.0.0.1:6379> GET counter1QUEUED127.0.0.1:6379> EXEC    //将等待执行的事务队列中的所有命令(返回QUEUED的命令)按照发送顺序一次执行1) (integer) 12) (integer) 13) (integer) 14) PONG5) "1"//EXEC的返回值就是这些命令的返回值组成的列表,返回值顺序和命令的顺序相同。
  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 //监控这两个键OK127.0.0.1:6379> MULTI       //标记事务块的开始OK127.0.0.1:6379> INCR counter1QUEUED127.0.0.1:6379> INCR counter2QUEUED//在执行EXEC命令之前,打开另一个客户端修改counter1的值127.0.0.1:6379> GET counter1"1"127.0.0.1:6379> SET counter1 100OK127.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值被另一个客户端修改为100127.0.0.1:6379> GET counter2"1"     //counter2的值不变
127.0.0.1:6379> MULTI       //正常执行事务OK127.0.0.1:6379> INCR counter1QUEUED127.0.0.1:6379> INCR counter2QUEUED127.0.0.1:6379> EXEC        //键值都被修改1) (integer) 1012) (integer) 2127.0.0.1:6379> UNWATCH //取消被监控的键OK
  • DISCARD
    • 取消一个事务中所有在排队等待的指令,并且将连接状态恢复到正常。
    • 如果已使用WATCH,DISCARD将释放所有被WATCH的key。
127.0.0.1:6379> MULTIOK127.0.0.1:6379> SET counter4 10QUEUED127.0.0.1:6379> INCR counter4QUEUED127.0.0.1:6379> DISCARD //取消所有的事务OK127.0.0.1:6379> EXISTS counter4 //counter4不存在因为事务被取消(integer) 0

3. 事务中的错误处理

  • 语法错误:命令不存在或命令参数个数不对。只要有一个命令有语法错误,执行EXEC命令后就会直接返回错误,语法正确的命令也不会执行。
127.0.0.1:6379> MULTI OK127.0.0.1:6379> SET test1 helloQUEUED127.0.0.1:6379> SET key (error) ERR wrong number of arguments for 'set' command127.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> MULTIOK127.0.0.1:6379> SET key 1QUEUED127.0.0.1:6379> SADD key 2  //散列类型的命令操作集合类型的键出现运行错误。QUEUED127.0.0.1:6379> SET key 3   //错误之后的命令依然会继续执。QUEUED127.0.0.1:6379> EXEC1) OK2) (error) WRONGTYPE Operation against a key holding the wrong kind of value3) OK127.0.0.1:6379> GET key //键值被错误命令之后的命令修改"3"

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

2. 连接相关命令

  • PING [message]
    • 如果后面没有参数时返回PONG,否则会返回后面带的参数。
    • 这个命令经常用来测试一个连接是否还是可用的,或者用来测试一个连接的延时。
127.0.0.1:6379> PINGPONG127.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   //设置密码OK127.0.0.1:6379> GET test    //需要验证(error) NOAUTH Authentication required.127.0.0.1:6379> AUTH errorpasswd    //验证失败(error) ERR invalid password127.0.0.1:6379> AUTH menwen //验证成功OK127.0.0.1:6379> GET test    //可以查看键值"this is a test"//或者在登录时指定-a选项加密码就直接能够验证,如下:➜  ~ redis-cli -a menwen127.0.0.1:6379> GET test"this is a test"
  • SELECT
    • 选择一个数据库,下标值从0开始,一个新连接默认连接的数据库是DB0。
127.0.0.1:6379> SELECT 1    //默认为数据库0OK127.0.0.1:6379[1]> SELECT 2 //切换到数据库1OK127.0.0.1:6379[2]> SELECT 0OK
0 0
原创粉丝点击