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

崖山数据库的体系架构

一、 数据库与数据库实例YashanDB数据库英文名称叫做Yashan Database。这里所说的数据库是一个物理上的概念即指物理操作系统的文件或者磁盘的集合。换句话来说YashanDB数据库是由物理硬盘上许多的文件组成。这些文件包含了数据文件、控制文件、重做日志文件等等。数据库的配置信息、日志信息以及表中的数据最终都是存储在这些文件当中。YashanDB数据库的实例英文名称叫做Yashan Database Instance它是一个逻辑上的概念由操作系统的内存和操作系统中的进程组成。这些内存由同一个宿主机上运行的进程所共享。即使没有磁盘存储的数据库文件数据库实例也能存在但是这样的数据库实例没有实际的意义。对于一个正常运行的YashanDB数据库实例来讲可以把它看成是YashanDB数据库文件在内存中的镜像。客户端需要通过操作系统中的进程来访问内存中的这些镜像最终读写YashanDB数据库的数据。在不考虑YashanDB数据库集群的情况下一般情况下一个YashanDB数据库服务只包括一个YashanDB数据库和一个YashanDB数据库的实例。一个实例对应一个数据库。它们之间的对应关系如下图所示。二、 存储结构YashanDB数据库由硬盘上的文件组成而要读写数据需要通过YashanDB实例来完成。那么YashanDB数据库是如何存储数据的呢要搞清楚这个问题就需要理解什么是YashanDB数据库的存储结构。YashanDB数据库的存储结构是由逻辑存储结构和物理存储结构组成。一般来说数据库无论是关系型数据库还是NoSQL数据库在存储结构上都是通过逻辑存储结构来管理物理存储结构。下面分别介绍这两部分。2.1 YashanDB的逻辑存储结构从逻辑组成上来看一个YashanDB数据库是由一个或者多个表空间等组成一个表空间(tablespace)由一组段组成一个段(segment)由一组区组成一个区(extent)由一批数据库块组成一个数据库块(block)对应一个或多个物理块。如下图所示。下面分别对这些逻辑单元进行介绍。2.1.1 Database数据库Database是YashanDB中最大的逻辑单元它是按照数据结构来组织、存储和管理数据的仓库。所有的表、索引、存储过程、触发器等都被包含在了YashanDB的数据库中。2.1.2 Tablespaces表空间表空间(Tablespace)是数据库的逻辑划分一个表空间只能属于一个数据库。表空间对应一个或多个数据文件通常由相关的段组成。表空间的大小是它所对应的数据文件大小的总和,所有的数据库对象都存放在指定的表空间中。但主要存放的对象是表所以称作表空间。执行下面的语句可以查看YashanDB中的表空间信息。$ yasql / as sysdba SQL select tablespace_name from dba_tablespaces; # 输出的信息如下 TABLESPACE_NAME ------------------ SYSTEM SYSAUX TEMP SWAP USERS UNDO 6 rows fetched. # 在YashanDB数据库中有些表空间必须存在而有些表空间可以没有。下表列举了YashanDB数据库中的表空间信息以及它们各自在作用。2.1.3 Segments段一个段是分配空间时的一个逻辑结构该逻辑结构可能是表、索引或其他对象存储的一个区域它是数据库对象使用的空间集合。段可以有表段、索引段、回滚段、临时段和高速缓存段等而最常用的段就是表段和索引段。下面的语句将查询YashanDB数据库中段的信息。SQL select owner,segment_name,segment_type from dba_segments where segment_type TABLE and rownum5 union select owner,segment_name,segment_type from dba_segments where segment_type INDEX and rownum5; # 输出的信息如下 OWNER SEGMENT_NAME SEGMENT_TYPE ------------------ ------------------------ --------------------- MDSYS SPATIAL_REF_SYS TABLE MDSYS SPATIAL_REF_SYS_PKEY INDEX SYS I_OPTSTAT_OPR1 INDEX SYS I_OPTSTAT_TASK1 INDEX SYS I_OPTSTAT_TASK2 INDEX SYS MON_MODS_ALL$ TABLE SYS TABLE_PRIVILEGE_MAP$ TABLE SYS YLS$PROPS TABLE 8 rows fetched # 这里只显示了YashanDB数据库中部分段的信息。2.1.4 extents区区是数据库存储空间分配的一个逻辑单位它由连续数据块所组成。每一个段是由一个或多个区组成。当一个段中间所有使用的区空间已完全使用YashanDB数据库为该段重新分配一个新的范围即分配一组新的区来存储段中的数据。2.1.5 Data Block数据块数据块是YashanDB数据库管理的最小逻辑存储单位它也是数据库使用的I/O最小单位 即一次I/O读写的数据量大小。数据块的大小由db_block_size参数确定。数据块是处理YashanDB数据库更新、查询或者插入数据时的最小单位。当用户从表中读取数据时I/O操作将从数据库文件中以数据块为单位读取或者写入数据YashanDB数据库默认的数据块的大小为8 KB即使只想检索4 KB的数据也需要读取8 KB的数据量。通过下面的语句查看当前数据块设置的大小SQL show parameter db_block_size # 输出的信息如下 NAME VALUE -------------------- --------- DB_BLOCK_SIZE 8192 1 row fetched.2.2 YashanDB的物理存储结构YashanDB的物理存储结构就是指的YashanDB数据库在硬盘上存储的各种文件包括数据文件、联机日志文件、控制文件、归档日志文件、参数文件、告警日志文件、跟踪文件和备份文件等。下面分别介绍这些文件以及它们的作用。2.2.1 数据文件Data File一个数据库由多个表空间组成而表空间可以由多个数据文件组成的数据文件是真正存放数据库数据的。一个数据文件就是一个硬盘上的文件。表和索引中的数据在物理上是被存放在数据文件中的。当查询表中数据的时候如果内存中没有该表的数据那么YashanDB数据库的服务器进程将读取该表所在的数据文件然后把数据存放到内存中。通过下面的语句可以查看当前数据库中存在的数据文件和对应的表空间SQL select file_name,tablespace_name from dba_data_files; # 输出的信息如下 FILE_NAME TABLESPACE_NAME ------------------------------------------------------ ----------------- /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/system SYSTEM /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/sysaux SYSAUX /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/temp TEMP /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/swap SWAP /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users USERS /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/undo UNDO 6 rows fetched.当表空间中的数据文件写满时可以通过下面的语句往表空间中添加新的数据文件。例如往users表空间中添加一个10M大小的数据文件。SQL alter tablespace users add datafile /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users02 size 10M;执行下面的语句重新查看YashanDB数据库的数据文件信息SQL select file_name,tablespace_name from dba_data_files; # 输出的信息如下 FILE_NAME TABLESPACE_NAME ------------------------------------------------------- ----------------- /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/system SYSTEM /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/sysaux SYSAUX /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/temp TEMP /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/swap SWAP /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users USERS /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/undo UNDO /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/users02 USERS 7 rows fetched.2.2.2 重做日志文件Redo Log File一个数据库可以有多个联机重做日志文件它记录了数据库的变化。例如当YashanDB数据库产生异常时导致对数据的改变没有及时写入到数据文件中。这时YashanDB数据库就会根据联机重做日志文件中的信息来获得数据库的变化信息并根据这些信息把这些改变写到数据文件中。换句话来说联机重做日志文件中记录的重做日志可以用来进行数据库实例的恢复。下图展示了YashanDB数据库写入数据的过程。从上图可以看出当前客户端成功提交事务时数据有可能还没有写到数据文件上。如果此时数据库实例发生了崩溃写入的数据是会丢失的。当重新启动数据库实例时YashanDB会利用成功写入的重做日志来恢复实例在内存中的数据这个过程叫做实例恢复。由YashanDB数据库的SMON进程自动完成。通过下面的语句查看当前YashanDB数据库中存在的联机重做日志文件和对应的日志组信息。SQL select id,name,status from v$logfile; # 输出的信息如下 ID NAME STATUS -- --------------------------------------------------- --------- 0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE 1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE 2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 CURRENT 3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE 4 rows fetched.下表说明了重做日志文件不同状态的含义。下面是关于重做日志文件的一些基本操作。1添加新的重做日志文件。SQL alter database add logfile (redo5 size 200m);2重新查询已存在的重做日志文件。SQL select id,name,status from v$logfile; # 输出的信息如下 ID NAME STATUS --- ---------------------------------------------------- --------- 0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE 1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE 2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 CURRENT 3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE 4 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5 NEW 5 rows fetched.3切换重做日志文件。SQL alter system switch logfile;4重新查询已存在的重做日志文件。SQL select id,name,status from v$logfile; # 输出的信息如下 ID NAME STATUS --- ---------------------------------------------------- --------- 0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE 1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE 2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 ACTIVE 3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE 4 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5 CURRENT 5 rows fetched.5触发一个检查点并重新查询已存在的重做日志文件。SQL alter system checkpoint; SQL select id,name,status from v$logfile; # 输出的信息如下 ID NAME STATUS --- ----------------------------------------------------- --------- 0 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo1 INACTIVE 1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo2 INACTIVE 2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo3 INACTIVE 3 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo4 INACTIVE 4 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/redo5 CURRENT 5 rows fetched.2.2.3 控制文件Control File一个数据库至少要有一个控制文件控制文件中存放了YashanDB数据库的物理结构信息。这些物理结构信息就包括:1数据库的名字。2数据文件和联机日志文件的名字及位置。3创建数据库时的时间戳。4备份的元信息。YashanDB数据库在启动过程中会根据控制文件中记录的数据文件和联机重做日志文件的位置信息来打开数据库。由于控制文件非常重要为了更好的保护数据库通常在执行数据库备份时是需要备份控制文件的。可以通过下面的语句查看当前存在的控制文件。SQL select name from v$controlfile; # 输出的信息如下 NAME ---------------------------------------------------------------- /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl1 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl2 /home/yashan/yasdb/yasdb_data/db-1-1/dbfiles/ctrl3 3 rows fetched.可以看到在默认情况下YashanDB数据库有三个控制文件这三个控制文件的内容是一样的。这样的方式称之为控制文件的多路复用。即使其中的一个控制文件出现了问题YashanDB数据库也可以使用另一个控制文件。这样也不会因为数据库的损坏从而造成数据的丢失。2.2.4 归档日志文件归档日志文件是联机重做日志文件的副本它也记录了对数据库改变的历史。下面的语句将查看当前数据库的日志模式。SQL select log_mode from v$database; # 输出的信息如下 LOG_MODE ----------------- ARCHIVELOG 1 row fetched.YashanDB数据库默认是归档模式。在归档模式下YashanDB可以执行数据库的联机备份或者叫做数据库的热备份而在非归档模式下YashanDB只能执行数据库的离线备份或者叫做数据库的冷备份。2.2.5 参数文件配置参数文件是名为yasdb.ini的文本文件存放在$YASDB_DATA/config路径下产品安装时所指定的数据库初始配置参数将保存在此文件中后续数据库运行过程中对配置参数的非memory修改也将持久化到此文件中。下面展示了参数文件的内容$ pwd /home/yashan/yasdb/yasdb_data/db-1-1/config $ cat yasdb.ini # 输出的信息如下 _CLUSTER_ID2fd38e8003d1f864a081f24c187d4b2e NODE_ID1-1:1 CONTROL_FILES(?/dbfiles/ctrl1, ?/dbfiles/ctrl2, ?/dbfiles/ctrl3) ARCH_CLEAN_IGNORE_MODEBACKUP CGROUP_ROOT_DIR/sys/fs/cgroup LISTEN_ADDR192.168.79.10:1688 REPLICATION_ADDR192.168.79.10:1689 RUN_LOG_FILE_PATH/home/yashan/yasdb/log/db-1-1/run RUN_LOG_LEVELINFO SLOW_LOG_FILE_PATH/home/yashan/yasdb/log/db-1-1/slow CHARACTER_SETUTF8 TIME_ZONE 08:00 DATA_BUFFER_SIZE 512M CHECKPOINT_TIMEOUT 3002.2.6 密码文件密码文件是名为yasdb.pwd的文本文件不可直接进行编辑其路径受PASSWORD_FILE参数控制。该文件用于存储SYS用户的密码。SQL show parameter PASSWORD_FILE; # 输出的信息如下 NAME VALUE ----------------- ----------------------- PASSWORD_FILE ?/instance/yasdb.pwd 1 row fetched. # 密码文件内容为加密后信息虽然为文本文件但不能直接修改里面的内容。2.2.7 告警日志文件告警日志文件按照时间的先后顺序记录了数据库的重大活动和所发生的错误信息以及警告信息。因此当YashanDB数据库出现任何问题的时候首先就应当检查告警日志文件。警报文名字的格式是alert.log。警报文件的位置默认保存在了存放在$YASDB_DATA/log/alert目录下如下所示$ pwd /home/yashan/yasdb/yasdb_data/db-1-1/log/alert $ tail alert.log # 输出的信息如下 2025-12-03 15:35:11.569|12|Incident|0|0||the incident was controlled by flood, problem id4, last incident id77 2025-12-03 15:45:38.294|12|Incident|0|0||the incident was controlled by flood, problem id6, last incident id80 2025-12-03 15:54:53.672|12|Incident|0|0||the incident was controlled by flood, problem id1, last incident id82 2025-12-03 17:10:29.602|12|Incident|0|0||the incident was controlled by flood, problem id1, last incident id87 2025-12-03 17:58:03.305|12|Incident|0|0||the incident was controlled by flood, problem id1, last incident id90 2025-12-03 18:11:16.950|12|Incident|0|0||the incident was controlled by flood, problem id1, last incident id91 2025-12-04 15:00:03.294|12|Incident|0|0||the incident was controlled by flood, problem id1, last incident id96 2025-12-04 15:50:00.629|12|Incident|0|0||the incident was controlled by flood, problem id3, last incident id107 2025-12-04 15:52:31.697|12|Incident|0|0||the incident was controlled by flood, problem id2, last incident id116 2025-12-04 15:52:32.767|12|Incident|0|0||the incident was controlled by flood, problem id5, last incident id1182.2.8 跟踪文件跟踪文件是每个YashanDB数据库服务器进程都有的日志文件。当数据库运行中出现问题时通过查看跟踪文件中的内容可以帮助诊断YashanDB数据库的问题。因为每个服务器进程都会将错误信息写到跟踪文件中。因此数据库管理员DBA就可以根据跟踪文件的信息来查看进程中所发生的错误。在默认情况下YashanDB数据库的跟踪文件的位置保存在$YASDB_DATA/diag/trace/目录下。2.2.9 备份文件备份文件就是在数据库发生介质损坏的时候用来还原Restore数据库并执行恢复Recover数据的文件。三、 进程线程结构YashanDB实例启动后创建YASDB进程处理连接到数据库实例的客户端进程的请求。YASDB进程主要包含后台线程以及处理客户请求的工作线程。因此YashanDB采用的是多线程架构这样可以充分利用多核处理器的计算能力提高系统的并发性和响应性。在多线程架构中由一个主线程负责程序的初始化和协调工作然后创建多个子线程来执行具体的任务。每个线程可以独立地执行特定的代码块但它们共享进程的资源和内存空间。通过下面的步骤能够确定YashanDB数据库实例的进程信息和包含的线程信息。1确定YASDB进程的PID。$ ps -ef|grep yasdb # 输出的信息如下 yashan 45244 ... /home/yashan/yasdb/23.4.1.102/bin/yasdb open -D /home/yashan/yasdb/yasdb_data/db-1-1 # 这里的45244是YASDB的进程PID。2确定YASDB进程所包含的线程信息。$ top -H -p 45244 # 输出的信息如下 ...... PID USER ...... COMMAND 说明 45300 yashan ...... MMON AWR快照自动管理线程 45244 yashan ...... yasdb 主线程 45245 yashan ...... TIMER 逻辑时钟线程 45246 yashan ...... BUFFER_POOL BUFFER_POOL辅助线程 45247 yashan ...... PRELOADER 冷数据表扫描预读线程 45248 yashan ...... PRELOADER 45249 yashan ...... SMON 系统监控线程 45250 yashan ...... CKPT 检查点任务调度线程 45251 yashan ...... DBWR 数据脏块刷新线程 45252 yashan ...... DBWR 45253 yashan ...... SCHD_TIMER 高精度定时器线程 45254 yashan ...... REPL_TCP_LSNR HA监听线程 45260 yashan ...... LISTENER_LOG 监听日志线程 45261 yashan ...... UDS_LSNR 本地网络监听线程 45262 yashan ...... TCP_LSNR TCP监听线程 45263 yashan ...... RD_ARCH 归档文件传输线程 45264 yashan ...... ARCH_DATA 归档文件清理线程 45265 yashan ...... HEALTH_MONITOR 健康检查监控线程 45291 yashan ...... HOT_CACHE_RECYC 热块回收线程 45292 yashan ...... LOGW redo刷盘线程 45299 yashan ...... XFMR 后台转换任务调度线程 45301 yashan ...... JOB_QUEUE JOB的执行线程 45303 yashan ...... XFMR_WORKER_0 LSC后台转换任务执行线程四、 内存结构YashanDB数据库的内存结构可以看成是数据库文件的镜像而每个YashanDB数据库实例有两个关联的内存结构共享内存区域SGAShared Global Area和私有内存区域SPASession Private Area。共享内存区域是一组所有后台线程以及会话能够共享访问的内存结构例如数据缓存、SQL缓存、数据字典缓存等。私有内存区域是会话独占和管理的内存区域例如会话栈内存、会话堆内存。下图展示了YashanDB数据库实例的内存结构。4.1 共享内存区域SGA共享内存区域SGAShared Global Area一般共享给多个会话或线程使用主要包括内存共享池SHARE POOL、数据缓存DATA BUFFER、有界加速缓存AC BUFFER以及虚拟内存VIRTUAL MEMORY。通过下面的语句可以查看共享内存区域中的缓冲池SQL select * from v$sga; # 输出的信息如下 NAME SIZE --------------------------------- --------------------- data buffer 536870912 temporary buffer 134217728 large pool 134217728 redo buffer 67108864 hot cache 16777216 share pool 335544320 global application pool 16777216 dbwr buffer 8404992 job pool 4194304 audit queue buffer 16777216 10 rows fetched.下面分别介绍其中的主要缓冲池的功能和作用。4.1.1 内存共享池SHARE POOL内存共享池包含多个内存区域执行下面的语句可以进行查看SQL select name,sum(size) from v$share_pool group by name; # 输出的新如下 NAME SUM(SIZE) --------------------------------- ----------- SQL POOL 201326448 DICTIONARY CACHE POOL 67108864 LOCK POOL 33554432 CURSOR POOL 33554432 DSTB POOL 0 RECOVERY BUDDY POOL 0 BLOCK RES POOL 0 NON BLOCK RES POOL 0 GRC REQ POOL 0 GCS PC POOL 0 GRC OBJECT POOL 0 GLS POOL 0 STREAM POOL 0 FREE POOL 144 14 rows fetched.这里最主要的就是SQL POOL它表示SQL的缓存。该内存区域用户保存SQL解析树和执行计划。SQL引擎在执行语句时首先会匹配SQL缓存如果存在相同语句则无需编译直接使用已编译的执行计划从而避免硬解析节省开销。下面通过一个简单的示例来说明SQL POOL的功能。1使用scott用户登录YashanDB数据库实例。$ yasql scott/tiger2执行下面的SQL语句三次。SQL select count(empno) from emp; SQL select count(empno) from emp; SQL select count(empno) from emp;3切换到管理员用户监控SQL POOL中的信息。SQL select sql_text,parse_calls,loads,executions from v$sql where sql_text like %count(empno)%; # 输出的信息如下 SQL_TEXT PARSE_CALLS LOADS EXECUTIONS --------------------------------- ------------- ------- ------------ select count(empno) from emp 3 1 3 # 从输出的信息可以看出 # 该条SQL语句被加载了1次、解析了3次其中1次为硬解析2次为软解析 # 并执行了3次。4.1.2 数据缓存DATA BUFFER数据缓存用于缓存当前或最近使用的从磁盘读取的数据块的拷贝可优化数据库的I/O减少物理读/写。采用LRU算法管理当缓存区域内存不足、需要回收内存以重用时选择一些最长时间未使用的缓存块进行淘汰回收。数据缓存分为行数据缓存和列数据缓存行数据缓存用于存放行表相关的数据块拷贝列数据缓存用于存放列表相关的数据块拷贝。4.1.3 有界加速缓存AC BUFFER有界加速缓存类似于数据缓存但缓存的对象不同有界加速缓存只存放基于有界理论的AC对象。4.1.4 虚拟内存VMVIRTUAL MEMORY虚拟内存主要是由需要物化数据的SQL算子使用且在物化对象过大时将磁盘作为虚拟内存使用。虚拟内存又分为行虚拟内存和列虚拟内存相关SQL算子计算行存表数据时使用行虚拟内存计算列存表数据时使用列虚拟内存。4.2 私有内存区域SPA私有内存区域SPASession Private Area是每个会话创建时分配的独占内存区域与共享内存区域不同此区域的内存由会话独占和管理会话退出时释放该内存区域主要是满足SQL执行时的各种内存空间需求。该区域主要包括两部分会话栈内存该区域一般用于存放会话执行过程中临时使用的局部变量等。会话堆内存该区域一般用于存放生命周期较长的运行期数据。通过下面的语句可以查看每个会话的SPA的内存区域。SQL select type,sum(use_size) from V$SESSION_SPA group by type; # 输出的信息如下 TYPE SUM(USE_SIZE) --------------------------------- ------------- vm buffer pool 0 large pool 0 app pool 0 pq pool 0 columnar vm buffer pool 0

