Redis的消息订阅及发布及事务机制
Redis的消息订阅及发布及事务机制
订阅发布
SUBSCRIBE PUBLISH
订阅消息队列及发布消息。
# 首先要打开redis-cli shell窗口 一个用于消息发布 一个用于消息订阅
# SUBSCRIBE 订阅一个频道,如果频道不存在 就新增一个
# 返回参数 表示 第一个是命令 第二个是频道名称 第三个表示当前订阅该频道的数量
127.0.0.1:6379> SUBSCRIBE mychannel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
# 在另外一个shell窗口 进行消息发布
127.0.0.1:6379> PUBLISH mychannel "hello world"
(integer) 1
# 在回到之前的shell 窗口 我们可以看到消息已经被订阅成功了
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychannel"
3) (integer) 1
# 下面是本次接受到消息
1) "message"
2) "mychannel"
3) "hello world"
UNSUBSCRIBE
UNSUBSCRIBE:取消订阅。
# 第三个返回值表示当前没有订阅者订阅该频道
127.0.0.1:6379> UNSUBSCRIBE mychannel
1) "unsubscribe"
2) "mychannel"
3) (integer) 0
PSUBSCRIBE PUNSUBSCRIBE
根据通配符进行订阅户或者取消订阅。
127.0.0.1:6379> PSUBSCRIBE my*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "my*"
3) (integer) 1
# 在另外一个Shell发布消息
127.0.0.1:6379> PUBLISH mychannel "hello world"
(integer) 1
127.0.0.1:6379> PUBLISH mynewchannel "hello world new"
(integer) 1
# 此时第一个Shell窗口就可以到如下的订阅消息
1) "pmessage"
2) "my*"
3) "mychannel"
4) "hello world"
1) "pmessage"
2) "my*"
3) "mynewchannel"
4) "hello world new"
事务
Redis支持事务,是基于4个基本指令。
- MULTI 开启事务
- EXEC 执行事务
- DISCARD 放弃事务
- WATHC 监控
MULTI EXEC
MULTI命令开启一个事务,执行MULTI之后,客户端可以向服务器发送多条指令,这些指令不会立即执行,而是被放入队列中,当执行EXEC时,队列中的所有命令才会被执行。
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> INCRBY age 3
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 1
2) (integer) 4
127.0.0.1:6379> get age
"4"
127.0.0.1:6379> del age
(integer) 1
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 18
QUEUED
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> INCRBY age 3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (integer) 19
3) (integer) 22
127.0.0.1:6379> get age
"22"
127.0.0.1:6379>
事务中错误的情况
- 如果是入队的时候就报错,那么即使在输入EXEC指令,事务也不会执行。
- 如果是入队成功,但是执行的时候报错,那么会执行正确的指令,错误的会被跳过,不会终止事务。
## 事务中出现错误的情况 入队错误 事务不执行
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
# 写错指令 出现错误提示
127.0.0.1:6379> INCR age 3
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get age
"22"
## 事务中出现错误的情况 入队正确 执行错误 事务正常执行
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> INCRBY age abc
QUEUED
127.0.0.1:6379> INCRBY age 4
QUEUED
127.0.0.1:6379> exec
1) (integer) 23
2) (error) ERR value is not an integer or out of range
3) (integer) 27
127.0.0.1:6379> get age
"27"
由第二错误示例可以看到,Redis的事务是不支持回滚的。这是因为Redis考虑到是失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,另外Redis不支持回滚能够保持Redis 的内部可以保持简单且快速。
DISCARD
放弃事务。
127.0.0.1:6379> get age
"22"
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR age
QUEUED
127.0.0.1:6379> DISCARD
OK
127.0.0.1:6379> get age
"22"
WATCH
Redis中的CAS操作。WATCH 使得 EXEC 命令需要有条件地执行: 事务只能在所有被监视键都没有被修改的前提下执行, 如果这个前提不能满足的话,事务就不会被执行。当执行EXEC指令后,对key的WATCH会被取消。
被 WATCH 的键会被“监控”,如果有任意一个或多个被监视的键在 EXEC 执行之前被修改了, 整个事务都会被取消, EXEC 返回nil-reply来表示事务已经失败。
# 第一个窗口
127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 19
QUEUED
# 在第二个窗口 设置
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> get age
"20"
# 在第一个窗口执行事务 因为age已经被更改了,所以本次事务执行失败
127.0.0.1:6379> EXEC
(nil)
## 被监控的Key没有变化时 事务可以正确执行
127.0.0.1:6379> get age
"20"
127.0.0.1:6379> WATCH age
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set age 25
QUEUED
127.0.0.1:6379> exec
1) OK
127.0.0.1:6379> get age
"25"
以上就是Redis中订阅发布及事务的的常用操作指令了,更多其他指令可以参考官网,Redis官网,谢谢阅读,希望对你有所帮助。