数据存储的相关知识

深入解读大模型开发工具Dify--底层数据存储 在接下来的内容中,我们将深入探讨 Dify 的底层数据存储架构,包括使用的数据库类型、数据组织方式以及如何优化存储策略,以便更好地利用这个强大的 AI 开发工具。app_model_configs 记录每个app的设置,如model、input、prompt、dataset_configs、创建与更新用户等。conversations 记录所有的对话,对话的名称、使用模型、input、对话方式、对话用户等信息。api_tokens 所有app的token相关信息,与下面的apps表对应。 阅读详情

数据存储的相关知识(二进制码,大小端,浮点数存储)

前言

人们在使用计算机的过程之中,本质上是将生活中的信息,通过数字化技术存储在计算机之中,通过一系列操作来得到我们使用的结果。因此了解数据在计算机中的存储至关重要。通过对以下关于数据存储的介绍,相信能够更深入的理解数据在计算机中存储的方式方法。

无符号数和有符号数

#include <stdio.h>
int main()
{
	int a = -10 , c = 10;//有符号
	unsign int b = -20 , d = 20;//无符号
	printf("%d %d",a,c);
	printf("%u %u",b,d);
    return
}

在以上程序中我们看到,数据分为有符号和无符号,无符号数无法正确表示负数,这是因为什么呢?想回答这个问题我们就要对其相关的概念进行了解。

无符号数(unsigned number):指的是整个机器字长的全部二进制位均表示数值位,相当于数的绝对值。
其中无符号数的取值范围为:0~2^n-1。

有符号数(signed number):一般用最高有效位(即符号位)来表示数的符号,正数用0表示,负数用1表示。
有符号数(补码表示)的取值范围是:-2^(n-1) ~ 2^(n-1)-1。

据此,我们还可以推出各数据的数据表示范围:

数据类型数据范围
unsigned char0 ~ 255
char-128 ~ 127
unsigned short0 ~ 65535
short-32768 ~ 32767
unsigned int0 ~ 2^32
int- 2^31 ~(2^31)-1

了解完相关概念之后,我们明白了:

以a=10为例,0 000 0000 0000 0000 0000 0000 0000 1010

b=-10 也可以表示为, 1 000 0000 0000 0000 0000 0000 0000 1010

由于b被声明为无符号数,所以将所有位都当做数据来读,所以b输出的值就是为2^31+10

原码,反码,补码

一、原码

**原码:**用最高位表示符号位,‘1’表示负号,‘0’表示正号。其他位存放该数的二进制的绝对值。

用四位带符号的2进制数来表示十进制数

十进制数10的二进制数为 1010 ,即 0*(2^0)+ 1*(2^1) + 0*(2^2) + 1*(2^3) = 10

当我们拿到了数据的原码便高兴地开启了我们的加法运算

0001 + 0100 = 0101( 1 + 8 = 9 ) ——没有问题

1001 + 1010 = 0011 ((-1) + (-2)= 3)——开始奇怪起来了

0010 + 1010 = 1001 ( 2 + ( -2 ) = -4 )——???

通过上述例子我们发现,从计算机原理上看,正数与正数只有正数与正数的原码相加才能够得到正确的值,而负数+正数或者负数+负数似乎无法得到正确的结果。

深究其原因,正是我们用来表示符号的符号引起的问题。

虽然原码看似简单易懂,但要是其运用于实现数据的加减,运算规则在有些情况下过于复杂,于是就有了反码的发明。

二、反码

反码:

正数的反码还是等于原码

负数的反码就是除了符号位不变,其他位置上做取反

  • 由刚刚的例子我们知道,原码最大的问题就是,一个数与它的相反数相加,并不能等于0,那么如果我们将二进制负数除去其符号位外的其他数位按位却反,是否就能够解决我们的问题呢?

​ 实验开始(运算的数据皆为反码)

0010 + 1101 = 1111 ( 2 + ( -2 ) = -7 )

1110 + 1101 = 1011 ( (-1)+ (-2) = (-4) )

好像依然存在问题,仔细观察结果我们不难发现,似乎反码相加的结果和正确的结果的偏移量差了1,那如果我们在原码取反之后再进行+1的操作,会怎样呢?于是我们又引出了补码的概念

三、补码

补码

正数的补码还是正数原码本身

负数的补码就是该负数的反码加一

