(九)redis事物+发布订阅模式

(一)事务

  • 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 客户端可以订阅任意数量的频道。

猜你喜欢

转载自blog.csdn.net/lss446937072/article/details/109609024