当前位置: 首页 > news >正文

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录

第四章 Zookeeper与Paxos

4.1 Zk是什么

4.1.1 Zk特性

4.1.2 Zk基本概念

4.1.2.1 集群角色(Follower, Leader, Observer)

4.1.2.2 数据模型

4.1.2.3 ZNode(数据节点)

4.1.2.4 Session(会话)

4.1.2.5 ACL(Access Control Lists)

4.1.2.6 Watcher(事件监听器)

4.2 ZAB协议

第七章 Zookeeper技术内幕

7.1 系统模型

7.1.1 数据模型

7.1.2 节点特性

7.1.2.1 节点分类

7.1.2.2 节点数据

7.1.3 版本(version、cversion、aversion)

7.1.4 Watcher——数据更变的通知

7.1.5 ACL——保障数据的安全

本章重点:

  • 集群角色(Follower, Leader, Observer)
  • ZNode:持久/临时 + 顺序
  • 版本:version、cversion、aversion
  • Watcher机制
  • ACL权限管理机制

第四章 Zookeeper与Paxos

4.1 Zk是什么

  • 2010年11月正式成为 Apache 顶级项目

  • Zk是一个分布式数据一致性的解决方案,提供了高效且可靠的分布式协调服务。

    • 应用程序可以基于它实现诸如数据发布/订阅,负载均衡,统一命名服务,分布式协调通知,配置管理,分布式锁,分布式锁等分布式的基础服务(第六章会详细提及)

  • ZooKeeper 并没有直接采用 Paxos 算法,而是采用了名为 ZAB(Zookeeper Atomic Broadcast) 的一致性协议

4.1.1 Zk特性
  • 顺序一致性:所有客户端看到的服务端数据模型都是强一致的;从一个客户端发起的事务请求,最终都会严格按照其发起顺序被应用到 ZooKeeper 中(可见下文:原子广播)

  • 原子性:所有事务请求的处理结果在整个集群中所有机器上的应用情况是一致的,即整个集群要么都成功应用了某个事务,要么都没有应用(可见下文:事务)

  • 单一视图:无论客户端连接的是哪个 Zookeeper 服务器,其看到的服务端数据模型都是一致的

  • 高性能:ZooKeeper 将数据全量存储在内存中,所以其性能很高。需要注意的是:由于 ZooKeeper 的所有更新和删除都是基于事务的,因此 ZooKeeper 在读多写少的应用场景中有性能表现较好;如果写操作频繁,性能会大大下滑

  • 高可用:ZooKeeper 的高可用是基于副本机制实现的,此外 ZooKeeper 支持故障恢复(可见下文:选举 Leader)

4.1.2 Zk基本概念
4.1.2.1 集群角色(Follower, Leader, Observer)
  • 没有沿用Master / Slave概念,引入Follower, Leader, Observer三种角色

角色

职责

Leader

  • 读写:

    • 提供读写服务:只有Leader会处理集群中所有的写请求,保证数据的一致性

  • 负责维护着系统的最新状态,发起并维护与各 Follwer 及 Observer 间的心跳,并负责将状态变更同步给Follower和Observer节点

  • 所有的写操作必须要通过 Leader 完成再由 Leader 将写操作广播给其它服务器

  • 一个 Zookeeper 集群同一时间只会有一个实际工作的 Leader

Follower

  • 提供读服务;接受写请求,但不能直接处理,而需要将写请求转发给 Leader 处理

  • 响应 Leader 的心跳

  • 将写请求转发给 Leader 处理,并且负责在 Leader 处理写请求时对请求进行投票

Observer

  • 提供读服务;接受写请求,但不能直接处理,而需要将写请求转发给 Leader 处理

  • 响应 Leader 的心跳

  • 不参与投票

4.1.2.2 数据模型
  • ZooKeeper 的数据模型是一个树形结构的文件系统(ZNode Tree),树中的节点被称为 ZNode。每个节点上都可以保存数据,并挂上子节点

  • 模型的根节点为 /

  • 节点由斜杠(/)进行分割路径,例如/foo/path1

