数据库开发重点存档

news2025/1/27 13:10:59

2023春数据库开发复习

T1 视图可以用的几个场景?

  1. 不同表字段聚合、信息重组:当某个查询涉及多表连接、次数频繁时,可以创建视图隐藏底层表的复杂性,简化查询。

  2. 控制权限:根据不同用户的权限,可以建立不同的视图,让用户查看部分数据(如只公开非敏感数据)。

  3. 安全性需要:用户无法对视图进行随意的修改和删除,只能在只读视图中检索数据,增加了安全性。

  4. 更新/重构数据库,同时满足原来原有应用的访问:当数据库需要重构(如删除了一些旧表,创建了一些新表),但不希望这些更改影响之前的应用程序时,可以使用与已删除、修改的旧表相同的表结构创建数据库视图。因为视图保留了原有的表架构,应用程序可以访问视图来完成此前功能而无需修改。

  5. 计算列需要:数据库设计范式要求减少冗余字段,所以数据库表大多没有计算列。但报表中通常需要总销售额等计算列字段,所以可以创建一个含有计算列字段的视图。

T2 不能把数据库当“黑盒”使用,为什么?

  1. 因为每个数据库都是不相同的。在一个数据库上取得的经验也许可以部分用于另一个数据库,但必须有心理准备,二者可能存在一些基本差别,可能还有一些细微差别。

  2. 细微差别(如对null的处理)与基本差别(并发控制机制)可能有同样显著的影响

  3. 所以我们应当了解数据库,知道它如何工作,其特性如何实现,这是解决这些问题的唯一途径

不同数据库在性能、安全、连接、锁机制、空值等方面有不同,下面以空值处理和锁机制为例:

空值处理

不同的数据库系统可能会对空值的处理有所不同,有四种场景:

  1. unknown:几乎所有的关系型数据库都认为空值为unknown,如MySQL、Oracle 和 SQL Server,它们遵循SQL标准。
  2. null:SQLite 数据库则将空值视为 NULL,并支持将 NULL 视为一个特殊的值来进行处理
  3. 不包括:一些 NoSQL 数据库不包括空值(或者叫做缺失值),因为它们的数据模型可能不需要将所有属性都定义为必填的,此时数据项缺少某些属性时,将不会存储空值。
  4. 实数:一些数据库可能允许在对实数列进行聚合操作时将空值视为0,这样可以避免在计算总和或平均值时出现错误。这取决于数据库的实现和特性,而不是标准的行为。

锁机制

锁机制是实现并发控制机制的一种主要手段。不同的数据库,实现锁机制是不一样的。

比如Oracle采取多版本控制(MVVC),读一致性的并发模型,支持读一致查询和非阻塞查询,有以下特性:

  • 只有修改才加行级锁
  • Read绝对不会对数据加锁
  • Writer不会阻塞Reader
  • 读写器绝对不会阻塞写入器

这种机制让Oracle存在有时读不到正确数据的现象,因为在读取时可能会读到已提交的旧版本数据,而不像其他数据库一样选择检查时间戳和退回。

此外,读不阻塞写可以极大提高数据库的吞吐能力,所以Oracle拥有散回特性。但其他数据库可能不是这样的,比如SQLite不支持非阻塞查询。

此外,因为锁粒度、锁类型、事务隔离级别等不同,Oracle与其他数据库的锁机制还有很多不同。

总之,我们不能简单把数据库当黑盒,否则可能会出错,比如Oracle的无阻塞设计有一个副作用,若想保证一次最多只有一个用户访问一行数据,就需要开发人员自己一些做工作。

T3 索引

MySQL为什么不用BST,而是用B+树?

已知在数据库系统中,通常采用磁盘来存储索引数据,以支持对大量数据的高效查询操作。

因为索引是顺序结构,可以用二分搜索树构建索引。但是当N比较大的时候,树的深度比较高。数据查询的时间主要依赖于磁盘IO的次数,二叉树深度越大,查找的次数越多,性能越差。最坏的情况是退化成了链表。即使做Tree Balancing,也比较耗时。其存储上的不连续性,也会导致存储空间的浪费。

而B+树有高扇出和低高度的特性,更适合磁盘实现。

  • 高扇出:指在数据库索引中,每个父节点下包含的子节点数量较大,可以改善临近键的数据局限性。
  • 低高度:遍历深度小,可以减少遍历期间的寻道次数。

