您的位置:首页 > 数据库 > Redis

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

2017-11-16 17:18 567 查看
转自: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

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的值不变
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: