redis事务、管道及发布订阅

news2025/2/22 22:23:14

目录

redis事务

1、redis事务命令

2、示例

redis管道

1、管道命令

2、示例 

redis发布订阅

1、发布者(Publisher)

2、订阅者(Subscriber)

3、示例


redis事务

在Redis中,事务是一组命令的有序队列,可以一次执行多个命令,本质是一组命令的集合。一个

事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入。 

redis事务与数据库事务对比

单独的隔离操作Redis的事务仅仅是保证事务里的操作会被连续独占的执行,redis命令执行是单线程架构,在执行完事务内所有指令前是不可能再去同时执行其他客户端的请求的
没有隔离级别的概念因为事务提交前任何指令都不会被实际执行,也就不存在"事务内的查询要看到事务里的更新,在事务外查询不能看到"这种问题了
不保证原子性Redis的事务不保证原子性,也就是不保证所有指令同时成功或同时失败,只有决定是否开始执行全部指令的能力,没有执行到一半进行回滚的能力
排它性Redis会保证一个事务内的命令依次执行,而不会被其它命令插入
1、redis事务命令
DISCARD取消事务,放弃执行事务块内的所有命令。
EXEC执行所有事务块内的命令。
MULTI标记、个事务块的开始。
UNWATCH取消WATCH命令对所有key的监视。
WATCH key [key ...]监视一个(或多个)key,如果在事务执行之前这个(或这些)key被其他命令所改动,那么事务将被打断。
2、示例

正常执行:

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379(TX)> set k1 1
QUEUED
127.0.0.1:6379(TX)> set k2 2
QUEUED
127.0.0.1:6379(TX)> set k3 3
QUEUED
127.0.0.1:6379(TX)> INCR count
QUEUED
127.0.0.1:6379(TX)> EXEC
1) OK
2) OK
3) OK
4) (integer) 1
127.0.0.1:6379> get k1
"1"

 放弃事务:multi  discard

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> incr count 
QUEUED
127.0.0.1:6379(TX)> discard
OK
127.0.0.1:6379> get k1
"1"

全体连坐,错一个所有的命令都不执行

127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> set k2 v2
QUEUED
127.0.0.1:6379(TX)> set k3
(error) ERR wrong number of arguments for 'set' command
127.0.0.1:6379(TX)> exec
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get k1
"1"

冤头债主,错误的命令不执行,正确的执行

127.0.0.1:6379> del meail
(integer) 1
127.0.0.1:6379> set emial 1@qq.com
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 v1
QUEUED
127.0.0.1:6379(TX)> incr emial
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) (error) ERR value is not an integer or out of range
127.0.0.1:6379> get k1
"v1"

所以事务执行时报错不会像数据库要么成功要么都不执行

watch监控:Redis使用watch来提供乐观锁定,类似于CAS(Check-and-Set)watch命令是一种乐观锁的实现,Redis在修改的时候会检测数据是否被更改,如果更改了,则执行失败

正常情况

127.0.0.1:6379> set balance 100
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get balance
"100"
127.0.0.1:6379> watch balance
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379(TX)> set k1 a1
QUEUED
127.0.0.1:6379(TX)> set balance 110
QUEUED
127.0.0.1:6379(TX)> get k1
QUEUED
127.0.0.1:6379(TX)> get balance
QUEUED
127.0.0.1:6379(TX)> exec
1) OK
2) OK
3) "a1"
4) "110"

异常情况,在监控下修改


unwatch放弃监控

 注意:一旦执行了exec之前加的监控锁都会被取消掉了,当客户端连接丢失的时候(比如退出链

接),所有东西都会被取消监视。

redis管道

问题:如果同时需要执行大量的命令,那么就要等待上一条命令应答后再执行,这中间不仅仅多了RTT(Round Time Trip),而且还频繁调用系统IO,发送网络请求,同时需要redis调用多次read()和write()系统方法,系统方法会将数据从用户态转移到内核态,这样就会对进程上下文有比较大的影响。

