Redis发布订阅和事务

Redis数据类型和常用配置https://blog.csdn.net/projectNo/article/details/119733596
Redis发布订阅和事务https://blog.csdn.net/projectNo/article/details/119818581
Redis持久化https://blog.csdn.net/projectNo/article/details/119861861
Redis主从复制和哨兵模式https://blog.csdn.net/projectNo/article/details/119861873
Redis集群https://blog.csdn.net/projectNo/article/details/119893021

Redis

Redis 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。

发布和订阅

什么是发布和订阅

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

客户端可以订阅任意数量的频道。客户端发送消息需要指定消息频道和内容,订阅者根据频道接收消息,一个频道可被多个客户端订阅。

发布订阅命令

1、打开一个客户端订阅channel1

subscribe channel1

输出以下信息并保持连接

127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1

2、打开另一个客户端,给channel1发布消息hello

publish channel1 hello

3、在第一个客户端看到消息输出

127.0.0.1:6379> subscribe channel1
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "hello"

注意:发布的消息没有持久化,订阅的客户端只能收到订阅后发布的消息,就好比看不了打开手机之前的直播内容,如果做了持久化就可以,类似于看直播的回放。

Redis事务

1、简介

Redis事务是一个独立隔离独操作,可以一次性执行多个命令,事务中的所有命令都会序列化且按顺序进行,主要有以下三个保证:

  • 批量操作执行前命令被放入队列缓存
  • 收到EXEC执行命令后进入事务,事务中的任意命令执行失败,其他的命令依然会执行
  • 事务在执行的过程中,客户端提交的其他命令请求不会被插入到事务执行命令序列中

一个事务从开始执行会经历三个阶段:

  • 开始事务
  • 命令入队
  • 执行事务

2、事务命令Multi、Exec、Discard

从输入Multi命令后,后面输入的命令都会一次进入命令队列中,但不会执行,直到输入Exec后,Redis会吧命令队列中的命令依次执行。组队过程中可以通过Discard来放弃组队。

3、正常执行

(1)事务正常执行

127.0.0.1:6379> set name marry
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> set sex 1
QUEUED
127.0.0.1:6379> exec
1) OK
2) OK
3) OK

(2)取消组队

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name marry
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> set sex 1
QUEUED
127.0.0.1:6379> discard
OK

4、事务的错误处理

(1)组队时报错,所有命令都不会执行

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name marry
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> set sex
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

(2)执行阶段报错,只有报错的命令不执行,其他命令会被执行,不会回滚

127.0.0.1:6379> multi
OK
127.0.0.1:6379> set name marry
QUEUED
127.0.0.1:6379> incr name
QUEUED
127.0.0.1:6379> set age 20
QUEUED
127.0.0.1:6379> exec
1) OK
2) (error) ERR value is not an integer or out of range
3) OK

5、watch和unwatch

用watch监听key,被监听的key如果在事务开启后被修改了值,则执行失败

打开两个客户端,新加一个String类型数据,key为num,value为200,然后在客户端1监听num。

客户端1:

127.0.0.1:6379> set num 200
OK
127.0.0.1:6379> keys *
1) "num"
127.0.0.1:6379> watch num
OK

客户端2:

127.0.0.1:6379> keys *
1) "num"

然后在客户端1中开启事务,并加入命令不执行,在客户端2中修改num的值

客户端1:

127.0.0.1:6379> set num 200
OK
127.0.0.1:6379> keys *
1) "num"
127.0.0.1:6379> watch num
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> incrby num 20
QUEUED

在客户端2中修改num的值:

127.0.0.1:6379> keys *
1) "num"
127.0.0.1:6379> incr num
(integer) 201

然后在客户端1中执行事务,则不成功。

127.0.0.1:6379> exec
(nil)

用unwatch命令可以取消监听。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值