Redis学习笔记(八)事务 和 连接相关命令
2017-11-16 17:18
567 查看
转自:http://blog.csdn.net/men_wen/article/details/62075751
Redis中的事务(transaction)是一组命令的集合。事务同命令一样都是Redis中的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
事务的原理是先将属于一个事务的命令发送给Redis,然后在让Redis一次执行这些命令。
MULTI
标记一个事务块的开始。 随后的指令将在执行EXEC时作为一个原子执行。
EXEC
执行事务中所有在排队等待的指令并将链接状态恢复到正常 当使用WATCH 时,只有当被监视的键没有被修改,且允许检查设定机制时,EXEC会被执行。
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 。
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
2
3
4
5
6
7
8
9
10
11
DISCARD
取消一个事务中所有在排队等待的指令,并且将连接状态恢复到正常。
如果已使用WATCH,DISCARD将释放所有被WATCH的key。
2
3
4
5
6
7
8
9
10
语法错误:命令不存在或命令参数个数不对。只要有一个命令有语法错误,执行EXEC命令后就会直接返回错误,语法正确的命令也不会执行。
2
3
4
5
6
7
8
9
10
11
12
运行错误:运行错误指在命令执行时出现错误。如果事务里的一个命令出现运行错误,事务里其他命令依然会继续执行。
2
3
4
5
6
7
8
9
10
11
12
13
14
在关系数据库事务提供回滚(rollback)功能,但是redis不支持,因为redis在事务上保持简洁和快速。
PING [message]
如果后面没有参数时返回PONG,否则会返回后面带的参数。
这个命令经常用来测试一个连接是否还是可用的,或者用来测试一个连接的延时。
2
3
4
ECHO message
返回消息。
2
QUIT
请求服务器关闭连接。连接将会尽可能快的将未完成的客户端请求完成处理。
2
3
4
5
AUTH
为redis服务请求设置一个密码。redis可以设置在客户端执行commands请求前需要通过密码验证。通过修改配置文件的requirepass就可以设置密码。 如果密码与配置文件里面设置的密码一致,服务端就会发会一个OK的状态码,接受客户端发送其他的请求命令,否则服务端会返回一个错误码,客户端需要尝试使用新的密码来进行连接。
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT
选择一个数据库,下标值从0开始,一个新连接默认连接的数据库是DB0。
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 //取消被监控的键 OK1
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) 01
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) 01
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
相关文章推荐
- redis学习笔记5,键值相关命令+Redis高级使用特性
- Redis学习笔记2--Redis数据类型及相关命令
- Redis学习笔记 (四) 之KEY相关命令
- redis学习笔记---redis特性(expire、事务、数据排序、config命令)
- Redis学习笔记2--Redis数据类型及相关命令
- Redis 学习笔记(二):数据类型与相关命令
- redis命令学习笔记
- Redis之KEY操作命令 【学习笔记】
- llvm 学习笔记 3:相关命令
- ORACLE数据库安全相关命令学习笔记
- 四 redis学习笔记之事务
- redis学习-5种数据类型和相关命令
- Redis命令学习-Transaction(事务)
- Linux之ubuntu学习笔记(二):一些常用快捷键和相关命令来控制系统任务ctr+z,ctr+c,ctrl+d
- TQ2440 学习笔记—— 6、Windows、Linux环境下相关工具、命令的使用
- redis命令,学习笔记
- Linux学习笔记-日志查看相关命令
- python3.4学习笔记(二十四) Python pycharm window安装redis MySQL-python相关方法
- Redis学习笔记-Java连接Redis
- 「Redis学习笔记」事务和错误处理