B+树结构

img
  1. 基本结构:

    1. 一个结点是一个page
    2. B+树中的所有数据均保存在叶子结点,且根结点和内部结点均只是充当控制查找记录的媒介,并不代表数据本身,所有的内部结点元素都同时存在于子结点中。
    3. 叶子节点之间通过指针链接,可以实现连续范围查找,适合范围查询和分页查找等场景。img
  2. 使用方式:

    1. 从根节点开始,根据该节点的关键字和待查找数据键值的大小比较,决定应该搜索该节点的哪个子节点。如果关键字都相等,则可以直接在叶子节点返回查询结果。如果比较较大,则到右子树查找;如果比较较小,则到左子树查找。
    2. 在选中的子节点中,重复执行第一步,直到搜索到一个叶子节点,即数据所在的节点。
    3. 在叶子节点中,按照存储顺序直接查找,或在叶子节点之间的指针链接进行有序的连续范围扫描,直到找到满足条件的数据记录。
      1. 前者是排序后直接定位需要查找的记录所在的位置,后者适合连续场景。
  3. 使用场景:

    1. 全键值 Where x = 123 (depth + 1次的固定次数)
    2. 键值范围 Where 45 < x < 123 (先进行x=45,然后顺序读取直到x>=123)
    3. 键前缀查找 where x LIKE J%’

结点分裂

在这里插入图片描述

B+树自下而上构建,随着叶结点的数量增加,内部节点的数量和树的高度也增加。

分裂涉及到两层:下面分裂,上面增加。移动的是中间值。

叶结点分裂和非叶结点分裂的区别:因为B+树中的所有数据均保存在叶子结点,13移动到内部结点后,也同时存在于叶子结点。而非叶结点分裂时,13上升后不会出现在原有层。

索引访问基本表

先访问索引再访问基本表,索引只是查询工作的第⼀步,读取基本表中的数据才是查询的结束。

同样的索引,但不同的物理结构,可能会引起查询效率的千差万别:

  • 磁盘访问的速率
  • 物理I/O很可能是内存访问
  • 记录存储

主键索引

主键索引肯定存在,和基本表有对应关系:如文件偏移量对应,记录的是该记录在文件中偏移的字节数 在这里插入图片描述

二级索引

二级索引是非主键的其他键值构建的索引,有两种构建方法:

  1. 直接指向主数据文件
    1. 优点:访问快,直接
    2. 缺点:物理组织更新时两边都要处理(2次写)
  2. 指向主键索引,间接访问主数据文件(可以用文件偏移量对应)
    1. 优点:物理组织更新只需要改主键索引,二级索引会随着主键索引的更新而更新,因为不直接对应偏移量
    2. 缺点:多了一次I/O,因为每次读都要经过主键索引

不同数据库选择不同,如MySQL选第二种。

T4 物理组织形式

原始

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xluha5Wu-1681281205324)(复习戳这里!!!.assets/image-20230411191517919.png)]

在数据库中,通常将存储空间划分为多个page,每个page包含多个数据块,数据块中包含多个三元组,其中每个三元组对应一个数据项:

  • 关键字(Key):唯一标识每个数据项;

  • 相关值(Value):与关键字对应的具体数据信息;

  • 指针(Pointer):指向与当前数据项相关的数据块或其他地址信息。

在数据的读写过程中,通过k找到对应的v和p,从而实现数据的定位和操作。

优点:

  • 记录定长数据
  • 实现灵活存储和快速检索数据,提高数据管理的效率。

缺点:

  1. 除非最右侧插入数据,否则需要移动前面的数据
  2. 无法有效管理变长的字段

分槽页

img

  • header:包括页码、记录的数量和页的其他一些元信息
  • pointer:指向下一个空闲槽的指针
  • cells:存储实际记录的槽

需要满足的需求

  • 最小开销的变长存储需求
  • 回收已删除记录的空间
  • 引用页中的记录,无论它在哪

好处

  • 可以根据指针快速查找到记录的位置;

  • 两边可以伸缩

  • 最小开销:唯一额外开销是一个指针数组,用于保存记录实际所在位置偏移量

  • 空间回收:通过对页进行碎片整理和重写,可以回收空间

  • 动态布局:从页外部只能通过槽ID引用槽,确切位置由页内部决定

