redis的发布订阅系统有点类似于我们生活中的电台,电台可以在某一个频率上发送广播,而我们可以接收任何一个频率的广播,Android中的broadcast也和这类似。
订阅消息的方式如下:
127.0.0.1:6379> SUBSCRIBE c1 c2 c3
Reading messages… (press Ctrl-C to quit)
-
“subscribe”
-
“c1”
-
(integer) 1
-
“subscribe”
-
“c2”
-
(integer) 2
-
“subscribe”
-
“c3”
-
(integer) 3
这个表示接收c1,c2,c3三个频道传来的消息,发送消息的方式如下:
127.0.0.1:6379> PUBLISH c1 “hello redis!”
(integer) 1
当c1这个频道上有消息发出时,此时在消息订阅控制台可以看到如下输出:
-
“message”
-
“c1”
-
“hello redis!”
在redis中,我们也可以使用模式匹配订阅,如下:
127.0.0.1:6379> PSUBSCRIBE c*
Reading messages… (press Ctrl-C to quit)
-
“psubscribe”
-
“c*”
-
(integer) 1
此时可以接收到所有以c开头的频道发来的消息。
tips
redis中的发布订阅系统在某些场景下还是非常好用的,但是也有一些问题需要注意:由于网络在传输过程中可能会遭遇断线等意外情况,断线后需要进行重连,然而这会导致断线期间的数据丢失。
既然redis是一种NoSQL数据库,那它当然也有事务的功能,不过这里的事务和我们关系型数据库中的事务有一点点差异。
redis中事务的用法非常简单,我们通过MULTI命令开启一个事务,如下:
127.0.0.1:6379> MULTI
OK
在MULTI命令执行之后,我们可以继续发送命令去执行,此时的命令不会被立马执行,而是放在一个队列中,如下:
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
当所有的命令都输入完成后,我们可以通过EXEC命令发起执行,也可以通过DISCARD命令清空队列,如下:
127.0.0.1:6379> EXEC
-
OK
-
OK
-
OK
事务中的异常情况
redis中事务的异常情况总的来说分为两类:
1.进入队列之前就能发现的错误,比如命令输错;
2.执行EXEC之后才能发现的错误,比如给一个非数字字符加1;
那么对于这两种不同的异常,redis中有不同的处理策略。对于第一种错误,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务(这个是2.6.5之后的版本做法,之前的版本做法小伙伴可以参考官方文档)。如下:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set kv1 v1
QUEUED
127.0.0.1:6379> set k2 v2
QUEUED
127.0.0.1:6379> set k3 v3 3 3
QUEUED
127.0.0.1:6379> set k4 v4
QUEUED
127.0.0.1:6379> EXEC
-
OK
-
OK
-
(error) ERR syntax error
-
OK
127.0.0.1:6379> keys *
-
“k4”
-
“k2”