相关文章:

崖山数据库的体系架构

一、 数据库与数据库实例YashanDB数据库,英文名称叫做Yashan Database。这里所说的数据库是一个物理上的概念,即指物理操作系统的文件或者磁盘的集合。换句话来说,YashanDB数据库是由物理硬盘上许多的文件组成。这些文件包含了数据文件、控制…...

中文Python游戏开发避坑指南:植物大战僵尸开发中的5个常见问题及解决方案

Python游戏开发实战:植物大战僵尸复刻中的5个关键技术挑战 在游戏开发领域,Python凭借其简洁语法和丰富的库支持,成为许多独立开发者的首选语言。植物大战僵尸作为一款经典的塔防游戏,其核心玩法看似简单,但在实际开发…...

Mojo模块如何无缝注入PyTorch训练循环:从Cython替代到JIT热重载的完整链路(仅限内测版工具链公开)

第一章:Mojo模块如何无缝注入PyTorch训练循环:从Cython替代到JIT热重载的完整链路(仅限内测版工具链公开)Mojo模块通过原生ABI兼容层与PyTorch C前端深度对齐,无需修改torch.compile()调用栈即可嵌入训练循环。其核心机…...

RFSOC XCZU47DR在5G射频基带开发中的实战应用(含代码示例)

RFSOC XCZU47DR在5G射频基带开发中的实战应用(含代码示例) 在5G通信系统的开发中,射频基带处理一直是工程师面临的核心挑战之一。Xilinx的RFSOC XCZU47DR凭借其独特的架构设计,将高性能RF数据转换器与可编程逻辑完美融合&#xff…...