我们继续以反码中出现的例子进行关于补码的运算

0010 + 1110 = 0000( 2 + ( -2 ) = 0 )

1111 + 1110 = 1011 ( (-1)+ (-2) = (-3) )

我们发现,二进制中负数与负数,负数与正数相加的问题已经得到解决了

接下来我们便来继续深入学习关于补码的知识

补充:内存数据在计算机中都是以补码的形式存在

补码——简单来说可以理解为,代替负数进行运算的正数,有了补码,加减法都可以进行统一的运算。

那么我们怎么才能让补码来代替负数做运算呢?

以生活来举个例:

如果现在时钟指在8点钟,可以怎么调整来使它指向6点钟呢?

很简单

1.将时针顺时针拨动10个小时

2.将时针逆时针拨动2个小时

这样的思想,似乎与像是做了一个类似于取模的运算,10与2相加正好等于时针运算的模——12

再拿两位的10进制为例子,进行深入说明:

24 - 1 = 23

24 + 99 = (一百) 23

若我们放弃进位,只看最后两位数,我们可以发现-1和+99是等效的。

反码的原理就如同以上举出的例子一样,将负的二进制数转化为一个等价的正二进制数来代替进行运算。

通过以上的举例,相信大家也不难看得出来,正负数值的补码也可以通过公式直接推导出来,而不是用"原码取反再加一"进行运算了。

当 X 为正数时,X的补码 = X

当 X 为负数时,X的补码 = X + 2^n。  n 是二进制显示的位数。

有了这样的公式我们就可以更加简单地解决在八位二进制表示-128的补码时遇到的问题了。

若根据"原码取反再加一"的原理,我们遇到-128时就不知从何下手了,它没有八位的原码和反码,我们应该怎么去求它的反码呢?

套用以上公式,我们不难得出,-128的补码 = -128 + 2^8 =128 =1000 0000

大小端

大端存储:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;

小端存储:是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

对于单字节数据的存储,比如char类型,是没有存在所谓的大小端存储的问题

大小端更多是对于多字节数据的存储,例如int、long等类型。

以0x12345678例子吧,我们可以展示大小端的不同之处

请添加图片描述

知道了大小端的不同之处,那么大小端有分别有什么优势呢?

大端:在于第一个字节就是高位,所以计算机可以通过符号位,在第一时间判断数据的正负性。输出时从低地址向高地址输出。

小端:由于其第一个字节是低位,最后一个字节是高位,可以依次取出与之相对应的字节进行运算,并且最终会把符号位刷新,这样计算机的运行将会更高效。输出时从高地址向低地址输出。

那我们又该如何确定当前计算机的环境时大端还是小段呢?

我们接下来介绍两种方法:

(1)联合体
#include <stdio.h>
union MyUnion {
    int value;
    unsigned char bytes[4];
};

int main() {
    union MyUnion x;
    x.value = 258;

    for (int i = 0; i < sizeof(x.bytes); i++) {
        printf("%02x ", x.bytes[i]);//%02X 表示以两位宽度输出十六进制数值,并在不足两位时补零。
    }

    return 0;
}

我们都知道,在联合体当中,当将一个整数赋值给共用体中的成员变量时,该整数会被存储在共用体的内存空间中。因为共用体的所有成员共享同一块内存,所以这个整数的二进制表示也同时影响了其他成员的值。将整数 258 赋值给 x.value,value 和 bytes 共享内存,因此 bytes 数组的内容也会被相应地修改。

因此,在以上程序中:

在大端序中,高位字节(值为1)存储在 bytes[0] 中,低位字节(值为2)存储在 bytes[1] 中。

在小端序中,低位字节(值为2)存储在 bytes[0] 中,高位字节(值为1)存储在 bytes[1] 中。

输出结果如下:

//输出结果
大端模式: 01 02 
小端模式: 02 01
(2)指针转换
#include <stdio.h>
int main() {
    int num = 1;
    char *ptr = (char *)&num;//对ptr解引用得到第一个字节里存储的数据

    if (*ptr == 1) {
        printf("小端模式\n");
    } else {
        printf("大端模式\n");
    }

    return 0;
}

