(一)事务
- edis 事务一次可以执行多条命令,服务器在执行命令期间,不会去执行其他客户端的命令请求。
- 事务中的多条命令被一次性发送给服务器,而不是一条一条地发送,这种方式被称为流水线,它可以减少客户端与服务器之间的网络通信次数从而提升性能。
- 所有的指令在exec之前不执行而是缓存在服务器的事物队列中,当收到exec指令,执行完毕后一次清返回所有的指令的运行结果
一个事务从开始到执行会经历以下三个阶段:
-
开始事务。multi
-
命令入队。(批量操作在发送 EXEC 命令前被放入队列缓存。)
-
执行事务。(收到 EXEC 命令后进入事务执行。事务中任意命令执行失败,其余命令依然被执行。也就是说 Redis 事务不保证原子性。)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr books
QUEUED
127.0.0.1:6379> incr books
QUEUED
127.0.0.1:6379> exec
1) (integer) 1
2) (integer) 2
127.0.0.1:6379> get books
"2"
127.0.0.1:6379>
discard(丢弃)指令。用于丢弃事物缓存队列中的所有指令,在exec执行之前
127.0.0.1:6379> get books
(nil)
127.0.0.1:6379> multi
OK
127.0.0.1:6379> get books
QUEUED
127.0.0.1:6379> get books
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379>
备注:由于事务在发送每个指令到事务缓存队列时都要经过一次网络读写,当命令比较多的时候比较耗时。所以redis的事务常与pipeline一起使用
watch指令。在事物开始之前盯住某个变量,当事务实行的时候,redis会检查关键变量自watch之后时候被改变,如果被改变exec指令就会返回null,通知客户端执行失败,这时候客户端一般会重试。
127.0.0.1:6379> watch books
OK
127.0.0.1:6379> incr books
(integer) 1
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incr books
QUEUED
127.0.0.1:6379> incr books
QUEUED
127.0.0.1:6379> exec
(nil) #事务执行失败
127.0.0.1:6379>
(二)发布订阅-PubSub
一般不用 Redis 做消息发布订阅。因为redis不支持消息的多播机制!!!
Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。
Redis 客户端可以订阅任意数量的频道。