全球真空电子方向研究单位集锦

摘要:微波电子管是雷达、卫星、导弹、核聚变的核心 "心脏",也是全球少数几个真正的 "卡脖子" 技术之一。全世界能独立研制高端微波管的国家不超过 5 个,顶尖研究机构更是屈指可数。本文承接《微波电真空器件硬核科普》系…...

MetalLB才是给Ingress这个老登做负重前行的那个男人棺

一、核心问题及解决方案(按踩坑频率排序) 问题 1:误删他人持有锁——最基础也最易犯的漏洞 成因:释放锁时未做身份校验,直接执行 DEL 命令删除键。典型场景:服务 A 持有锁后,业务逻辑耗时超过锁…...

IP地址什么?工业场景网络注意事项有哪些?僬

OCP原则 ocp指开闭原则,对扩展开放,对修改关闭。是七大原则中最基本的一个原则。 依赖倒置原则(DIP) 什么是依赖倒置原则 核心是面向接口编程、面向抽象编程, 不是面向具体编程。 依赖倒置原则的目的 降低耦合度&#…...

从模型下载到API服务:手把手教你用MS-Swift+VLLM部署Qwen2.5-VL,打造自己的图像理解服务

从模型下载到API服务:手把手教你用MS-SwiftVLLM部署Qwen2.5-VL,打造自己的图像理解服务 在人工智能技术快速发展的今天,多模态大模型正逐渐成为理解和处理图像、文本等复杂数据的关键工具。Qwen2.5-VL作为一款强大的视觉语言模型,…...

