Redis发布订阅
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
redis 的发布订阅系统有点类似于我们生活中的电台,电台可以在某一个频率上发送广播,而我们可以接收任何一个频率的广播。
举例
订阅消息
127.0.0.1:6379> subscribe chat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "chat"
3) (integer) 1
订阅之后可以接收到chat发送的消息。
发布消息
先重新开启个 redis 客户端,然后在同一个频道 chat 发布消息,订阅者就能接收到消息。
127.0.0.1:6379> PUBLISH chat "hello,wellcome to suscribe me's!!! "
(integer) 1
订阅者接收到消息如图所示:
在 redis 中,我们也可以使用模式匹配订阅,如下:
127.0.0.1:6379> PSUBSCRIBE c*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "c*"
3) (integer) 1
发布订阅其他命令参考官方文档
事务
Redis事务使用分三个步骤:
- 开始事务
- 命令入队(执行相关命令)
- 执行事务(执行相关命令)
举例
- 开始事务
127.0.0.1:6379> MULTI
OK
- 执行相关命令,命令不会马上执行,而是入队等执行命令
EXEC
时依次执行。
127.0.0.1:6379> SET name "redis"
QUEUED
127.0.0.1:6379> SET type "nosql"
QUEUED
127.0.0.1:6379> GET name
QUEUED
- 执行事务,这时可以执行
EXEC
命令执行事务,也可以执行DISCARD
命令清空事务队列, 并放弃执行事务。
127.0.0.1:6379> EXEC
1) OK
2) OK
3) "redis"
事务中的错误
使用事务时可能会遇上以下两种错误:
- 事务在执行
EXEC
之前,入队的命令可能出错。比如语法错误。 - 事务在执行
EXEC
之后调用出错。比如将列表命令用在了字符串键上面。
第一种错误举例:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR k1 k2 k3
(error) ERR wrong number of arguments for 'incr' command
127.0.0.1:6379> SET k6 v6
QUEUED
127.0.0.1:6379> EXEC
(error) EXECABORT Transaction discarded because of previous errors.
以上例子当命令在入队时产生错误, 错误会立即被返回给客户端:
因为调用 INCR 命令的参数格式不正确, 所以这个 INCR 命令入队失败。
服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务(Redis 2.6.5以后版本)。
第二种错误举例:
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> set k1 v1
QUEUED
127.0.0.1:6379> set k2 v2 v2
QUEUED
127.0.0.1:6379> set k3 v3
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (error) ERR syntax error
3) OK
127.0.0.1:6379>
127.0.0.1:6379> GET k1
"v1"
127.0.0.1:6379> GET k3
"v3"
127.0.0.1:6379> GET k2
(nil)
以上例子错误是因为将列表命令用在了字符串键。
对于这种错误:
最重要的是记住这样一条, 即使事务中有某条/某些命令执行失败了, 事务队列中的其他命令仍然会继续执行 —— Redis 不会停止执行事务中的命令。
从上面的第二个例子可以看出Redis事务在出现错误时并没有像Mysql那样回滚(以下官方解释):
Redis 命令只会因为错误的语法而失败(并且这些问题不能在入队时发现),或是命令用在了错误类型的键上面:这也就是说,从实用性的角度来说,失败的命令是由编程错误造成的,而这些错误应该在开发的过程中被发现,而不应该出现在生产环境中。
因为不需要对回滚进行支持,所以 Redis 的内部可以保持简单且快速。
WATCH命令
WATCH
命令可以为 Redis 事务提供 check-and-set (CAS)行为。
被 WATCH 的键会被监视,并会发觉这些键是否被改动过了。 如果有至少一个被监视的键在 EXEC 执行之前被修改了, 那么整个事务都会被取消, EXEC
返回nil-reply来表示事务已经失败(此时被监控的键会被自动UNWATCH
)。
127.0.0.1:6379> SET k1 1
OK
127.0.0.1:6379> WATCH k1
OK
127.0.0.1:6379> SET k1 3
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> EXEC
(nil)
127.0.0.1:6379> GET k1
"3"
UNWATCH
可以取消对键的监控。
127.0.0.1:6379> SET k1 1
OK
127.0.0.1:6379> WATCH k1
OK
127.0.0.1:6379> UNWATCH
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> INCR k1
QUEUED
127.0.0.1:6379> EXEC
1) (integer) 2
127.0.0.1:6379> GET k1
"2"