流水线
Redis的流水线特性:这个特性允许客户端把任意多条Redis命令请求打包在一起,然后一次性的全部发送给服务器,而服务器则会在流水线包含的所有命令请求处理完毕之后,一次性的将它们的执行结果全部返回给客户端。
通过使用流水线特性,我们可以将执行多条命令所需的网络通信次数从 N N N 次降低到 1 次,这可以大幅度减少程序在网络通信方面耗费的时间,使得程序的执行效率得到显著的提升。
事务
Redis事务保障了多条命令执行的情况下,要么全部执行成功,要么全都不执行。
MULTI:开启事务
使用MULTI命令可以开启Redis事务支持。一般情况下除了少数阻塞命令外,Redis命令总会立即执行,但是当开启事务后,所有输入的命令都不会立即执行,而是按顺序放入一个事务队列中,等待事务执行时再统一执行。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET test "hello world"
QUEUED
127.0.0.1:6379> SADD fruits "apple" "banana" "cherry"
QUEUED
如上所示,服务器在客户端发送的命令放入事务队列之后,会返回一个 QUEUED 作为结果。
EXEC:执行事务
在使用 MULTI 命令开启事务并将任意多个命令放入事务队列之后,用户就可以使用 EXEC命令来执行事务了:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET test "hello world"
QUEUED
127.0.0.1:6379> SADD fruits "apple" "banana" "cherry"
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 3
当事务成功执行时,EXEC命令将返回一个列表作为结果,这个列表会按照命令的入队顺序依次包含各个命令的执行结果。
DISCARD:放弃事务
如果用户在开启事务之后,不想执行事务了,则可以使用如下命令放弃事务:
DISCARD
事务的安全性
人们一般都会根据数据库的ACID性质的支持程度去判断数据库的事务是否安全。
具体来说,Redis的事务总是具有ACID性质中的A、C、I性质:
- 原子性(Atomic):如果事务成功执行,那么事务中包含的所有命令都会被执行;相反,如果事务执行失败,那么事务中包含的所有命令都不会被执行。
- 一致性(Consistent):Redis服务器会对事务及其包含的命令进行检查,确保无论事务是否执行成功,事务本身都不会对数据库造成破坏。
- 隔离性(Isolate):每个Redis客户端都拥有自己独立的事务队列,并且每个Redis事务都是独立执行的,不同事务之间不会互相干扰。
除此之外,当Redis服务器运行在持久化模式之下时,Redis的事务也具有ACID中的D性质:
- 持久性(Durable):当事务执行完毕时,它的结果将被存储到硬盘中,即使服务器在此之后停机,事务对数据库所做的修改也不会丢失。
因为事务在执行时会独占服务器,所以用户应该避免在事务中执行过多命令,更不要将一些需要大量计算的命令放入事务中,以免造成服务器阻塞。
WATCH:对键进行监视
客户端可以通过执行 WATCH 命令,要求服务器对一个或多个数据库键进行监视,如果在客户端尝试执行事务之前,这些键的值发生了变化,那么服务器将拒绝执行客户端发送的事务,并向它返回空值:
WATCH key [key ... ]
127.0.0.1:6379> WATCH msg
OK
127.0.0.1:6379> GET msg
"hello world"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET user::1::email "peter@123.com"
QUEUED
127.0.0.1:6379> SET msg "hello redis"
QUEUED
127.0.0.1:6379> EXEC
(nil) -- msg键已被修改
UNWATCH:取消对键的监视
使用UNWATCH命令可以取消对键的监视:
UNWATCH
上一篇:Redis学习手册11—自动过期