Cross Q: Enhancing Deep Reinforcement Learning with Batch Normalization and Wide Critic Networks for

1. 深度强化学习的样本效率困境 深度强化学习(Deep Reinforcement Learning, DRL)近年来在游戏AI、机器人控制等领域取得了显著进展,但样本效率(Sample Efficiency)问题始终是制约其实际应用的瓶颈。简单来说&#xff…...

93.91%压缩率背后的技术革命:CompressO如何解决企业级视频处理的效率困境

93.91%压缩率背后的技术革命:CompressO如何解决企业级视频处理的效率困境 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirr…...

5个核心策略解决Windows更新故障

5个核心策略解决Windows更新故障 【免费下载链接】Reset-Windows-Update-Tool Troubleshooting Tool with Windows Updates (Developed in Dev-C). 项目地址: https://gitcode.com/gh_mirrors/re/Reset-Windows-Update-Tool Windows更新是系统健康的重要保障&#xff0c…...

Nigate:Mac NTFS全功能读写解决方案——面向跨平台用户的高效文件交互指南

Nigate:Mac NTFS全功能读写解决方案——面向跨平台用户的高效文件交互指南 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting…...

AI Agent 赋能智能客服:Vue3 + LangChain + 千问落地实战

前言 👋 本文适合有前端基础的开发者阅读。我会从整体架构出发,详解如何用Vue3 TypeScript做前端交互、**Python3 LangChain 千问(Qwen)**做后端推理,构建一个真正能落地的智能客服 Agent。代码干货较多&#xff0…...