这段代码的运行原理如下:

  1. 首先,我们创建一个整型变量 num 并将其初始化为1。
  2. 接下来,我们创建一个指向整型变量的指针 ptr,并将其指向 num 的内存地址。这里使用了 (char *)&num 的强制类型转换,将整型指针转换为字符指针。
  3. 然后,我们通过 *ptr 来访问指针所指向的内存位置,也就是 num 的第一个字节。
  4. 如果系统是小端的,num 的第一个字节存储的将会是最低有效字节,也就是1。所以,*ptr 的值将为1。
  5. 当我们检查 *ptr 的值时,如果它等于1,则表示系统是小端的。反之,如果不等于1,则表示系统是大端的。
练习习题
//假定程序运行环境为:CPU(32位小字节序处理器)
#include <stdio.h>
int main() {
    union{
		short k;
        char i[2];
    }*s,a;
    s = &a;
    s->i[0] = 0x39 ;
    s->i[1] = 0x38 ;
    printf("%x\n",a.k);//请说出输出的内容
    return 0;
}

在题目中的小字节序即为小端模式,我们知道在小端模式当中,输出是以高地址向低地址输出的,我们i[0]中的39存在低地址中,而i[1]中的38存在高地址中,所以,题目答案的输出结果为3839。

整型和浮点型的存储方式

在了解完关于整形数据的存储方式后,我们下一步就来了解浮点型数据的存储方式。

下面是float和double存储空间上的不同

float单精度浮点数

请添加图片描述

double双精度浮点数

请添加图片描述

在图中,我们不难看到,double类型可以表示的小数点位数增多了,即说明double类型的数据精度更高了,这也就是为什么float被称为单精度浮点数而double被称为双精度浮点数的原因了。

浮点数转化为二进制的方式:

1、首先将数据分为两部分:小数点前 和 小数点后。
2、将小数点前(整数部分)的二进制表示出来。小数点后的数据只能用0或1表示。以10.125为例子,在整数部分的5的二进制是1100。
3.在处理小数部分,我们采取 "乘2取整,顺序排列"的方法。即用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。

根据以上规则,我们不难得出10.125的二进制表示为1100.001

浮点数的表示规则

浮点数在计算机内的存储与整数的存储有较大差异。与整数不同,根据IEEE 754规定浮点数除了表示正负的符号位S外还包括阶码E和尾码M,可以使用如下形式进行表示:

任何一个浮点数在二进制中都可以转化为:((-1)^S) * M *(2^E)

其中S为0或1,0为整数,1为负数;

M表示有效数字, 1<=M<2;

E表示次方数,注意在二进制中科学计数法的底数为2。

例子:十进制数10.125,通过以上方法,我们得出它的二进制为1100.001

在计算机当中,因为1100.001为正数,所以 S = 0;M要为1<=M<2的有效数字,所以我们使用科学计数法将1100.001化作1.100001的形式,然后用E来补充,使的数字大小不变,由于小数点向前移动了三位,于是E即为2^3

1100.001在计算机中就可以表示为 [((-1)^0) * 1.100001 * (2^3)]

了解了计算机中浮点型小数的存储方式,我们还有几个规则要探究一下:

  • 隐藏高位:M可以写成1.XXXXXX的形式,其中xxxxxxxx表示小数部分,由于默认整数部分为1,所以在存储的时候并不会将整数部分的1进行存储而是只会存储小数部分。
  • 低位补0:有时候尾数会不够填满尾数位,所以我们要在后面补上0将M的内存补满。
  • 精度范围存在的意义:对于0.3来说,不论怎么操作都无法将其数据完全表示出来,所以精度存在能够让我们控制误差,并且确保数值的范围,进一步的提高计算的效率。
  • 指数 E的意义:E在计算机中存储的是一个无符号正数,这意味这,在32位中E的取值为0~255(8位),在64位中E的取值为0~2047(11位)。我们不禁有了一个问题,在科学计数法中是允许存在负数的,我们应该怎么做呢?

针对此问题,在IEEE 754中规定了,存入内存时 E 的真实值必须再加上一个中间数,对于 8 位的 E ,这个中间数是 127 ;对于 11 位的 E ,这个中间数是1023 。这样操作使得了指数部分肯定为一个非负整数。

就举几个例子吧:

在32位中,如果你运算后得到的指数是 -127 , 那么偏移后, 在指数位中就需要表示为: -127 + 127(偏移量) = 0

