Redis 发布订阅和事务

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"
原创文章 139 获赞 52 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_41262903/article/details/104233583