4.1.2.3 ZNode(数据节点)
  • ZNode 通过路径被引用,ZNode 节点路径必须是绝对路径

  • 每个ZNode上都会保存自己的数据内容,及一系列属性信息,大小被限制在 1MB 以内

  • ZNode 两种类型

    • 临时节点(EPHEMERAL)生命周期和客户端会话绑定,会话失效后,这个客户端创建的所有临时节点都会被删除

    • 持久节点(PERSISTENT):持久节点一旦被创立,除非客户端主动删除,否则会一直存在 ZooKeeper 上

  • ZNode 属性

    • SEQUENTIAL:ZNode 上还有一个特殊属性 (SEQUENTIAL,也称顺序标志)。如果在创建 ZNode 时,设置了SEQUENTIAL,那么 ZooKeeper 会使用计数器为该ZNode的节点名后面添加一个单调递增的整型数字(该数字由父节点维护),即 zxid。ZooKeeper 正是利用 zxid 实现了严格的顺序访问控制能力

    • Stat(版本):Zk为每个ZNode维护了一个叫Stat的数据结构,里面记录了这个ZNode的三个数据版本,分别是version(当前ZNode的版本),cversion(当前ZNode子节点的版本),aversion(当前ZNode的ACL版本)

4.1.2.4 Session(会话)
  • 在Zk中,客户端启动时,首先通过一个 TCP 长连接连接到 ZooKeeper 服务集群,端口默认2181

  • Session 从第一次连接开始就已经建立,之后客户端通过心跳检测机制来与服务端保持有效的会话状态。通过这个连接,客户端可以发送请求并接收响应,同时也可以接收到 Watch 事件的通知。

  • 一旦客户端与一台服务器建立连接,这台服务器会为这个客户端创建一个新的会话。每个会话都会有一个超时时间,若服务器在超时时间内没有收到任何请求,则相应会话被视为过期(这段时间内如果连回来了仍视为有效)一旦会话过期,就无法再重新打开,且任何与该会话相关的临时 ZNode 都会被删除

4.1.2.5 ACL(Access Control Lists)

ZooKeeper 采用 ACL策略来进行权限控制。Zk定义了5种权限,每个 ZNode 创建时都会带有一个 ACL 列表,用于决定谁可以对它执行何种操作

  • CREATE:允许创建其子节点

  • READ:允许从节点获取数据并列出其子节点

  • WRITE:允许为节点设置数据

  • DELETE:允许删除其子节点

  • ADMIN:允许为节点设置权限

ACL 依赖于 ZooKeeper 的客户端认证机制。ZooKeeper 提供了以下几种认证方式

  • digest: 用户名和密码 来识别客户端

  • sasl:通过 kerberos 来识别客户端

  • ip:通过 IP 来识别客户端

4.1.2.6 Watcher(事件监听器)
  • Watcher(事件监听器)是Zk的一个重要特性。Zk允许用户在指定ZNode上注册一些Watcher,并在特定事件触发时,Zk服务端会将事件通知到注册的客户端。该机制是Zk实现分布式协调服务的重要特性。

4.2 ZAB协议

全称Zookeeper Atomic Broadcast(原子消息广播协议),与Paxos算法类似。比较复杂,不赘述。


第七章 Zookeeper技术内幕

7.1 系统模型

介绍五方面:数据模型、节点特性、版本、Watcher、

7.1.1 数据模型
  • 树:ZooKeeper 的数据模型是一个树形结构的文件系统(ZNode Tree),树中的节点被称为 ZNode,每个节点上都可以保存数据,并挂上子节点

  • 事务ID

    • 在Zk中,事务是指能改变服务器状态的操作。一般包括节点创建,节点删除,节点内容更新,客户端会话创建,客户端会话失效 等操作

    • 对于每一个事务请求,Zk会为其分配一个全局事务ID,用ZXID表示,通常是64位数字。每一个ZXID对应一次更新操作,可以根据值识别出各个操作的执行顺序

7.1.2 节点特性
7.1.2.1 节点分类

在Zk中,节点类型可以分为三类:持久节点(P),临时节点(E),顺序节点(S)节点有以下特性

节点特性

备注

默认

持久(P) / 临时(S)

必选,二选一

持久(P)

顺序(S)

是 / 否

非顺序