更新情况

  • 只重排指针
  • 记录从后往前放

迁移情况:溢出、两边迁移怎么办

当第一次数据溢出迁移时,系统会将数据存储到其他的块或页中,但是由于系

统自身的机制,可能会出现数据不平均地分布在多个块或页中的情况。

后面再需要进行迁移时,系统会将两端的无效数据都删除掉,只保留有效数

据,然后将数据存储到新的块或页(溢出页)中。

区别

行迁移是原来的页中还会存一部分的数据和指针,而行溢出是原来的页只存指

针。(优先进行行迁移)

为什么同一个分槽页中行迁移只会发生一次

由于数据页中的数据是按照主键值排序的,因此当某个数据行被迁移时,会导致该数据页中的其他数据行的位置发生改变。

因此多次数据迁移操作可能会导致数据页中的数据行位置变得十分混乱,甚至可能会影响查询性能。

所以如果之后的超额数据都将存储在溢出页中,可以减少数据行位置变化的次数,提高查询性能。

freeblock

  1. 为什么要有freeblock?避免更多可能出现的行迁移。留一块空白,update就可以在本页中直接操作
  2. 遵循70%/30%原则,即留出30%空白

管理版本

  1. 在文件名中加入版本前缀
  2. 版本使用专门文件存储,PostgreSQL将版本存在PG_VERSION
  3. 直接存在每⼀个具体文件(索引)的头部,头部按照不变格式编码

映射校验

映射校验通常用于大规模数据的验证。

映射校验将数据划分为多个任务,然后在每个任务内部通过计算生成本地校验

(Local Checksum)。最后,在一个Reduce节点上将所有本地校验和进行

合并计算,以生成最终的全局校验和

分槽页一定要有校验,一页存一个校验和。这样可以尽早识别磁盘文件问题,避免传播到其他子系统和节点。

XOR和CRC是常见的计算校验和方法:

  • XOR:简单快速,对每个字节做异或运算
  • CRC循环冗余校验:检测连续比特位的损坏

T5/6 sql

船只租赁

设有一个船员租赁船只系统,表结构如下:

sailors表,

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
|  sid         | int     |
|  sname       | varchar |
|  rating      | int     |
|  age         | int     |
+--------------+---------+
sid为该表主键。
该表包含船员的编号,姓名,等级和年龄

boats表,

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
|  bid         | int     |
|  bname       | varchar |
|  color       | varchar |
+--------------+---------+
bid为该表主键。
该表包含船只编号,船只名称和船只颜色

reserves表,

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
|  sid          | int     |
|  bid          | int     |
|  reserve_date | date    |
+---------------+---------+
(sid,bid)为该表主键。
该表包含船员编号,船员预定的船只编号,船员预定船只的日期
  1. 编写一个sql语句,找出年龄在35以上的并且在2020-09-01至2020-09-30期间没有预定红色(RED)船只的水手,结果返回水手姓名sname。

    select sailors.sname from sailors 
    where sailors.age > 35 and sailors.sid not in (
      select reserves.sid from reserves, boats 
      where reserves.bid = boats.bid and boats.color = 'RED' and 
      reserves.reserve_date between '2020-09-01' and '2020-09-30'
    )
    
  2. 编写一个sql语句,找出预定了所有船的水手,结果返回水手姓名sname。

    select s.sname from sailors s where not exists (
      select * from boats b where not exists(
        select * from reserves r where b.bid = r.bid and s.sid = r.sid
      )
    )
    
  3. 编写一个sql语句,找出2020-05-01至2020-05-31期间预定过绿色船(GREEN)的等级最高的水手,结果返回水手姓名sname。

    select sailors.sname from sailors 
    where sailors.sid in (
      select reserves.sid from reserves, boats 
      where reserves.bid = boats.bid and boats.color = 'GREEN' and 
      reserves.reserve_date between '2020-05-01' and '2020-05-31'
    ) 
    and sailors.rating >= ALL(
      select sailors.rating from sailors where sailors.sid in (
        select reserves.sid from reserves, boats 
        where reserves.bid = boats.bid and boats.color = 'GREEN' and 
        reserves.reserve_date between '2020-05-01' and '2020-05-31'
      )
    )
    
  4. 编写一个sql语句,找出年龄在35岁以上,并且在2020-08-01至2020-08-31期间同时预定了红色船(RED)和绿色船(GREEN)的水手,结果返回水手姓名sname。

    select sailors.sname from sailors 
    where sailors.age > 35 and sailors.sid in (
      select r.sid from reserves r, boats b
      where r.bid = b.bid and b.color = 'GREEN' and 
      r.reserve_date between '2020-08-01' and '2020-08-31'
    ) and sailors.sid in (
      select r.sid from reserves r, boats b
      where r.bid = b.bid and b.color = 'RED' and 
      r.reserve_date between '2020-08-01' and '2020-08-31'
    )
    