RAGFlow实战:从零基础到构建企业级AI知识库

在2026年的今天,大模型(LLM)已经不再是新鲜事,但如何将这些“通才”模型转化为企业内部的“专才”,依然是技术落地的核心痛点。检索增强生成(RAG)技术应运而生,而RAGFlow作为一款开源…...

Docker+SyncTV+cpolar三件套:手把手教你搭建私人同步影院(附固定域名技巧)

DockerSyncTVcpolar三件套:打造高可用私人同步影院实战指南 在数字娱乐需求日益个性化的今天,私人影院的搭建已经从单纯的本地播放升级为兼具社交属性的协同体验。想象一下,无论好友身处何地,都能实时同步观看你精选的影片&#x…...

从删库到跑路?Oracle DBA必备的5种安全删除操作手册(附实战命令)

Oracle DBA安全删除操作全指南:从原理到实战 引言:为什么安全删除如此重要? 在数据库管理领域,删除操作可能是最令人胆战心惊的任务之一。想象一下这样的场景:凌晨三点,你接到紧急电话,因为一个…...

使用 Python 将 Excel 数据批量导入到数据库中(SQLite)

一、应用场景与方案优势适用场景企业 Excel 报表数据迁移至数据库持久化存储;自动化办公:定期将 Excel 导出数据同步到数据库;轻量级数据中台:多 Excel 文件整合入库,方便后续查询分析;4.测试数据构造&…...