管道(pipeline)可以一次性发送多条命令给服务端,服务端依次处理完完毕后,通过一条响应一次性将结果返回,通过减少客户端与redis的通信次数来实现降低往返延时时间。pipeline实现的原理是队列,先进先出特性就保证数据的顺序性。

1、管道命令
#docker操作
cat cmd.txt | docker exec -i redis2 redis-cli -a 123456 --pipe

#linux系统操作
cat cmd.txt | redis-cli -a 123456 --pipe
2、示例 

 将你要执行的命令写入一个文件里

管道pipeline与原生命令对比

原生批量命令是原子性(例如:mset,mget),pipeline是非原子性。

原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令。

原生批命令是服条端实现,而pipeline需要服务端与客户端共同完成。

管道pipeline与事务对比

事务具有原子性,管道不具有原子性。

管道一次性将多条命令发送到服务器,事务是一条一条的发,事务只有在接收到exec命令后才会执行,管道不会。

执行事务时会阻塞其他命令的执行,而执行管道中的命冬时不会

使用管道pipeline注意事项 

pipeline缓冲的指令只是会依次执行,不保证原子性,如果执行中指令发生异常,将会继续执行后续的指令。

使用pipeline组装的命令个数不能太多,不然数据量过大客户端阻塞的时间可能过久,同时服务端此时也被迫回复一个队列答复,占用很多内存。

redis发布订阅

Redis提供了发布订阅(Pub/Sub)模式,允许不同的客户端之间通过消息传递进行通信。在发布订阅模式中,有两个主要角色:发布者(Publisher)和订阅者(Subscriber)。

发布订阅命令

1、发布者(Publisher)

PUBLISH命令: 发布者使用PUBLISH命令将消息发送到指定的频道其中

PUBLISH channel message

channel 是消息的频道,message 是要发送的消息内容。

2、订阅者(Subscriber)

SUBSCRIBE命令: 订阅者使用SUBSCRIBE命令订阅一个或多个频道。

SUBSCRIBE channel

订阅者可以通过多次调用SUBSCRIBE命令订阅多个频道。

UNSUBSCRIBE命令: 订阅者使用UNSUBSCRIBE命令取消对一个或多个频道的订阅。

UNSUBSCRIBE [channel [channel ...]]

如果不提供频道参数,订阅者将取消对所有频道的订阅。

PSUBSCRIBE命令: 订阅者使用PSUBSCRIBE命令订阅一个或多个符合指定模式的频道。

PSUBSCRIBE pattern

PUNSUBSCRIBE命令: 订阅者使用PUNSUBSCRIBE命令取消对一个或多个符合指定模式的频道的订阅。

PUNSUBSCRIBE [pattern [pattern ...]]
3、示例

创建3个对话窗口,1号窗口订阅c1,2号窗口订阅c1,c2

#1号窗口订阅c1
127.0.0.1:6379> subscribe c1
1) "subscribe"
2) "c1"
3) (integer) 1

#2号窗口订阅c1,c2
127.0.0.1:6379> subscribe c1 c2
1) "subscribe"
2) "c1"
3) (integer) 1
1) "subscribe"
2) "c2"
3) (integer) 2

#3号窗口发布消息
127.0.0.1:6379> publish c1 hello
(integer) 2


#1号窗口收到消息
127.0.0.1:6379> subscribe c1
1) "subscribe"
2) "c1"
3) (integer) 1
127.0.0.1:6379(subscribed mode)> 
1) "message"
2) "c1"
3) "hello"


#2号窗口收到消息
127.0.0.1:6379> subscribe c1 c2
1) "subscribe"
2) "c1"
3) (integer) 1
1) "subscribe"
2) "c2"
3) (integer) 2
1) "message"
2) "c1"
3) "hello"

 在发布端查看

 PUBSUB CHANNELS:命令用于列出当前存在的频道

127.0.0.1:6379> pubsub channels
1) "c1"
2) "c2"

pubsub numsub:某个频道有几个订阅者 

127.0.0.1:6379> pubsub numsub c1
1) "c1"
2) (integer) 2

 PUBSUB NUMPAT:只统计使用PSUBSCRIBE命令执行的,返回客户端订阅的唯一模式的数量

 取消订阅