比昨天温度高

表 Weather

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| recordDate    | date    |
| temperature   | int     |
+---------------+---------+

id 是这个表的主键

SELECT tod.`Id` AS Id
FROM Weather yes
JOIN Weather tod
ON DATEDIFF(tod.`RecordDate`, yes.`RecordDate`) = 1
WHERE tod.`Temperature` > yes.`Temperature` 

平均值、中位数、replace

  1. 删除不想要的字符:replace
UPDATE tbl_name 
SET 
    field_name = REPLACE(field_name, string_to_find, string_to_replace)
WHERE
    conditions;
    
UPDATE products --表名
SET 
    productDescription = REPLACE(productDescription, 'abuot', 'about');  --列名

查询查找所有出现的拼写错误词:abuot,并通过products表的productDescription列中使用正确单词将其替换

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KdwFwqoS-1681281205325)(复习戳这里!!!.assets/image-20230411233433132.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-d8f7LOXP-1681281205325)(复习戳这里!!!.assets/image-20230411233530498.png)]

  1. 计算平均值,最大最小值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5W8vKqG7-1681281205326)(复习戳这里!!!.assets/image-20230411232834102.png)]

coalesce(num,0) // 去除null

  1. 计算中位数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Y3mO35de-1681281205326)(复习戳这里!!!.assets/image-20230411234600388.png)]

  1. 计算众数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cps5zdPU-1681281205327)(复习戳这里!!!.assets/image-20230411235007016.png)]

count(*)包括了所有的列,相当于行数,不会忽略列值为NULL

count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空

T7 BOM问题

存储简单树

简单树:单一结点只有一个父节点

  • 邻接模型:父节点id作为子节点id的一个属性
  • 物化路径:把树中的每个节点和它在树中的描述数据相结合(描述数据是从根节点到直接父节点的串联序列,类似1 ->1.1->1.1.1)
  • 嵌套集合模型:每个节点被赋予一对数字,其中父节点的两个数字包含其所有节点的左右数字,然后一层一层这样包含下去。img
  • 嵌套间隔模型:以两个数字为特定节点的路径编码,这个数字被解释成有理数的分子和分母(不常用,可以忽略)

存储多父节点的树

BOM:单一结点可能有多个父节点。

一定通过多表,一张表存不了。一个表存内容,一个表存关系。

如下图Components存内容,Composition存关系。

img

以邻接表模型为例:使用两个表来存储多父节点的树:

  • 存储节点的信息的表:记录节点的各种属性。
  • 存储父子关系的表:记录节点间的父子关系。
    • 增加一个额外的字段,用于存储每个父子关系在多父树中的顺序。

Node表:

| id | value | … |

Relationship表:

| id | parent_id | child_id | order |

计算百分比

--先查询初始成分的占比,再对其他部分计算实际占比
with recursive_composition(actual_pct, component_id)
as (select a.pct, a.component_id
from composition a, components b
where b.component_id = a.recipe_id
and b.component_name = 'Philter #5'
union all
select parent.pct * child.pct, child.component_id
from recursive_composition parent, composition child
where child.recipe_id = parent.component_id)

--主查询,去重
select x.component_name, sum(y.actual_pct)
from recursive_composition y, components x
where x.component_id = y.component_id
and x.component_type = 'I'
group by x.component_name

附加题 回忆一下上课时听到的感兴趣的知识点?

我对函数索引中where f(indexed_col)='some value'这样的检索条件会使索引无法发挥作用感兴趣。

老师上课以日期函数为例,说第一种写法会导致 MySQL 无法使用 order_date 上的索引,因为需要对每一行记录执行 DATE_FORMAT 函数,这个过程无法利用索引。