在64位中,如果你运算后得到的指数是 -10, 那么偏移后, 在指数位中需要表示为: -10 + 1023(偏移量) = 1013

E全为1:这时,如果有效数字 M 全为 0 ,表示 ± 无穷大(正负取决于符号位 s )

E全为0:意味着此时的指数是一个范围内的最小的负整数,表示的浮点数无限接近于0,

了解了这些规则之后我们就可以开始探究在内存当中浮点数是怎么存放的呢?

以32位的10.125为例子吧,10.125可表示为[((-1)^0) * 1.100001 * (2^3)]

10。125为正数S = 0;

E=3加上偏移量之后得到E = 3 + 128 = 131,用二进制表示就为1000 0010;

M = 1.100001由低位补0和隐藏高位的规则得,二进制的表示应该为100 0010 0000 0000 0000 0000(共23位)

计算机中浮点数的存储如下表所示:

SEM
01000 0010100 0010 0000 0000 0000 0000

如果将数据以一个字节为一组,我们就能得到:

0100 0001 0100 0010 0000 0000 0000 0000

在以十六进制来表示该二进制数,就得到了数据存储的地址

大端存储:41 42 00 00

小端存储:00 00 42 41

以上内容我们介绍了当E不全为0或1时的情况,接下来我们来讨论一下,另外的两种情况

E全为0:

#include <stdio.h>
int main(){
    int a = 10 ;
    float *pf = (float*)&a;//将一个整型变量 a 的地址强制类型转换为指向浮点数类型的指针
    printf("*pf = %f\n",*pf);
}

我们发现输出的值为0.000000,这是为什么呢?

根据以上的原则,我们不难发现,S = 0,E = 0000 0000,M = 000 0000 0000 0000 0000 1010;

再根据E全为0的规则,M 前不在补1,而是补0

即可以表示为:(( -1 )^ 0 ) * (0.000 0000 0000 0000 0000 1010) *(2^-126);

所以打印出来的值只能为0值。

E全为1:

#include <stdio.h>
int main(){
    int a = -10 ;
    float *pf = (float*)&a;//将一个整型变量 a 的地址强制类型转换为指向浮点数类型的指针
    printf("*pf = %f\n",*pf);
}

当a=-10时,计算机中保存的就是-10的补码,所以我们得到了:

S = 1,E = 1111 1111,M = 111 1111 1111 1111 1111 0110

由E全为1的规则,我们不难知道打印出来的一定为无穷大值

总结发现

进行了一轮较为浅层的学习,我不禁感到计算机出现的伟大,自计算机时代的开启,它就在不断地凝结了历代伟人的智慧,就像一件艺术品般闪耀着过往人类智慧的光辉。在感慨之余,我也更加明白对自身眼界的狭隘和知识储备的不足,希望与诸君共勉,在计算机的路上继续前进。

LVGL v8.3 图片显示与解码缓存实战:PNG 上屏、C 数组与文件双方案 LVGL v8.3 图片两种存储方式、PNG/JPG 上屏解码器挂载、LV_IMG_CACHE_DEF_SIZE 缓存调优、手动预解码头像有效性判断,及"缓存被动画清空"真实踩坑。 阅读详情

相关推荐

25、数据探索层的设计与实现及数据存储相关知识

本博客深入探讨了数据探索层的设计与实现,以及相关数据存储的关键技术与实践。内容涵盖数据移动方法、Parquet文件格式的应用、元数据和维度层次结构的维护、SQL Serverless与Spark集群的查询实现、Azure Synapse Analytics数据库模板的使用以及Azure Databricks和HDInsight中的数据存储策略。同时,还总结了数据存储的综合考量因素和最佳实践,为大数据处理中的存储问题提供了系统性的指导和建议。

tgb345678的博客 66

【Android-数据存储】内部存储的相关知识

android的数据存储主要分为三类: 内部存储 外部存储 sharedpreferences:添加链接描述 本文将主要介绍内部存储的相关知识: 写操作: 如何将数据存储到应用内部 读操作:如何将数据存储回显出来 文件存储的路径:/data/data//files(此处的applicationID一般为包名)【也可用File filesDir = this.getFilesDir();获取...

qq_40716430的博客 326

25、数据存储、恢复与软件工程相关知识解析