127.0.0.1:6379(subscribed mode)> unsubscribe c* c?
1) "unsubscribe"
2) "c*"
3) (integer) 1
1) "unsubscribe"
2) "c?"
3) (integer) 0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1256209.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Doris单机部署——2.0.1.1版本

目录 一、前期准备工作 1.设置系统最大文件打开句柄数 2.时钟同步 3.关闭每台机器的交换分区 4.下载安装包 二、单节点部署安装Doris (一)安装fe 1.解压改名 2.修改配置文件 3.创建元数据目录 4.启动fe 5.访问fe的webUI (二)安装be 1.进入be目录下,修…

Idea常用的快捷键

快捷键 快速生成main()方法:psvm,回车 快速生成输出语句:sout,回车 ctrlz撤回,ctrlshiftz取消撤回 ctrlr替换 CtrlAltspace(内容提示,代码补全等) ctrl句号。最小化方法,恢复最小化方法。 …

在我国干独立游戏开发有多难?

游戏独立开发在中国,一直以来都是一条充满挑战的道路。尽管有着无限的激情和创意,但面对市场、资金、政策等多方面的困难,许多独立开发者在这条路上艰难前行。 首先,市场竞争激烈是中国游戏独立开发者面临的首要挑战。随着游戏产…

单片机学习7——定时器/计数器编程

#include<reg52.h>unsigned char a, num; sbit LED1 P1^0;void main() {num0;EA1;ET01;//IT00;//设置TMOD的工作模式TMOD0x01;//给定时器装初值&#xff0c;50000,50ms中断20次&#xff0c;就得到1sTH0(65536-50000)/256;TL0(65536-50000)%256;TR01; // 定时器/计数器启…

单调栈类型题

搞定八道高频算法题 一、如何找右边第一个比我小的元素 二、如何找右边第一个比我大的元素 三、如何找右边最后一个比我小的元素 四、如何找右边最后一个比我大的元素 五、如何找左边第一个比我小的元素 六、如何找左边第一个比我大的元素 七、如何找左边最后一个比我小的元素 …

RESTful API 架构快速入门 Flask实现

RESTful 简介 1.1 为什么要使用 RESTful 架构&#xff1f; Representational State Transfer&#xff08;REST&#xff09;是一种面向资源的架构风格&#xff0c;广泛应用于网络服务的设计和开发。使用RESTful架构有以下几个优点&#xff1a; 简单性和可扩展性&#xff1a; RE…

Oracle(2-6) Backup and Recovery Overview

文章目录 一、基础知识1、Categories of Failures 故障类别2、Causes of Statement Failures 语句失败的原因故障情况Resolutions 决议 3、User Process Failures 用户进程失败故障情况Resolutions 决议 4、Possible User Errors 用户错误类型故障情况Resolutions 决议 5、Inst…

第六届 传智杯初赛B组

文章目录 A. 字符串拼接&#x1f37b; AC code B. 最小差值&#x1f37b; AC code C. 红色和紫色&#x1f37b; AC code D. abb&#x1f37b; AC code E. kotori和素因子&#x1f37b; AC code F. 红和蓝&#x1f37b; AC code &#x1f970; Tips&#xff1a;AI可以把代码从 j…

056-第三代软件开发-软件打包

第三代软件开发-软件打包 文章目录 第三代软件开发-软件打包项目介绍软件打包1 下载 linuxdepoyqt 工具2 安装 linuxdepoyqt3 qmake配置4 打包程序 总结 关键字&#xff1a; Qt、 Qml、 linuxdeployqt、 Ubuntu、 AppImage 项目介绍 欢迎来到我们的 QML & C 项目&…

自建CA实战之 《0x03 代码签名》

自建CA实战之 《0x03 代码签名》 本文针对Windows平台&#xff0c;介绍如何使用自建CA来签发代码签名证书。 之前的文章中&#xff0c;我们介绍了如何自建CA&#xff0c;以及如何使用自建CA来签发Web服务器证书、客户端证书。 本文将介绍如何使用自建CA来签发代码签名证书。…