SELECT COUNT(*) FROM orders WHERE DATE_FORMAT(order_date, '%Y-%m-%d') = '2023-03-08';
SELECT COUNT(*) FROM orders WHERE order_date >= '2023-03-08 00:00:00' AND order_date <= '2023-03-08 23:59:59';

隐式类型转换因为触发了CAST函数,也无法发挥作用。因此应该尽量避免在查询条件或者查询字段中使用函数,以便能够充分利用索引提高查询性能。

我好奇背后的原因,通过课下学习,发现B+ 树提供的这个快速定位能力,来源于同一层兄弟节点的有序性。而运行函数后的值会被修改或者变形,可能与实际存储在B+树中的原始值不同。比如假设树的第一层数据是2018-1-1,2019-9-1,2020-7-1,对每个值执行month()函数,得到的值(1,9,7),破坏了有序的前提。

mysql中规定只要对索引字段使用函数操作(无论是否破坏了了有序性),就放弃走树搜索功能,所以效率降低。

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

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

相关文章

星巴克创始人第三次重出江湖

星巴克创始人第三次出山&#xff0c;与中国有关 中国咖啡连锁竞争白热化 星巴克诞生于1985年&#xff0c;爷爷级的公司 趣讲大白话&#xff1a;百年老店不容易 【趣讲信息科技135期】 **************************** 将心注入 星巴克创始人自传 创始人的激情、执行力、团队建设很…

HttpRunner3.x 源码解析(5)-runner.py

