【Java】分布式事务解决方案
分布式事务是指在分布式系统中,为了保证多个节点上的操作要么全部成功提交,要么全部失败回滚,所采取的一系列技术手段和协议。
CAP理论
在一个分布式系统中以下三个基本属性无法被同时满足:
- C(一致性):一致性是指写操作后的读操作可以读到最新的数据状态,当数据分布在多个节点上,从任意节点读取到的数据都是最新的状态。
- A(可用性):可用性是指任何事务操作都可以得到响应结果并且不会出现响应超时或者响应错误的情况发生。
- P(分区容错性):分区容错性是指通常分布式系统各个节点部署在不同的子网上,不可避免会出现由于网络问题而导致节点之间通信失败,但此时系统仍可对外提供服务。
CA without P:说明在流量飙升后,系统直接挂了,通常只适用于单机部署。
CP without A:系统优先考虑一致性和分区容忍性。这意味着在网络出现分区的情况下,为了保持数据的一致性,系统可能会暂时拒绝服务。
AP without C:系统更注重可用性和分区容忍性,即在网络分区期间仍然提供服务,但是可能牺牲了数据的一致性。
分布式事务中的相关概念
AP:应用程序,一般是指事务的发起者,定义事务内的操作。
RM:资源管理器。管理共享资源,提供资源访问接口,使得外部程序可以访问共享资源。
TM:分布式事务的协调者,接收AP的事务请求,与各个RM进行通信,协调并完成事务的处理。
全局事务:由TM协调和控制的跨多个RM和AP的事务。
分支事务:每个参与者的本地事务。
XA规范主要定义了事务管理器TM和资源管理器RM之间通信的接口规范。
解决方案
两阶段提交(2PC)
执行流程
2PC:两阶段提交协议,2是指两个阶段,P是指准备阶段,C是指提交阶段。将整个事务流程分为两个阶段,准备阶段,提交阶段。(这一部分在MySQL中也有。)
当AP准备提交时,TM会向RM发送prepare指令,RM就会去锁定资源(seata应当是数据库显式加行锁)。锁定好之后返回ok。当所有RM都返回ok后,TM再向所有的RM发送commit指令,各个RM再进行提交。提交成功返回ok,提交失败返回error。
一旦接收到error信息,TM就会向已经提交成功的RM发送rollback指令。
存在的问题
- 资源锁定问题:atomikos对应的AP和TM是集成在一块的,假设AP挂了,那TM也就挂了。TM挂了之后就会导致RM锁定的资源永远无法被提交或还原。
- 性能问题:如果有一个RM迟迟不返回ok/rollback,其他所有RM都要等待。会导致该请求迟迟没有结果
- 数据不一致问题:TM在给RM1和RM2发送指令的时候肯定不是同时发送的,如果给RM1发送完指令后TM挂掉,RM1和RM2的数据就会不一致。
三阶段提交(3PC)
执行流程
3pc三阶段提交协议。将整个事务流程分为三个阶段:cancommit precommit docommit
cancommit:向事务参与者询问是否能提交
precommit:通知参与者锁定资源
docommit:实际执行提交操作
3pc相对于2pc引入了超时机制。
- 在cancommit阶段,如果协调者在超时时间内未收到所有参与者通知的cancommit,那会向参与者发送abort指令表示放弃进入下一阶段。如果参与者超时,则直接终止本地事务
- 在precommit阶段,如果协调者在超时时间内未收到所有参与者的precommit结果,则会向参与者发送abort指令表示放弃进入下一阶段。如果参与者超时,则会提交事务。
优劣势
3pc相对于2pc的主要改动点:
- 引入新阶段-将2pc第一个阶段拆分成两个阶段
- 引入超时机制-在协调者和参与者中都引入超时机制。
3pc存在的问题:
- 性能瓶颈,因为3pc引入了一个新阶段,必然会产生更多的网络开销,性能表现不如2pc
- 数据不一致:由于precommit阶段假设参与者超时,本地事务会自动提交,会导致本应回滚的事务提交了,产生数据不一致。
TCC
全称是try-confirm-cancel
它将整个事务阶段分为三阶段,核心思想即针对每个业务操作,都要注册一个与其对应的确认和补偿的操作。
try:对各个服务的资源做检测以及对资源进行锁定或者预留。比如说对于一个订单需要扣减商品库存,此时不应该直接扣减库存,而是将这部分资源作为预留。
confirm:执行真正的业务操作,将try阶段预留的业务资源执行确认生效。
cancel:如果任何一个服务的业务方法执行出错,释放try阶段预留的业务资源。
执行流程
tcc场景:
系统有订单服务和商品服务,用户在下订单时,同时需要生成订单和扣减库存。
try阶段:
订单服务生成一个未生效的订单
商品服务设置预留库存=原预留库存+扣减库存数 实际库存数=原实际库存数-扣减库存数
confirm阶段:
订单服务将订单改为生效状态
商品服务设置预留库存=原预留库存-扣减库存数 实际库存数不变
cancel阶段:
订单服务将订单改为失效状态
商品服务设置预留库存=原预留库存-扣减库存数 实际库存数=原实际库存数+扣减库存数
实现上要注意:
- 业务操作要拆分为两阶段完成
- 允许空回滚:由于网络原因可能try阶段锁定资源没有锁定成功,此时会进入cancel阶段。这时不应该走原来的把订单改为失效状态的逻辑了,因为没有订单
- 防悬挂控制:由于网络原因先执行了cancel,再执行try,此时try中创建的订单就会一直留在库里没有操作。
- 幂等控制
优劣势
tcc优点:实现上更加灵活,性能上相对于2pc更加优越
tcc缺点:
- 业务侵入性高,业务操作需要实现确认和回滚逻辑
- 实现复杂,不是所有操作都可以分成两个阶段
- 非强一致性,补偿式事务。
本地消息表
执行流程
图上这个示例有点不是很清晰,还是用订单扣减库存这个例子。此时订单服务和商品服务之间使用消息队列进行通信。
本地消息表需要在数据库中创建一个消息处理用的消息表。
在订单服务创建订单后,向订单表写入一条扣减库存状态为发送中的消息,两个步骤在同一事务内。然后向mq推消息,商品服务订阅这个topic之后进行消费。
消费完又向消息队列中推送一条扣减库存成功topic的消息,此时订单服务作为消费者进行订阅监听,接收到消息后将消息表的状态改为已发送。
上述是整体流程。
消息发送会出现的问题:
- 订单表插入成功,发送消息到mq失败
- mq发送成功,但消息在mq内部被丢失
- 消费者消息出现异常或者消息丢失
实现上要注意:
- 商品服务需要确保处理消息时的幂等性
- 订单服务在推送消息的时候需要有重试机制,且需要设置最大重试次数
优劣势
实现缺点:
- 业务侵入度高
- 需要定时任务监听消息表的状态做补偿
- 基于数据库做本地消息表,性能较低。
MQ事务消息
执行流程
这里的半消息队列实际上没有消费者监听,所以可以暂时存储。
暂不打算深入研究rocketmq,所以放两篇博文在这,如果后续用到的时候可以参考。
RocketMQ发送消息原理(含事务消息)
深度剖析 RocketMQ 事务消息!
最大努力通知
执行流程
一个短信发送平台,背景是公司内部有多个业务都有发送短信的需求,如果每个业务独立实现短信发送功能,存在功能实现上的重复。
有一个短信平台项目,所有的业务方都接入这个短信平台,来实现发送短信的功能。
1、业务方将短信发送请求提交给短信平台
2、短信平台接收到要发送的短信,记录到数据库中,并标记其状态为已接收
3、短信平台调用外部短信发送供应商的接口,发送短信
4、更新短信发送状态为已发送
5、短信发送供应商异步通知短信平台短信发送结果,而通知可能失败,因此最多只会通知N次
6、短信平台接收到短信发送结果后,更新短信发送状态,可能是成功,也可能失败(如手机欠费)
7、如果最多只通知N次,如果都失败了的话,那么短信平台将不知道短信到底有没有成功发送
8、短信发送供应商需要提供一个查询接口,以方便短信平台驱动的去查询,进行定期校对
实现方案上一般有如下特点:
- 不可靠消息:
- 业务活动主动方,在完成业务处理之后,向业务活动的被动方发送消息,直到通知N次后不再通知,允许消息丢失(不可靠消息)。
- 定期校对:
- 业务活动的被动方,根据定时策略,向业务活动主动方查询(主动方提供查询接口),恢复丢失的业务消息。
分布式系列第二弹:分布式事务!
轻量级分布式事务实现:掌握最大努力通知方案
Saga
saga是一种纯业务补偿模式,其设计理念为,业务在调用的时候正常提交。当一个服务失败的时候,其所有依赖的上游服务都进行业务补偿操作。
saga把分布式事务看作一组本地事务构成的事务链:
-
事务链中的每一个正向事务操作,都对应一个可逆的事务操作
-
saga事务协调器负责按顺序执行事务链中的分支事务,分支事务执行完毕即释放资源。如果某个分支事务失败了,则按照反方向执行事务补偿操作。
执行流程
假如一个Saga的分布式事务链有n个分支事务构成,[T1,T2,…,Tn],那么该分布式事务的执行情况有三种:
- T1,T2,…Tn都执行成功
- T1,T2,…Ti,Ci,…,C2,C1:执行到第i(i<=n)个事务的时候失败了,则按照i->1的顺序依次调用补偿操作。如果补偿失败了就一直重试。
- T1,T2,…,TI(失败),Ti(重试),Ti(重试),Ti(重试),…,Tn:适用于事务必须成功的场景,如果发生失败了就一直重试,不会执行补偿操作。
实现上要注意的点:
- 允许空补偿
- 防悬挂控制
- 幂等控制
优劣势
- saga是不完美补偿,补偿操作会留下之前的原始提交的操作痕迹,需要考虑对业务的影响。
- 不能做到事务隔离,因为saga的正向流程已经提交了,所有的事务回滚操作都是基于当前最新版本的数据进行。很有可能出现补偿错误。
相关文章:
【Java】分布式事务解决方案
分布式事务是指在分布式系统中,为了保证多个节点上的操作要么全部成功提交,要么全部失败回滚,所采取的一系列技术手段和协议。 CAP理论 在一个分布式系统中以下三个基本属性无法被同时满足: C(一致性):一致性是指写…...
es数据导出
有大数据量导出的需求 整体思路:分页查询es,一页查询2000条,下一页查询的截止时间取上一页最后一条记录的创建时间(因为分页是按照创建时间逆序排列的),组装最后导出的list,利用EasyExcel导出到…...
chrony服务器(2)
安装与配置 [rootserver ~]# systemctl status ntp # 查看ntp状态 安装 # 默认已安装,若需要安装则可执行: [rootserver ~]# yum install chrony -y [rootserver ~]# systemctl start chronyd [rootserver ~]# systemctl enable chronyd Chrony配置文…...
C++入门小馆: STL 之queue和stack
嘿,各位技术潮人!好久不见甚是想念。生活就像一场奇妙冒险,而编程就是那把超酷的万能钥匙。此刻,阳光洒在键盘上,灵感在指尖跳跃,让我们抛开一切束缚,给平淡日子加点料,注入满满的pa…...
从零搭建云原生后端系统 —— 一次真实项目实践分享
一、引言:为什么选择云原生技术打造后端? 在当今数字化加速的时代,业务需求变化频繁,应用需要快速开发、快速上线、快速迭代。传统单体应用后端架构在灵活性、扩展性和稳定性方面越来越难以满足需求。 而云原生(Clou…...
东田数码科技前端面经
东田数码科技有限公司前端面经 一个月三次面试,也是逐渐积攒了许多经验,也有遇到面试官问到的重复的问题,也有一些我不懂的问题,以下是4.27东田前端面经,希望给大家做参考。 1-自我介绍 我是ac鸽,就读与…...
【音视频】SDL窗口显示
SDL视频显示函数简介 SDL_Init(): 初始化SDL系统SDL_CreateWindow():创建窗口SDL_WindowSDL_CreateRenderer():创建渲染器SDL_RendererSDL_CreateTexture():创建纹理SDL_TextureSDL_UpdateTexture(): 设置纹理的数据S…...
小球在摆线上下落的物理过程MATLAB代码
物理建模: 使用摆线参数方程定义轨迹:x r(θ - sinθ), y r(1 - cosθ)通过微分方程求解角度θ随时间变化关系,考虑能量守恒定律计算实时速度分量和切向加速度 可视化特性: 灰色虚线显示完整摆线轨迹红色小球实时显示当…...
【设计模式】享元模式
享元模式属于结构型设计模式 核心思想是通过共享技术,实现相似对象的高效复用。用 1%的资源支撑100%的需求——通过对象状态的分离与共享,用最小内存支持海量对象 内部状态:对象中不变的部分共享 外部状态:对象中变化的部分非共享…...
R中实现数值求导的包numDeriv
介绍 numDeriv 是一个用于数值求导的 R 包,它提供了计算函数导数的简单方法,支持一阶导数和高阶导数的计算。 计算一阶导数 grad(func, x, method"Richardson", sideNULL, eps1e-4, method.argslist(), ...) 参数: func&#x…...
常用的多传感器数据融合方法
1. 概述 根据具体需求(实时性、计算资源、噪声特性)选择合适的方法,实际应用中常结合多种方法(如UKF与神经网络结合)。 传统方法 (KF/EKF/UKF/PF)依赖数学模型,适合动态系统&#…...
[Lc_week] 447 | 155 | Q1 | hash | pair {}调用
447_Q1 题解 class Solution {typedef pair<int,int> PII;// 自定义哈希函数struct HashPII {size_t operator()(const PII& p) const {return hash<int>()(p.first) ^ (hash<int>()(p.second) << 1);}};public:int countCoveredBuildings(int n,…...
HTML5 新特性详解:语义化标签、表单与音视频嵌入
前言 HTML5作为当前Web开发的核心技术,为开发者提供了更强大、更语义化的工具集。本文将深入探讨HTML5的三大核心特性:语义化标签、增强的表单功能以及原生的音视频支持,帮助开发者构建更现代化、更易维护的网页应用。 一、HTML5语义化标签…...
关于 React Fiber 架构、Hooks 原理
下面将详细介绍你提到的关于 React Fiber 架构、Hooks 原理等相关知识点: React Fiber 架构概述 1. 架构演变 在 React 16 版本之前,采用的是栈调和(Stack Reconciler),流程是 JSX 经过 render 函数转换为虚拟 DOM&…...
音视频之H.265/HEVC熵编码
H.265/HEVC系列文章: 1、音视频之H.265/HEVC编码框架及编码视频格式 2、音视频之H.265码流分析及解析 3、音视频之H.265/HEVC预测编码 4、音视频之H.265/HEVC变换编码 5、音视频之H.265/HEVC量化 6、音视频之H.265/HEVC环路后处理 7、音视频之H.265/HEVC熵编…...
【视频生成模型】通义万相Wan2.1模型本地部署和LoRA微调
目录 1 简介2 本地部署2.1 配置环境2.2 下载模型 3 文生视频3.1 运行命令3.2 生成结果 4 图生视频4.1 运行命令4.2 生成结果 5 首尾帧生成视频5.1 运行命令5.2 生成结果 6 提示词扩展7 LoRA微调 1 简介 2 本地部署 2.1 配置环境 将Wan2.1工程克隆到本地: git cl…...
Java高频面试之并发编程-09
hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:详细说说ThreadLocal ThreadLocal 是 Java 中用于实现线程本地变量的工具类,主要解决多线程环境下共享变量的…...
[Vulfocus解题系列]Apache HugeGraph JWT Token硬编码导致权限绕过(CVE-2024-43441)
[Vulfocus解题系列]Apache HugeGraph JWT Token硬编码导致权限绕过(CVE-2024-43441) Apache HugeGraph 是一款快速、高度可扩展的图数据库。它提供了完整的图数据库功能,具有出色的性能和企业级的可靠性。 Apache HugeGraph 存在一个 JWT t…...
MySQL最新安装、连接、卸载教程(Windows下)
文章目录 MySQL最新安装、连接、卸载教程(Windows下)1.MySQL安装2.MySQL连接2.1 命令行连接2.2 图形化连接(推荐) 3.MySQL卸载参考 MySQL最新安装、连接、卸载教程(Windows下) 1.MySQL安装 MySQL 一共可以…...
Scala 函数柯里化及闭包
一、柯里化 1.1 定义 柯里化是将一个接受多个参数的函数转换为一系列接受单个参数的函数的过程。每个函数返回一个新函数,直到所有参数都被收集完毕,最终返回结果。 1.2 示例 非柯里化函数(普通多参数函数) def add(a: Int, b…...
EasyRTC嵌入式音视频通信SDK助力视频客服,开启智能服务新时代
一、背景 在数字化服务浪潮下,客户对服务体验的要求日益提升,传统语音及文字客服在复杂业务沟通、可视化指导等场景下渐显不足。视频客服虽成为企业服务升级的关键方向,但普遍面临音视频延迟高、画质模糊、多端适配难、功能扩展性差等问题&a…...
OceanBase数据库-学习笔记1-概论
多租户概念 集群和分布式 随着互联网、物联网和大数据技术的发展,数据量呈指数级增长,单机数据库难以存储和处理如此庞大的数据。现代应用通常需要支持大量用户同时访问,单机数据库在高并发场景下容易成为性能瓶颈。单点故障是单机数据库的…...
Android 理清 Gradle、AGP、Groovy 和构建文件之间的关系
在 Android 开发中,我们常常会接触到一系列看似相近却各有分工的名词,比如:Gradle、Groovy、AGP、gradle-wrapper.properties、build.gradle、settings.gradle 等等。 它们彼此之间到底是什么关系?各自又承担了什么角色࿱…...
ubuntu 安装ollama后,如何让外网访问?
官网下载linux版本:https://ollama.com/download/linux 1、一键安装和运行 curl -fsSL https://ollama.com/install.sh | sh 2、下载和启动deepseek-r1大模型 ollama run deepseek-r1 这种方式的ollama是systemd形式的服务,会随即启动。默认开启了 …...
安卓的Launcher 在哪个环节进行启动
安卓Launcher在系统启动过程中的关键环节启动,具体如下: 内核启动:安卓设备开机后,首先由引导加载程序启动Linux内核。内核负责初始化硬件设备、建立内存管理机制、启动系统进程等基础工作,为整个系统的运行提供底层支…...
【银河麒麟高级服务器操作系统】在VMware虚拟机情况下出现软锁处理过程
系统环境及配置 系统环境 物理机/虚拟机/云/容器 VMware虚拟机,宿主机型号是YK SR750 网络环境 外网/私有网络/无网络 私有网络 硬件环境 机型 VMware Virtual Platform 处理器 Intel(R) Xeon(R) Gold 6348 CPU 2.60GHz 内存 64GB 整机类型/架构 x86…...
Ubuntu 22.04.4操作系统初始化详细配置
上一章节,主要讲解了Ubuntu 22.04.4操作系统的安装,但是在实际生产环境中,需要对Ubuntu操作系统初始化,从而提高系统的性能和稳定性。 一、查看Ubuntu系统版本和内核版本 # 查看系统版本 testubuntu:~$ sudo lsb_release -a Rel…...
[ACTF2020 新生赛]Upload
先写一个万能的一句话木马 使用一句话木马 发现这个是有内容过滤的 过滤了 <? 发现这个过滤的很死那就只能使用 不带 ? 的短标签了 使用script 标签 这个的使用只限于对方的php是5版本的 正好是低版本的 所以直接上传 改一下后缀为 phtml 成功上传 但是我们没有…...
Harbor2.0仓库镜像清理策略
背景 在持续集成和持续部署的流程中,频繁的构建和部署会生成大量的镜像版本。这些历史镜像如果不及时清理,会占用大量的存储空间,导致 Harbor 仓库膨胀,影响系统性能。 目前 公司的Harbor存储已经占用1T,好多的repo的…...
从零开始了解数据采集(二十一)——电子制造行业趋势分析案例
这次分享一个偏行业性的趋势分析案例,在项目中为企业实实在在的提高了良品率。不懂什么是趋势分析的同学,可以翻看前面的文章。 在广东某电子制造厂中,管理层发现最近几个月生产良品率有所波动,但无法明确波动原因,也…...
从零开始开发一个简易的五子棋游戏:使用 HTML、CSS 和 JavaScript 实现双人对战
介绍 五子棋,作为一种经典的棋类游戏,不仅考验玩家的策略与判断力,还能在繁忙的生活中带来一丝轻松。今天,我们将用 HTML、CSS 和 JavaScript 来开发一个简易的五子棋游戏,玩家可以在浏览器中与朋友展开一场刺激的对决…...
用Node.js施展文档比对魔法:轻松实现Word文档差异比较小工具,实现Word差异高亮标注(附完整实战代码)
引言:当「找不同」遇上程序员的智慧 你是否经历过这样的场景? 法务同事发来合同第8版修改版,却说不清改了哪里 导师在论文修改稿里标注了十几处调整,需要逐一核对 团队协作文档频繁更新,版本差异让人眼花缭乱 传统…...
计算机基本理论与 ARM 相关概念深度解析
一、计算机基本理论 1. 计算机的组成 计算机硬件系统由五大部件构成: 运算器:负责算术运算(如加减乘除)与逻辑运算(如与、或、非),是数据处理的核心单元。控制器:从存储器中逐条提…...
adb常用的20个命令
ADB(Android Debug Bridge)是Android开发工具中的一个命令行工具,常用于与Android设备进行交互、调试和测试。以下是ADB常用的20个命令: adb devices:列出所有已连接的设备及其状态。adb connect <device_ip…...
C++如何使用调试器(如GDB、LLDB)进行程序调试保姆级教程(2万字长文)
C作为一门高性能、接近底层的编程语言,其复杂性和灵活性为开发者提供了强大的能力,同时也带来了更高的调试难度。与一些高级语言不同,C程序往往直接操作内存,涉及指针、引用、多线程等特性,这些都可能成为错误的温床。…...
【计算机哲学故事1-2】输入输出(I/O):你吸收什么,便成为什么
“我最近,是不是废了……”她瘫在沙发上,手机扣在胸口,盯着天花板自言自语。 我坐在一旁,随手翻着桌上的杂志,没接话,等着她把情绪发泄完。 果然,几秒后,她重重地叹了口气…...
驱动开发硬核特训 · Day 22(上篇): 电源管理体系完整梳理:I2C、Regulator、PMIC与Power-Domain框架
📘 一、电源子系统总览 在现代Linux内核中,电源管理不仅是系统稳定性的保障,也是实现高效能与低功耗运行的核心机制。 系统中涉及电源管理的关键子系统包括: I2C子系统:硬件通信基础Regulator子系统:电源…...
Linux一个系统程序——进度条
一、回车与换行 \n :回车加换行 \r:换行 观察我们发现以上的两个代码除了缺少/n没有任何区别,但是运行代码之后我们会发现有何大的不同,图一会先在屏幕上打印helloworld在进行休眠2,但是图二会先休眠2在打印helloworld,原因是pr…...
从零到精通:深入剖析GoFrame的gcache模块及其在项目中的实战应用
一、引言 在后端开发的世界里,Go语言凭借其简洁的语法、高效的并发模型和强大的标准库,已成为许多开发者的首选。从Web服务到分布式系统,Go的身影无处不在,而其生态也在不断壮大。作为Go生态中的一颗新星,GoFrame&…...
【Linux系统】静态库与动态库
库制作与原理 1. 什么是库 库是写好的现有的,成熟的,可以复用的代码。现实中每个程序都要依赖很多基础的底层库,不可能每个人的代码都从零开始,因此库的存在意义非同寻常。 本质上来说库是一种可执行代码的二进制形式ÿ…...
从零实现分布式WebSocket组件:设计模式深度实践指南
一、为什么需要WebSocket组件? 实时通信需求 传统HTTP轮询效率低,WebSocket提供全双工通信适用于即时聊天、实时数据监控、协同编辑等场景 分布式系统挑战 多节点部署时需解决会话同步问题跨节点消息广播需借助中间件(Redis/RocketMQ等&…...
使用 OpenCV 和 dlib 进行人脸检测
文章目录 1. 什么是 dlib2. 前期准备介绍2.1 环境准备2.2 dlib 的人脸检测器 3. 代码实现3.1 导入库3.2 加载检测器3.3 读取并调整图像大小3.4 检测人脸3.5 绘制检测框3.6 显示结果 4. 完整代码5. 优化与改进5.1 提高检测率5.2 处理 BGR 与 RGB 问题 6. 总结 人脸检测是计算机视…...
03.使用spring-ai玩转MCP
接着上篇:https://blog.csdn.net/sinat_15906013/article/details/147052013,我们介绍了,什么是MCP?使用cline插件/cherry-studio安装了Mcp Server,本篇我们要借助spring-ai实现MCP Client和Server。 使用spring-ai的…...
LeetCode12_整数转罗马数字
LeetCode12_整数转罗马数字 标签:#哈希表 #数字 #字符串Ⅰ. 题目Ⅱ. 示例 0. 个人方法:模拟官方题解二:硬编码数字 标签:#哈希表 #数字 #字符串 Ⅰ. 题目 七个不同的符号代表罗马数字,其值如下: 符号值I…...
展销编辑器操作难度及优势分析
也许有人会担心,如此强大的展销编辑器,操作起来是否会很复杂?答案是否定的。展销编辑器秉持着 “简单易用” 的设计理念,致力于让每一位用户都能轻松上手,即使是没有任何技术背景的小白,也能在短时间内熟练掌握。 编…...
展销编辑器在未来的发展前景
展销编辑器在展销行业的发展前景极为广阔,有望引领行业迈向更加智能化、个性化、沉浸式的新时代,对行业变革产生深远影响。 随着人工智能、虚拟现实、增强现实等技术的不断发展和融合,展销编辑器将实现更加智能化的功能。例如,借…...
央视两次采访报道爱藏评级,聚焦生肖钞市场升温,评级币成交易安全“定心丸”
CCTV央视财经频道《经济信息联播》《第一时间》两档节目分别对生肖贺岁钞进行了5分钟20秒的专题报道。长期以来,我国一直保持着发行生肖纪念钞和纪念币的传统,生肖纪念钞和纪念币在收藏市场保持着较高的热度。特别是2024年初,央行发行了首张贺…...
登高架设作业指的是什么?有什么安全操作规程?
登高架设作业是指在高处从事脚手架、跨越架架设或拆除的作业。具体包括以下方面: 脚手架作业 搭建各类脚手架,如落地式脚手架、悬挑式脚手架、附着式升降脚手架等,为建筑施工、设备安装、高处维修等作业提供安全稳定的工作平台。对脚手架进行…...
Kaamel白皮书:IoT设备安全隐私评估实践
1. IoT安全与隐私领域的现状与挑战 随着物联网技术的快速发展,IoT设备在全球范围内呈现爆发式增长。然而,IoT设备带来便捷的同时,也引发了严峻的安全与隐私问题。根据NSF(美国国家科学基金会)的研究表明,I…...
uniapp跨平台开发---动态控制底部切换显示
业务需求 不同用户或者应用场景,底部tab展示不同的内容,针对活动用户额外增加底部tab选项 活动用户 非活动用户 实现思路 首先在tabbar list中增加中间活动tab的路径代码,设置visible:false,然后再根据条件信息控制活动tab是否展示 pages.json {"pagePath": "…...