坚鹏:中国人寿临沂公司当下中国经济形势与寿险业发展机遇培训

中国人寿保险&#xff08;集团&#xff09;公司属国家大型金融保险企业&#xff0c;2016年中国人寿入主广发银行&#xff0c;开启保险、投资、银行三大板块协同发展新格局。2022年&#xff0c;集团公司合并营业收入站稳万亿平台&#xff1b;合并总资产突破6万亿元大关。中国人寿…

基恩士软件的基本操作(五,日志记录与使用)

目录 基恩士是如何保存日志的&#xff1f; 如何使用日志功能 查看DM10的值1秒加1的记录日志 设定id与储存位置 软元件设定&#xff08; 日志ID有10个&#xff08;0~10&#xff09;&#xff0c;每一个ID最多添加512个软元件&#xff09; 设定触发 执行日志的梯形图程序 触…

Windows 7隐藏用户测试

请注意Window 7是在虚拟机上安装的&#xff0c;ip是192.168.0.108。 下边都是在虚拟机Window 7上操作&#xff0c;直到最后远程连接才在自己本机Windows 11上操作。 需要同时按下Windowsr,然后输入cmd&#xff0c;再点击确定。 在命令上里边输入net user可以显示一下用户。 …

单链表原来是这样实现的!

文章目录 前言1. 链表的概念及结构1.1在链表里&#xff0c;每节“车厢”是什么样的呢&#xff1f;1.2为什么还需要指针变量来保存下⼀个节点的位置&#xff1f; 2. 单链表的实现1. 定义结构体(Seqlist)2. 打印函数(SLTPrint)小插曲&#xff0c;创建节点函数CreateNode3. 尾插函…

一种LED驱动专用控制电路

一、基本概述 TM1620是一种LED&#xff08;发光二极管显示器&#xff09;驱动控制专用IC,内部集成有MCU数字接口、数据锁存 器、LED驱动等电路。本产品质量可靠、稳定性好、抗干扰能力强。主要适用于家电设备(智能热 水器、微波炉、洗衣机、空调、电磁炉)、机顶盒、电子称、…

清分系统对账

流程1的问题&#xff1a; 1、通道一天的数据会有多少&#xff0c;有二三十万条交易数据吗&#xff1f; 2、如果数据过大都存到一个Map里面去&#xff0c;机器不得挂了 步骤1总结&#xff1a; 1、通过channelNo获取通道T的数据&#xff0c;因为通道是一天一个文件给过来。在转…

xxljob学习笔记01(小滴课堂)

分布式调度xxl-job源码部署和数据库建立&#xff1a; 在idea中打开安装包&#xff1a; 创建数据库&#xff1a; 建表&#xff1a; 在项目里&#xff1a; 在navicat里运行语句即可&#xff1a; 修改数据库地址和用户名&#xff0c;密码&#xff1a; 配置令牌&#xff0c;不然谁…

WiFi的CSMA/CA竞争窗口流程简述

1、若站点最初有数据要发送&#xff08;不是发送不成功再进行重传的那种&#xff09;&#xff0c;且检测到信道空闲&#xff0c;在等待DIFS后&#xff0c;就发送整个数据帧。 2、否则&#xff0c;站点执行退避算法。一旦检测到信道忙&#xff0c;就冻结退避计时器。只要信道空…

卸载idea2017-2023步骤 (卸载干净)

1. 右击打开软件所在位置 2. 找到卸载程序 Uninstall.exe, 双击打开 3. 开始卸载 4. 注册表删除 打开winR, 输入命令regedit Ctrl F查找 "jetbrain" 删除查找出来的文件夹。卸载干净, 即可安装新idea

【Amazon】基于Amazon提供的托管式EKS通过eksctl命令部署Kubernetes集群

文章目录 一、使用CloudFormation创建堡垒机二、安装AWS CLI命令行工具三、安装eksctl命令行工具四、创建集群角色4.1 集群服务角色创建4.2 集群节点组角色创建 五、创建 EKS集群六、登录EKS控制台七、参考链接 一、使用CloudFormation创建堡垒机 导航至CloudFormation&#xf…