首先看下生成的pytest文件 from httprunner import HttpRunner, Config, Step, RunRequest, RunTestCaseclass TestCaseLogin(HttpRunner):config (Config("登录成功").variables(**{"password": "tester", "expect_foo2": "co…

17_I.MX6ULL_内部RTC

目录 I.MX6U RTC简介 相关寄存器 实验源码 I.MX6U RTC简介 实时时钟是很常用的一个外设,通过实时时钟我们就可以知道年、月、日和时间等信息。因此在需要记录时间的场合就需要实时时钟,可以使用专用的实时时钟芯片来完成此功能,但是现在大多数的MCU或者MPU内部就已经自带了…

一、Locust快速 入门

1 . 介绍 Locust 是一种易于使用、可编写脚本且可扩展的性能测试工具。 您可以在常规 Python 代码中定义用户的行为&#xff0c;而不是被困在 UI 或限制性领域特定语言中。 这使得 Locust 可以无限扩展并且对开发人员非常友好。 用普通的旧 Python 编写测试场景 如果您希望…

【华为OD机试】1038 - 学英语

文章目录一、题目&#x1f538;题目描述&#x1f538;输入输出&#x1f538;样例1二、代码参考作者&#xff1a;KJ.JK&#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x…

基于价值认同的需求侧电能共享分布式交易策略(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

惊喜开箱!品牌可以从 Ledger 引领的顶级体验之一中学到什么?

Ledger 是加密货币硬件钱包的领先供应商&#xff0c;它通过进入 The Sandbox 并创建游戏化体验来扩大其教育计划&#xff0c;从而在虚拟世界中掀起波澜。通过在这个令人兴奋的新空间打造自己的品牌&#xff0c;Ledger 正在接触更广泛的受众&#xff0c;并以有趣的方式与人们互动…

回收站清空了怎么恢复?快来get实用方法!

案例&#xff1a;回收站清空了怎么恢复&#xff1f; 【真的栓Q了&#xff0c;我刚点击回收站&#xff0c;不知道按错了什么&#xff0c;回收站被清空了&#xff0c;大家有什么方法可以恢复回收站里的文件吗&#xff1f;请大家给我出出主意吧&#xff01;谢谢啦&#xff01;】 …

不愧是比亚迪!

最近这段时间&#xff0c;因为我自己准备买车嘛&#xff0c;然后先后去试驾了比亚迪汉、小鹏P7i、蔚来ET5、智己LS7这几辆车&#xff0c;接下来想分4篇文章依次给大家分享一下这四个品牌的车试驾体验。比亚迪汉小鹏P7i蔚来ET5这四个品牌总共花了三天时间&#xff0c;也算是比较…

STC89C52定时器的简介

一、序言 针对于STC89C52RC而言&#xff0c;这个芯片内部包含了三个定时器——T0、T1和T2&#xff0c;他们的中断优先级分别是1、3和5。 怎么还有一个定时器2呢&#xff1f;博主也是今天整理这篇博客的时候&#xff0c;翻阅芯片手册才发现的。如果说&#xff0c;我们经常用的…

00后面试华为软件测试工程师,竭尽全力拿到15K。。。。。

不废话&#xff0c;直接重点 一般软件测试的面试分为三轮&#xff1a;笔试&#xff0c;HR面试&#xff0c;技术面试。 前两轮&#xff0c;根据不同企业&#xff0c;或有或无&#xff0c;但最后一个技术面试是企业了解你“行不行”的关键环节&#xff0c;每个企业都会有的。 在…

从C语言到C++(第一章_C++入门_中篇)缺省参数+函数重载+引用

目录 1.缺省参数 1.1缺省参数概念 1.2缺省参数的使用&#xff1a; 1.3缺省参数的分类 1.3.1 全缺省参数 1.3.2 半缺省参数 1.4缺省参数的应用场景 2. 函数重载 2.1函数重载的概念 2.2不支持函数重载的情况 3.引用 3.1引用的概念 3.2引用的特性 3.3引用做参数 3…

C++内存管理(new和delete)

目录 1. new/delete操作内置类型 2. new和delete操作自定义类型 3. operator new与operator delete函数 4 .new和delete的实现原理 1 .内置类型 2 .自定义类型 new的原理 delete的原理 new T[N]的原理 delete[]的原理 5. 定位new表达式(placement-new) 6. malloc/f…

【JavaScript】原生js实现省市区联动效果

&#x1f609;博主&#xff1a;初映CY的前说(前端领域) ,&#x1f4d2;本文核心&#xff1a;用原生js实现省市区联动 【前言】今日在复习省市县三级联动的时候&#xff0c;有点忘了原生的js应该怎么样处理省市县的联动&#xff0c;特此写下来再次复习下 目录⭐实现思路⭐思路转…

Node【六】内置模块 【url模块与queryString】

文章目录&#x1f31f;前言&#x1f31f;url 模块&#x1f31f; URL各部分说明&#x1f31f; 将URL字符串转换为对象&#x1f31f; 将对象格式化为URL字符串&#xff1a;url.format(urlObj)&#x1f31f; URL路径处理&#xff1a;url.resolve(from, to)&#x1f31f; queryStri…

Dapr和Rainbond集成,实现云原生BaaS和模块化微服务开发

背景 Dapr 是一个开源的分布式应用运行时&#xff0c;帮助开发者构建松耦合的分布式应用程序&#xff0c;具有良好的可扩展性和可维护性。Rainbond 是一款企业级的云原生应用管理平台&#xff0c;提供了丰富的功能和工具&#xff0c;方便开发者管理和部署应用。Rainbond 和 Da…

如何通过 kubernetes ingress 或者 istio ingressgateway 来暴露 TCP 的服务

点击上方“程序猿技术大咖”&#xff0c;关注并选择“设为星标”回复“加群”获取入群讨论资格&#xff01;在 kubernetes 或 istio 应用中&#xff0c;一般都是通过 kubernetes ingress 或者 istio ingressgateway 来暴露 HTTP/HTTPS 的服务。但是在实际应用中&#xff0c;还是…

纷享销客张睿:快消数字化新时代,数“智”引领新增长

4月6日&#xff0c;在2023年&#xff08;第八届&#xff09;中国快消品创新大会主论坛上&#xff0c;纷享销客经营副总裁兼快消行业部总经理张睿作为嘉宾出席&#xff0c;并以《快消数字化新时代&#xff0c;数“智”引领新增长》为题发表了演讲。他有20余年的市场营销、销售及…

【蓝桥杯省赛真题37】Scratch冰上滑行 少儿编程scratch编程蓝桥杯省赛比赛真题讲解

目录 scratch冰上滑行 一、题目要求 编程实现 二、案例分析 1、角色分析

JUC源码系列-ReentrantReadWriteLock

继承关系 ReadLock和WriteLock是ReentrantReadWriteLock的两个内部类&#xff0c;Lock的上锁和释放锁都是通过AQS来实现的。 AQS定义了独占模式的acquire()和release()方法&#xff0c;共享模式的acquireShared()和releaseShared()方法。 还定义了抽象方法tryAcquire()、tryA…