点点库存管理小程序使用小技巧:两种采购方式搭配批量入库更省心

在库存管理系统的采购模块中,通常需要处理两种业务场景:常规采购(需上级审批)和紧急采购(免审批即时入库)。点点库存管理小程序同时支持这两种方式——生成待审核采购单与直接入库,并且均可搭配…...

2026年国内AI大厂薪资大揭秘:80万年薪不是梦?揭秘高薪背后的真相!

今天给大家盘一盘2026年国内几家主流AI大厂的薪资情况,数据主要来自招聘平台、社交媒体上的员工爆料,以及身边朋友的真实反馈。 最近两年,国内AI行业的人才争夺已经到了白热化的阶段,月之暗面、智谱AI、百川智能、MiniMax、DeepSe…...

IAR开发实战:如何用#pragma指令把C语言全局变量精准“钉”到指定RAM段(附完整icf配置)

IAR开发实战:全局变量精准定位到指定RAM段的高级技巧 在嵌入式开发中,内存管理一直是工程师们需要面对的挑战之一。当项目复杂度增加,性能要求提高时,如何高效地利用有限的RAM资源,将关键变量放置在最优位置&#xff0…...

告别Excel!用QT的QTableWidget打造你的第一个桌面端数据管理工具(附完整源码)

从Excel到专业桌面应用:基于QT的QTableWidget数据管理系统实战 在数据处理领域,Excel长期占据主导地位,但当数据量增长到数千行、需要复杂业务逻辑或多人协作时,电子表格的局限性就暴露无遗。许多开发者都面临过这样的困境&#x…...