本博客详细探讨了数据存储、恢复技术与软件工程相关的核心知识。内容涵盖祖父-父亲-儿子(GFS)备份轮换系统、数据存档策略、RAID数据弹性增强技术以及业务连续性规划,深入解析了软件工程的定义、软件类型、操作系统原理及现代操作系统范式。此外,还介绍了操作系统的层次结构、性能优化、软件项目管理流程、质量保证方法和文档编制的重要性。这些内容为保障数据安全、提升软件开发效率及维护系统稳定运行提供了全面的技术支持与实践指导。

ww90123的博客 98

字符函数、字符串函数、内存函数与数据存储相关知识

字符/字符串函数:注意边界处理和溢出问题内存函数:优先使用memmove处理重叠内存数据存储:理解补码和大小端对编程调试至关重要浮点数:IEEE 754标准解析需结合二进制结构掌握这些知识点,能有效提升C语言编程的底层理解能力!

zhou061025的博客 996

QT5.14.2+VS2019安装配置教程Windows

QT5.14.2+VS2019安装使用教程Windows前言一. QT的下载与安装1. QT的下载2. QT的安装二. 配置Visual Studio编译器环境1. 扩展工具下载2. 扩展工具配置 前言 由于Visual Studio 的功能强大,很多开发人员比较熟悉使用,所以可以通过将QT配置到Visual Studio中进行开发。 一. QT的下载与安装 1. QT的下载 QT5.14.2下载地址 2. QT的安装 断开网络!断开网络!!断开网络!!! 安装QT之前,需要断开电脑的网络连接,这样就

Zander0的博客 7249

Welch 方法详解:一种经典而实用的功率谱密度估计方法

在信号处理领域,谱分析是用于分析信号频率内容的强大工具。Welch方法是现代谱分析中一种广泛使用的功率谱密度估计技术,由Peter D. Welch在1967年提出。它通过对信号进行分段、加窗和平均化处理,提供了一种平滑且稳定的频谱估计方法。Welch方法通过将信号分成多个重叠的段,每段应用窗函数,然后计算每段的周期图,最后对所有周期图进行平均化,得到平滑的功率谱密度估计。welch_psd函数接收信号x、采样频率fs、每段的样本数N、重叠样本数overlap和窗函数类型window。

DuHz的博客 7064

android成长日记 11.详细学习了数据存储相关基础知识

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34200628的博客 159

【AI概念】迁移学习 vs. 域自适应 vs. 域泛化|定义、核心原理、数学表达、易混淆点与工程选择建议|实际案例、工程实现细节、未来研究趋势、实际应用场景

大家好,我是爱酱。本篇将会详细梳理迁移学习(Transfer Learning)、域自适应(Domain Adaptation)、域泛化(Domain Generalization)三大常被混淆的核心概念,结合数学公式、典型算法与实际应用场景,帮助你厘清它们的本质区别、联系与工程意义。 注:本文章含大量数学算式、详细例子说明及大量代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!

AI人工智能爱酱~你的AI学习好帮手~ 2471

数据存储——无符号数有关计算、浮点数相关运算

数据存储知识点总结如下:

weixin_46153828的博客 338

lattice 黑盒子的生成和使用(Creating Your Own Black Box Modules)

很多客户,特别是外包项目,需要做黑盒子,防止他人看到源码,那么这就需要对相关的源码打包加封了。diamond help 说的也是模糊模糊的,这次给出实际验证过的流程。 1.先将要加封的模块间一个工程,建好工程,写好代码之后,模块名字叫做crosslink(这个使用黑盒子的时候要用),代码如下: module crosslink( output wire[3:0] led, input wire clk, input wire reset ); reg [29:0] cnt; reg [3:0] led1;

qq_39633876的博客 1481

小程序选项卡以及swiper套用(跨页面)

选项卡tab和swpier之间的套用 其实我之前写过一篇选项卡的切换demo,大家阔以参考一下 小程序多个选项卡切换 那今天写这个demo呢,是因为项目需求,所以仅供参考。 我是拿到了home.wxml的数组下标, 通过url传参的方式去将这个id传到下一个页面, 下一个页面接收以后再将id赋值给对应的tabI或者currentId(swiper 的下标) 实现上一个页面进来以后直接进入对应的页...

Rechal_Mei的博客 3597

数据安全知识:什么是数据存储?(非常详细)零基础入门到精通,收藏这一篇就够了

