Redis学习(发布订阅和事务)

Redis发布和订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis
客户端可以订阅任意数量的频道。

Redis发布订阅命令
命令描述
psubscribe pattern[…]订阅一个或多个符合给定模式的频道。
pubsub subcommand argument[…]查看订阅与发布系统状态。
publish channel message将信息发送到指定的频道上
punsubscribe pattern[…]退订所有的给定模式的频道
subscribe channel[…]订阅一个或多个给定的频道
unsubscribe channel退订给定的频道
客户端订阅消息
  • 订阅消息
127.0.0.1:6379> subscribe a1 a2 a3
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "a1"
3) (integer) 1
1) "subscribe"
2) "a2"
3) (integer) 2
1) "subscribe"
2) "a3"
3) (integer) 3

  • 再开一个redis客户端,在对应的频道发送消息
127.0.0.1:6379> publish a1 "hello a1"
(integer) 1
127.0.0.1:6379> publish a2 "hello a2"
(integer) 1
127.0.0.1:6379> publish a3 "hello a3"
(integer) 1
127.0.0.1:6379> 
  • 客户端订阅者会接收到消息
1) "message"
2) "a1"
3) "hello a1"
1) "message"
2) "a2"
3) "hello a2"
1) "message"
2) "a3"
3) "hello a3"
模式订阅消息
  • 客户端订阅者可以一次订阅一个模式下的频道
127.0.0.1:6379> psubscribe a*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "a*"
3) (integer) 1
  • 发送消息
127.0.0.1:6379> publish a4 "recieved ?"
(integer) 1
127.0.0.1:6379> publish a3 "recieved a3"
(integer) 2
127.0.0.1:6379> 
  • 订阅者接收消息
1) "pmessage"
2) "a*"
3) "a4"
4) "recieved ?"
1) "pmessage"
2) "a*"
3) "a3"
4) "recieved a3"
Redis事务

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证:

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段:

  • 开始事务。
  • 命令入队。
  • 执行事务。
Redis事务常用命令
命令描述
multi开始事务
exec执行所有事务块内的命令
discard取消事务块的所有命令
watch key[…]监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
unwatch取消watch命令对所有key的监视
Redis事务执行流程
  • 执行multi命令,开始事务
127.0.0.1:6379> multi
OK
127.0.0.1:6379> 
  • 命令入队(此时发送命令命令不会立刻执行,而是会进入到一个队列中)
127.0.0.1:6379> set name zhangsan
QUEUED
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> set sex 男
QUEUED
127.0.0.1:6379> 
  • exec(执行之前入队的命令)
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
Redis事务异常
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a aa
QUEUED
127.0.0.1:6379> set b bb
QUEUED
127.0.0.1:6379> set c cc
QUEUED
127.0.0.1:6379> set d dd1 dd2 //这条命令错误,此时在入队时看不出什么异常
QUEUED
127.0.0.1:6379> set e ee  
QUEUED
127.0.0.1:6379> 
  • exec 执行事务
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
4) (error) ERR syntax error //这个失败
5) OK			//后续依然可以执行
127.0.0.1:6379> keys [a-e]
1) "b"
2) "a"
3) "e"
4) "c"
127.0.0.1:6379> 

注意:单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。
Redis事务可以理解为一个打包的批量执行脚本,但批量指令并非原子化的操作,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不执行。

watch

watch命令可以监控一个或多个键,一旦(在监控中)其中有一个键被修改(或删除),之后的事务就不会再执行。监控一直持续到exec命令(执行,在multi命令后可以修改watch监控的键值)。当watch命令执行后监控的键被修改,事务不会执行。

  • demo1
127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> watch key1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key2 v2
QUEUED
127.0.0.1:6379> set key3 v3
QUEUED
127.0.0.1:6379> rename key1 key11
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK
  • demo2
127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> watch key1
OK
127.0.0.1:6379> rename key1 key11
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set key11 v11
QUEUED
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379> 

总结:在使用watch对某个键进行监控的过程中(在开始事务之前),这个键值对不能被更新(修改或删除),一旦被更新,事务就不会在执行,并且会自动取消对这个键的监控。

unwatch

取消对键的监控

127.0.0.1:6379> set key1 v1
OK
127.0.0.1:6379> watch key1 //进行监控
OK
127.0.0.1:6379> rename key1 k1  //在监控中修改了键的名称
OK
127.0.0.1:6379> unwatch  //取消监控
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set k1 v11  
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get k1
"v11"
127.0.0.1:6379> 
discard
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set a aa
QUEUED
127.0.0.1:6379> set b bb
QUEUED
127.0.0.1:6379> set c cc
QUEUED
127.0.0.1:6379> discard  //取消事务块中的所有命令
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值