小团队福音:用两台服务器搞定Redis高可用(Keepalived+互为主从配置)

小团队福音:用两台服务器构建轻量级Redis高可用架构 在初创公司和小型技术团队中,服务器资源往往捉襟见肘。当业务需要Redis作为缓存或数据库时,传统的高可用方案如哨兵模式需要至少三台服务器,这对资源有限的团队来说可能过于奢侈…...

合宙ESP32-C3用PlatformIO调试,别再为USB CDC和DIO配置头疼了

合宙ESP32-C3 PlatformIO调试实战:USB CDC与DIO配置全解析 第一次接触合宙ESP32-C3的开发板时,我被它简洁的设计和亲民的价格所吸引。但当我兴冲冲地打开PlatformIO准备大展拳脚时,却接连遇到了串口无法识别、程序下载失败等一系列问题。经过…...

汇川AM402 PLC控制IS620N伺服:手把手教你封装自己的轴控功能块(附完整工程)

汇川AM402 PLC控制IS620N伺服:从零封装轴控功能块的工程实践 在工业自动化项目中,伺服控制是最基础也最频繁使用的功能之一。想象一下,你正在开发一个包装产线控制系统,需要同时管理十几台伺服电机——每台电机都需要重复编写使能…...

Beyond Compare 5 许可证书生成与应用完全指南