具体在节点的创建过程中,通过组合使用,可以生成以下四种组合型节点类型

  • 持久节点(Persistent):被创建后一直存在于服务器上,直至被删除操作主动清除。最常见的节点。

  • 持久顺序节点(Persistent_Sequential):在创建节点时可以设置这个标记,则每个父节点会维护其子节点的先后顺序。即在创建过程中,自动为节点加上一个数字后缀,作为节点名,上限是Integer.MAX

  • 临时节点(Ephemeral)

    • 临时节点的生命周期与客户端会话Session绑定在一起,会话失效,则节点被自动清理

    • Zk规定了不能基于临时节点来创建子节点,即临时节点只能是叶子节点

  • 临时顺序(Ephemeral_Sequential):在临时节点的基础上,添加了顺序的特性

7.1.2.2 节点数据

节点的存储包含两部分

  • 用户写入节点的数据内容

  • 节点自身的一些状态信息,这些状态信息存在Stat的结构体中,包括事务ID、版本信息、子节点个数

7.1.3 版本(version、cversion、aversion)
  • Zk为数据节点引入了版本version的概念,Zk中每个数据节点都有三类版本号,对节点的任何操作都会引起这三个版本号的变化

    • version:当前数据节点数据内容的修改次数

    • cversion:当前数据节点子节点的修改次数

    • aversion:当前数据节点ACL更变的修改次数

  • 以version为例

    • 节点第一次创建时,version=0;对数据内容更变后,version=1

    • 需要注意的是,即使前后的数据内容没变,version依然会变,version强调的是更变次数

  • Zk设计version的目的:基于CAS乐观锁的思想进行更新

    • 从源码来看,request里会带上请求的version,Zk服务端处理request时会校验version

      • request中的version=-1:表示客户端不要求使用乐观锁,因此会忽略版本对比;

      • request中的version!=-1:表示客户端要基于乐观锁更新

        • Zk服务端会比较请求的version和当前节点的currentVersion,一致则更新,不一致就抛异常

7.1.4 Watcher——数据更变的通知
  • 在Zk中,引入了Watcher来实现分布式数据的发布/订阅功能,整体通知如下

    • ①客户端向Zk服务器注册Watcher,并将Watcher存储在自身的WatcherManager中

    • ②Zk服务器触发Watcher事件后,向客户端发送通知

    • ③客户端线程从WatcherManager中取出对应的Watcher对象,执行回调逻辑

  • 整体代码与逻辑:不罗列了

  • Watcher特性总结如下

    • 一次性:一旦一个Watcher被触发,Zk会将其移除。因此开发者需要反复注册。这种设计有利于减轻服务端压力

    • 客户端串行执行:客户端Watcher回调是一个串行同步的过程,因此保证了顺序

    • 轻量:Watcher通知非常轻量,只会告诉客户端发生了某种事件,不会传达事件详情。这点需要客户端收到事件后主动重新拉取。有利于网络和内存开销

7.1.5 ACL——保障数据的安全
  • ACL的重要性:通过ACL(Access Control List)权限控制机制保障数据的安全

  • ACL介绍:可以从三方面理解该机制:权限模式(Scheme),授权对象(ID),权限(Permission),通常使用 "scheme:id:permission" 来标识一个有效的ACL信息

  • 权限模式(Scheme):权限验证过程中使用哪个策略,开发人员使用最多的是以下四种权限

    • IP:针对IP地址维度进行控制

      • 例1:"ip:192.168.0.110":表示控制权限只针对这个IP

      • 例2:"ip:192.168.0.1/24":表示针对192.168.0.*这个IP段进行权限控制

    • Digest:最常用的,类似于"username:password"的形式

      • Zk会对其进行编码,将这种形式编码成无法辨识的字符串,避免明文

    • World:开放者模式,不校验权限,权限对所有用户开放

      • 可以看作是特殊的Digest模式,即"world:anyone"

    • Super:也是一种特殊的Digest模式,相当于管理员(超级用户)模式,超级用户可以操作所有节点

  • 授权对象(ID):与上述的权限模式配合使用。在不同的scheme下,id是不同的。见下图

  • 权限(Permission):权限就是通过了权限检查后可以被允许执行的操作。在Zk中操作可分以下5类

    • CREATE:允许 授权对象 创建该节点的子节点

    • READ:允许 授权对象 从该节点读取数据 或 子节点列表 等

    • WRITE:允许 授权对象 对该节点进行更新操作

    • DELETE:允许 授权对象 删除该节点的子节点

    • ADMIN:允许 授权对象 为该节点设置ACL权限

  • ACL的管理

    • ACL设置:在Zk服务端有两种方式能对ACL进行设置

      • 方式

        例子

        方式一:创建节点的同时设置ACL参数,命令格式如下:【create [-s] [-e] path data acl】

        方式二:通过setAcl命令,单独对已存在的节点进行设置:【setAcl path acl】

    • 如何使用Super模式

      • Super模式由来:如果一个持久数据节点的创建者客户端已下线,那么该如何清理?需要一个超级管理员

      • 使用方式:

        • 在ZK服务器上开启Super模式:在服务端启动时,添加以下属性

