Redis 命令:发布订阅和事务


Redis 发布订阅

Redis的发布/订阅(pub/sub)是一种消息通信模式,发送者(发布者)发送消息,接收者(订阅者)接收消息。

发布者通过PUBLISH命令向指定的频道发送消息,订阅者通过SUBSCRIBE命令订阅自己感兴趣的频道。

这种模式可以用于实现进程间的消息传递,传递消息的通道称为channel。

在Redis中,客户端可以订阅任意数量的频道。当有新消息通过PUBLISH命令发送给频道时,这个消息就会被发送给订阅它的客户端。

发布/订阅实际上是一个轻量的队列,只不过数据不会被持久化,一般用来处理实时性较高的异步消息。

在Redis中,发布订阅模式的主要应用场景包括:

  1. 实时通信:例如,聊天室、实时提醒、实时广播等应用,需要实现实时通信的功能。
  2. 分布式通知:例如,在分布式系统中,某个节点的变动可能需要通知到其他节点,这时候就可以采用发布订阅模式。
  3. 消息队列:发布订阅模式也可以作为一种消息队列的实现方式,可以实现生产者和消费者的模式。

然而,需要注意的是,Redis的发布订阅模式有一个缺点,就是消息不能持久化。也就是说,一旦Redis服务器重启或者出现故障,之前发布的消息就会丢失。因此,如果需要保证消息的持久性,可能需要采用其他的消息存储方案,如RabbitMQ等。

示例

以下是一个简单的Redis发布订阅示例:

假设有两个频道,channel1和channel2,以及两个订阅者,sub1和sub2。

  1. 订阅者sub1订阅了channel1:

SUBSCRIBE channel1

  1. 订阅者sub2订阅了channel2:

SUBSCRIBE channel2

  1. 发布者发布消息到channel1:

PUBLISH channel1 "Hello, world!"

  1. 发布者发布消息到channel2:

PUBLISH channel2 "Goodbye, world!"

在这个例子中,sub1会接收到"Hello, world!"的消息,而sub2会接收到"Goodbye, world!"的消息。这就是发布订阅模式的基本工作原理。

Redis 发布订阅命令

以下的图表展示了 redis 发布订阅常用命令:

命令 描述
SUBSCRIBE 订阅给定的一个或多个频道的信息
UNSUBSCRIBE 退订给定的频道
PSUBSCRIBE 订阅一个或多个符合给定模式的频道
PUNSUBSCRIBE 退订所有给定模式的频道
PUBLISH 将信息发送到指定的频道

Redis 事务

Redis的事务是一个能保证一系列命令在执行过程中不会被其他客户端的命令插入的执行序列,并且这个执行序列是顺序性和排他性的。

事务的概念是一组命令的集合,它支持一次执行多个命令,在事务执行过程中,其他客户端提交的命令请求不会插入到事务执行命令序列中。事务在Redis中是原子的,这意味着在一个事务中的所有命令都会被序列化,并且作为一个单独的执行单元被执行。事务从开始到执行会经历以下三个阶段:开始事务,命令入队和执行事务。

需要注意的是,虽然Redis事务可以一次执行多个命令,但是它并不支持事务内的查询要看到事务里的更新,事务外查询不能看到。另外,Redis事务没有隔离级别,并且不支持回滚机制。

示例

以下是一个Redis事务的示例:

  1. 开启一个新的事务:
MULTI
  1. 执行事务中的第一条命令:
SET t1 "Hello"

此时命令并没有立即执行,而是存于事务的命令队列。
3. 执行一个新的命令:

SET t2 "World"

这个命令也被存于事务的命令队列。
4. 执行事务命令队列中的所有命令:

EXEC

此时,队列中的命令结果得到返回,你可能会看到类似以下的返回:

1) OK
2) OK

这些返回结果表示,“SET t1 “Hello”” 和 “SET t2 “World””这两条命令都成功执行了。

请注意,如果在事务中存在失败的命令,例如“SET t3 $(无法获取值的变量)”,那么整个事务将会失败,之前的命令结果也不会被保存。

Redis 事务命令

以下的图表展示了 redis 事务的相关命令:

命令 描述
DISCARD 取消事务,放弃执行事务块内的所有命令。
EXEC 执行所有事务块内的命令。
MULTI 标记一个事务块的开始。
UNWATCH 取消 WATCH 命令对所有 key 的监视。
WATCH key [key …] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

猜你喜欢

转载自blog.csdn.net/m0_62617719/article/details/133149717