数据存储是利用计算机设备保存数字信息的过程。存储数据有助于高效地完成众多数字任务。计算机根据系统使用数据的方式利用不同类型的内存。例如,设备依靠 RAM 进行即时数据存储和检索,而ROM 则帮助存储长期数据。数据存储过程很快变得复杂。例如,处理大量数据的组织需要更快、大容量的存储设备。企业级数据存储面临的一些挑战是:数据量大。大数据项目、物联网、人工智能和机器学习需要大数据存储解决方案来存储大量数据。安全。企业需要一个安全的数据存储解决方案,并提供额外的保护,防止数据丢失和欺诈。数据的完整性。

leah126的博客 1420

DSP28335新手避坑指南:手把手教你用CCS6.2生成10KHz SPWM(附完整工程)

本文详细介绍了如何使用DSP28335开发板和CCS6.2环境生成10KHz SPWM波形的完整工程指南。从开发环境配置、ePWM模块设置到SPWM算法实现,特别针对新手常见问题提供了解决方案和调试技巧,帮助工程师快速掌握DSP28335的SPWM生成技术。

weixin_42522374的博客 182

Redis相关知识点思维导图

qq_43816365的博客 181

NX二次开发 内部函数鼠标动态位置获取

内部函数鼠标动态位置获取

qq285503851的博客 3337

详解账务核心,从入门到精通

本文系统阐述了账务体系的设计原理与实现方法,围绕支付交易的基础设施——账务系统展开深入探讨。文章首先从账务实现原理出发,强调从客户场景中抽象能力的重要性,详细解析了账务总架构及其与外围系统的协同关系。随后重点剖析了账户子系统的设计,包括账户生态、主体管理、结构设计等核心要素,并针对热点账户问题提出了多种创新解决方案。此外,文章还深入探讨了会计日切原理、营销类账务处理等专业领域,最后以支付机构场景为例,全面解析了清结算业务的账务实现模型。全文通过理论结合实践的方式,为构建高效、可靠的账务系统提供了系统性的方法

银行信息系统应用架构详解 532

数据存储结构(1)——分类

摘要:本文介绍了四种数据存储结构的特点及优缺点。顺序存储通过物理相邻实现高效随机访问,但插入删除效率低;链接存储利用指针动态分配内存,插入删除快但访问慢;索引存储通过索引表提高检索效率,但需额外空间;散列存储通过哈希函数实现O(1)访问,但设计复杂且不支持顺序查询。实际系统中常组合使用这些结构以适应不同需求。

Lily4801的博客 200

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Zotero——自定义 Zotero 数据存储位置

Zotero——自定义 Zotero 数据存储位置

Williamcsj的博客 375

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 数据存储位置,Android数据存储路径位置

File filepathq = getFilesDir();File filepathw = getCacheDir();File filepathe = getExternalCacheDir();File filepathr = getExternalFilesDir("dsaf");File filepatht = Environment.getExternalStorageDirecto...

weixin_30845893的博客 1359

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

mysql数据存储流程简单剖析

mysql数据存储流程简单剖析 流程图 我们在对数据库执行增删改操作的时候,不可能直接更新磁盘上的数据的,因为如果你对磁盘进行随机读写操作,那速度是相当慢,随便一个大磁盘文件的随机读写操作,可能都要几百毫秒。 在对数据库执行增删改操作的时候,实际上主要都是针对内存里的Buffer Pool中的数据进行的,也就是实际上主要是对数据库的内存里的数据结构进行了增删改,如下图所示。 为了避免数据库突然崩溃,mysql引入redo log机制,对内存里的数据进行增删改的时候,同时会把增删改对应的日志写入redo l

qq_24514625的博客 223

鸿蒙5.0开发:Web组件(Cookie及数据存储)

Cookie是一种存储在用户计算机上的小文本文件,用于在用户访问网站时存储和提取信息。

AyomQAQ的博客 1308

uniapp数据存储、获取和删除

<template> <view class="content"> <button type="primary" @click="setStorage">存储数据</button> <button type="primary" @click="getStorage">获取数据</button> <button type="primary" @click="delStorage">删除数据</button.

深漂小码哥 5575
上一篇: 单链表的相关操作
下一篇: 栈的相关知识
小鹿撞出了脑震荡
博客等级 码龄3年 1107粉丝 97原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值