相关文章:

《从Paxos到Zookeeper》——第四、七章:基本概念及原理

目录 第四章 Zookeeper与Paxos 4.1 Zk是什么 4.1.1 Zk特性 4.1.2 Zk基本概念 4.1.2.1 集群角色(Follower, Leader, Observer) 4.1.2.2 数据模型 4.1.2.3 ZNode(数据节点) 4.1.2.4 Session(会话) 4.1.2.5 ACL(Access Control Lists) 4.1.2.6 Watcher(事件…...

网络演进技术演进:裸纤专线、SDH、MSTP+、OTN、PTN、IP-RAN

前言 文章主要介绍常见名词以及其在各自领域实现的功能价值。 01 裸纤 裸光纤(裸光纤)由运营商提供,是无中继的光纤线路,仅通过配线架连接。相比传统光纤,裸光纤提供纯粹的物理传输路径,无需额外网…...

MMC设备

MMC(MultiMediaCard)是一种闪存卡标准,用于作为便携式设备上的存储媒介,例如数码相机、智能手机、平板电脑、个人数字助理(PDA)以及其他便携式设备。MMC卡最初是由SanDisk和Siemens AG开发的,并…...

图片浏览器-PicView

一、前言 PicView 是一款适用于 Windows 10 或 11 的快速高效的图像查看器,配备了干净简洁的用户界面,可以在不需要时方便地隐藏。 二、支持类型 它支持广泛的图像文件类型,包括:WEBP、GIF、SVG、PNG、JXL、HEIC、PSD 三、软件特…...

一些零碎小知识

函数递归复习 #define 的头文件包含 #define定义标识符常量 等define其他用法 斐波那契数列 函数栈帧 青蛙跳台问题 汉诺塔问题 字符“0”与0的计算 “0”-“0”0; 最后一次作业题一道 素数 随机数 strand timer rand 水仙花数 变种随鲜花 斐波那契数…...

2.2 Java全栈开发前端+后端(全栈工程师进阶之路)-前端框架VUE3-基础-Vue基本语法

文本渲染指令 文本渲染指令-v-html与v-text Vue使用了基于HTML的模板语法,允许开发者声明式地将DOM绑定至底层Vue实例的数据。所有Vue的模板都是 合法的HTML,所以能被遵循规范的浏览器和HTML解析器解析。 在前面,我们一直使用的是字符串插…...

(Arxiv,2024)Mind the Modality Gap:通过跨模态对齐建立遥感视觉语言模型

文章目录 相关资料摘要引言相关工作对比语言图像预训练遥感域专用 CLIP 模型遥感中的多模态 CLIP 启发模型 方法模型算法输入阶段:输出阶段:步骤说明: 第一阶段:通过权重插值修补CLIP将遥感图像模态与自然图像和文本对齐 实验 相关…...

区块链 | 一文了解 NFT 的生态系统(上)

🐶原文: Understanding Security Issues in the NFT Ecosystem 🐶写在前面: 本博客只摘取了原论文的第二、三节。 技术背景知识 在本节中,我们将介绍以太坊生态系统的构建模块,重点关注「NFT,…...

为什么centos官方版不支持arm架构?

为什么centos官方版不支持arm架构? 1、资源限制:CentOS是由社区维护的开源操作系统,其开发和维护需要大量的人力和物力资源。由于ARM架构的设备相对较少,社区资源有限,因此官方版CentOS选择集中精力在x86架构上进行开发…...

awk小尝试2(随手记)

文章目录 需求1解法 需求2解法(3种-grep/sed/awk) 需求1 使用hostname -I创建文件名 echo hostname -I.txt 10.0.0.124 .txt # 需要注意,这里的.txt前有一个空格,需要去掉,不然就是两个文件名解法 echo hostname -I…...

Vue的项目启动指令分析

通过Vue CLI脚手架创建的项目,默认的启动项目方式是 npm run serve 这里的serve是可以修改的。 在创建的项目目录中,找到package.json 双击打开,找到scripts部分 在scripts部分,有一个"serve"键值对,这里的…...

年轻人刮疯了,刮刮乐断货了

年轻人刮疯了 刮刮乐缺货了。 00后彩票店老板陆诗等得有点着急。她的福彩店开在深圳,今年4月才开门营业,但从开业到今天,刮刮乐总共就来了一回货——开业时发的20本。 那之后,刮刮乐就彻底断供了。原本,陆诗想把刮刮…...

25 JavaScript学习:var let const

JavaScript全局变量 JavaScript中全局变量存在多种情况和定义方式,下面详细解释并提供相应的举例: 使用var关键字声明的全局变量: var globalVar "我是全局变量";未使用var关键字声明的变量会成为全局变量(不推荐使用&…...

docker部署的nacos2.2x开启鉴权功能

注意在2.2.0版本之后如果不开启鉴权,那么默认不需要登录就可以访问 所以我们需要手动开启鉴权,nacos启动好以后来到容器内部修改 docker exec -it nacos /bin/shvim conf/application.properties在第34行下面添加 nacos.core.auth.enabledtrue nacos.cor…...

【数据结构与算法】之五道链表进阶面试题详解!

目录 1、链表的回文结构 2、相交链表 3、随机链表的复制 4、环形链表 5、环形链表(||) 6、完结散花 个人主页:秋风起,再归来~ 数据结构与算法 个人格言:悟已往之不谏,知…...

vue2实现生成二维码和复制保存图片功能(复制的同时会给图片加文字)

<template><divstyle"display: flex;justify-content: center;align-items: center;width: 100vw;height: 100vh;"><div><!-- 生成二维码按钮和输入二维码的输入框 --><input v-model"url" placeholder"输入链接" ty…...

Redis之字符串类型深入之SDS底层结构

作为一名程序员不可能不知道redis 知道redis不可能不知道redis的字符串 如果你真的熟悉redis不能不知道sds, 我们探究一下redis字符串的底层结构 sds翻译过来就是动态扩容(Simple Dynamic String)、先看一下最早版本redis的sds结构体 struct sdshdr{int len; //记录数组中…...

Cesium 3dTileset 支持 uv 和 纹理贴图

原理: 使用自定义shader实现uv自动计算 贴图效果: uv效果:...

C++可变参数模板中的省略号

看可变参数模板代码时常会遇到省略号的使用&#xff0c;这类奇特的“...”出现位置还不固定&#xff0c;容易引起困惑。C最近一直不用都快废了&#xff0c;在此想对省略号的使用做个简单归纳以提醒自己。可变参数模板以两种方式使用省略号。 在参数名称的左侧&#xff0c;表示“…...

uni-ui 使用uni-icons有些图标显示不出来,如down,up图标

问题描述 我使用的是uni创建时勾选的uni-ui模板&#xff0c;一次偶然机会发现down图标显示不出&#xff0c;left&#xff0c;right等其他图标又可以。 最后发现使用uni-icons不是最新版本导致的&#xff0c;使用模板生成的icons是1.3.5版本&#xff0c;我在插件市场找到的是2.0…...

动态增删表格

期望目标&#xff1a;实现一个能通过按钮来动态增加表格栏&#xff0c;每次能添加一行&#xff0c;每行末尾有一个删减按钮。 <el-button type"text" class"primary"click"addMember()">添加</el-button> <el-table:data"m…...

Java-(乘法表之后)增强for循环

这里我们先做个了解&#xff0c;之后我会在数组中进行详细介绍Java5引入了一种主要用于数组或集合的增强型for循环Java增强型for循环语法格式如下 For(声明语句&#xff1a;表达式&#xff09;{ //代码语句 } 声明语句&#xff1a;声明新的局部变量&#xff0c;该变量的类型…...

Celery(分布式任务队列)入门学习笔记

Celery 的简单介绍 用 Celery 官方的介绍&#xff1a;它是一个分布式任务队列; 简单&#xff0c;灵活&#xff0c;可靠的处理大量消息的分布式系统; 它专注于实时处理&#xff0c;并支持任务调度。 Celery 如果使用 RabbitMQ 作为消息系统的话&#xff0c;整个应用体系就是下…...

【网络】tcp协议如何保证可靠性

TCP&#xff08;Transmission Control Protocol&#xff09;是一种面向连接的、可靠的传输层协议&#xff0c;为网络通信提供了可靠性和连接稳定性。本文将详细介绍 TCP 协议如何保证数据的可靠传输和连接的稳定性&#xff0c;并分析其优缺点。 可靠性保证 序号和确认机制&…...

select,poll,epoll

在 Linux Socket 服务器短编程时&#xff0c;为了处理大量客户的连接请求&#xff0c;需要使用非阻塞I/O和复用&#xff0c;select&#xff0c;poll 和 epoll 是 Linux API 提供的I/O复用方式。 \selectpollepoll操作方式遍历遍历回调底层实现数组链表哈希表IO效率每次调用都进…...

【48天笔试强训】day18

题目1 描述 有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例子&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子都…...

链表经典面试题01

目录 引言 面试题01:返回倒数第k个节点 题目描述: 思路分析: 代码展示: 面试题02:链表的回文结构 题目描述: 描述 思路分析: 代码展示: 面试题03:相交链表 题目描述: 思路分析: 代码展示: 小结: 引言 这次的题均来自力扣和牛客有关链表的经典面试题,代码只会展示…...

基于java的CRM客户关系管理系统的设计与实现(论文 + 源码 )

【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展&#xff0c;市场经济的信息化&#xff0c;让企业之间的竞争变得&#xff0…...

【动态规划-最长上升子序列模型part2】:拦截导弹、导弹防御系统、最长公共上升子序列【已更新完成】

1、拦截导弹 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。 但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。 某天&#xff0c;雷达捕捉到敌国的导弹来袭。 由于…...

Spring 如何解决 Bean 循环依赖

循环依赖解释 bean A 属性注入时依赖bean B &#xff0c;并且bean B属性注入时也依赖bean A &#xff0c;造成 bean A 和bean B 都无法完成初始化问题&#xff0c;形成了闭环。 注意 项目中存在Bean的循环依赖&#xff0c;是Bean对象职责划分不明确、代码质量不高的表现&#…...

做站群的网站怎么来/营销策划品牌策划

## 分析文本你可以分析包含整本书的文本文件。很多经典文学作品都是以简单文本文件的方式提供的&#xff0c;因为它们不受版权限制。本节使用的文本来自项目Gutenberg( http://gutenberg.org/)&#xff0c;这个项目提供了一系列不受版权限制的文学作品&#xff0c;如果你要在编…...

品牌茶业都在哪些网站做宣传/网络营销方法有几种类型

一、jumpserver的启动 12Jumpserver的启动和重启[roottest-vm001 install]# /opt/jumpserver/service.sh start/restart二、按照Jumpserver部署过程结尾的账号信息&#xff08;admin/wangadmin123&#xff09;登陆Jumpserver的web界面 修改admin超级管理员的密码 只修改admin的…...

做购物网站公司/阿里云万网域名注册

1. XML概念和体系(1) 简述XML的特点&#xff1f;①XML 数据以纯文本格式存储②实现不同应用程序之间的数据通信③实现不同平台间的数据通信④实现不同平台间的数据共享⑤使用 XML 将不同的程序、不同的平台之间联系起来(2) 一个标准的XML文档由什么组成&#xff1f;根元素、子元…...

我要学网站建设/新郑网络推广

平时开发中&#xff0c;常用一些模糊查询&#xff0c;例如查询表格user中uname包含“塔”的数据&#xff0c;可以使用如下三种方式&#xff1a; select * from user where uname like %塔%; select * from user where INSTR(uname,塔); select * from user where LOCATE(塔, u…...

前端做网站的步骤/运营和营销是一回事吗

Flink 学习资料官方文档 &#xff1a;https://flink.apache.orgFlink 中文社区视频课程&#xff1a;https://github.com/flink-china/flink-training-courseFlink 中文社区 &#xff1a;https://www.slidestalk.com/FlinkChinaververica 教程 &#xff1a;https://training.ver…...

网络营销策略ppt/优化大师

转载&#xff1a;https://blog.csdn.net/huangzirong822/article/details/38400817 之前使用jeecg集成框架做过一个项目这里说说框架中树(tree)字段的扩展&#xff0c;在jeecg集成框架中&#xff0c;树列字段默认只能显示两列&#xff0c;如下图所示&#xff1a;通常情况下前后…...