Beyond Compare 5 许可证书生成与应用完全指南 【免费下载链接】BCompare_Keygen Keygen for BCompare 5 项目地址: https://gitcode.com/gh_mirrors/bc/BCompare_Keygen 一、问题剖析:许可管理核心挑战 1.1 评估期限制的实际影响 Beyond Compare 5作为专业…...

Binder使用方式及常见组成及案例分析

Binder 是 Android 核心的跨进程通信(IPC) 机制,以一次内存拷贝、内置安全校验、面向对象接口为核心优势,是系统服务与应用通信的基石。下面从核心组成、使用方式、实战案例、原理与常见问题四方面完整解析。一、Binder 核心组成&…...

Redis:延迟双删的适用边界与落地细节诒

pagehelper整合 引入依赖com.github.pagehelperpagehelper-spring-boot-starter2.1.0compile编写代码 GetMapping("/list/{pageNo}") public PageInfo findAll(PathVariable int pageNo) {// 设置当前页码和每页显示的条数PageHelper.startPage(pageNo, 10);// 查询数…...

TMS320F28335实战:IQmath库在实时控制系统中的高效应用

1. TMS320F28335与IQmath库的黄金组合 第一次接触TMS320F28335这款DSP芯片时,我就被它的实时处理能力震撼到了。作为TI C2000系列的明星产品,28335凭借150MHz主频和硬件浮点运算单元(FPU),在电机控制、数字电源这些对实时性要求苛刻的领域简直…...

死细胞去除磁珠如何优化细胞实验质量?

一、死细胞为何影响实验结果可靠性?在细胞培养及组织样本制备过程中,不可避免地存在一定比例的死细胞。这些死亡细胞不仅占用培养空间和营养资源,更重要的是会释放胞内内容物,包括蛋白酶、核酸酶及活性氧等,对活细胞造…...

别再手动画甘特图了!3分钟学会用Excel条件格式自动生成(含节假日设置技巧)

别再手动画甘特图了!3分钟学会用Excel条件格式自动生成(含节假日设置技巧) 项目管理中,甘特图是展示任务进度和时间安排的重要工具。传统手动绘制甘特图不仅耗时耗力,而且难以应对频繁的日期调整。今天,我将…...