Redis设计与实现——单机Redis实现
RedisDB
RedisDB的核心结构
-
键空间(dict*dict)
-
结构:哈希表(字典),键为字符串对象(SDS),值为 Redis 对象(字符串、列表、哈希等)。
-
功能:存储所有持久化数据,支持增删改查操作。
-
-
过期字典(dict*expires)
-
结构:哈希表,键与键空间共享(指针引用),值为
long long
类型的时间戳(毫秒精度)。 -
功能:记录键的过期时间,过期自动删除。
-
-
阻塞键(blocking_keys):用于 BLPOP 等阻塞操作。
-
解锁键(ready_keys):解除阻塞的键(与阻塞键配合使用)。
-
监控键(watched_keys):被 WATCH 监控的键(用于事务)。
键的过期与删除策略
-
惰性删除(被动删除)
-
触发时机:访问键时检查是否过期(如
GET
、HGET
等命令)。 -
流程:执行命令前检查键是否存在于
expires
;若存在且当前时间 ≥ 过期时间,删除键及其值;返回空值或错误。 -
优点:对 CPU 友好,仅在实际访问时处理。
-
缺点:若键长期不被访问,可能内存泄漏。
-
-
定期删除(主动删除)
-
触发时机:Redis 周期性执行
serverCron
任务(默认每秒 10 次)。 -
流程:每次从
expires
中随机抽取 20 个键;若发现过期键,立即删除;当本轮扫描中过期键比例 ≤ 25% 时停止。 -
优点:减少内存泄漏风险。
-
缺点:需平衡扫描频率与 CPU 开销。
-
-
内存淘汰策略
-
volatile-ttl:优先淘汰即将过期的键。
-
allkeys-lru:淘汰最近最少使用的键。
-
noeviction:不淘汰,返回错误(默认策略)。
-
核心操作流程
-
键的增删改查
-
写入操作(如
SET
):将键值对插入键空间(dict
);若设置过期时间,同步更新expires
。 -
读取操作(如
GET
):从dict
查找键,若不存在返回nil
;若存在,检查expires
是否过期,过期则删除并返回nil
。 -
删除操作(如
DEL
):从dict
和expires
中移除键;释放键对象和值对象的内存(引用计数减 1)。
-
-
数据库切换(
SELECT
命令):客户端通过redisClient.db
指针指向当前数据库(redisDb
数组的索引)。 -
键的阻塞与事务
-
阻塞键(
blocking_keys
):记录因BLPOP
等命令被阻塞的客户端。 -
事务监控(
watched_keys
):执行WATCH
时记录键,事务提交前检查键是否被修改,实现 CAS(Check-and-Set)。
-
持久化关联
- RDB 快照:保存时遍历
dict
中的所有键值对,写入二进制文件。 - AOF 日志:记录写命令,重写时根据
dict
当前状态生成最小命令集。 - 过期键处理:
- RDB:持久化时忽略过期键。
- AOF:键过期后追加
DEL
命令。
性能优化
- 控制数据库数量:非必要不使用多个数据库,避免切换开销。
- 合理设置过期时间:避免大量键同时过期(导致 CPU 突增)。
- 监控内存使用:通过
INFO memory
跟踪used_memory
和evicted_keys
。
RDB持久化
RDB 持久化的触发机制
-
手动触发
-
SAVE 命令:阻塞 Redis 主进程直至 RDB 文件创建完成,期间拒绝所有客户端请求(仅调试或内存极小的情况)。
-
BGSAVE 命令:主进程 fork 子进程异步生成 RDB 文件,主进程继续处理请求,非阻塞,生产环境首选。
-
-
自动触发:通过
save
配置项设置触发条件,满足任一条件即触发BGSAVE
。 -
主从复制:主节点首次与从节点同步时触发 RDB 生成。
-
SHUTDOWN 命令:正常关闭服务器时自动执行
SAVE
(若未开启 AOF)。
RDB 文件生成流程
-
子进程创建
- 写时复制(Copy-on-Write):
BGSAVE
通过fork()
创建子进程,子进程共享主进程内存页。 - 当主进程修改数据时,内核复制被修改的页,确保子进程的数据视图冻结在 fork 瞬间。
- 写时复制(Copy-on-Write):
-
数据序列化:子进程遍历当前数据库的所有键值对,按 RDB 格式序列化数据。
-
键空间遍历:按字典顺序扫描数据库的
dict
。 -
数据编码:根据数据类型选择最优编码(如字符串直接存储,列表转为压缩列表等)。
-
-
文件写入
-
临时文件:数据先写入临时文件(默认
temp-<pid>.rdb
),完成后原子替换旧 RDB 文件。 -
刷盘策略:依赖操作系统缓冲区,可通过
rdb-save-incremental-fsync
配置增量刷盘。
-
-
错误处理
-
子进程崩溃:主进程记录日志,RDB 文件保留旧版本。
-
磁盘满:写入失败,删除临时文件,保留旧 RDB。
-
RDB 文件结构
- 魔数:5字节,固定为
REDIS
,标识文件类型。 - RDB 版本号:4字节,如
0009
表示 Redis 6.x 的 RDB 版本。 - 数据库数据:按数据库编号顺序存储各库的键值对。
- 键值对编码:类型标识(1字节)+ 键长度 + 键内容 + 值编码(如字符串长度 + 内容)。
- 过期时间:可选字段,记录键的毫秒级过期时间戳。
- 结束标识:1字节
0xFF
。 - CRC64 校验和:8字节,用于验证文件完整性。
RDB 文件加载流程
- 文件校验:检查魔数和 CRC64 校验和。
- 按序解析:逐个读取数据库数据,重建键空间和过期字典。
- 阻塞加载:加载期间拒绝所有客户端请求,直至完成。
RDB 与 AOF 的对比
特性 | RDB | AOF |
---|---|---|
持久化粒度 | 时间点快照 | 记录每次写操作(日志追加) |
数据安全性 | 可能丢失数分钟数据 | 通常最多丢失1秒数据(默认配置) |
恢复速度 | 快 | 慢(需重放日志) |
文件体积 | 小 | 大(需定期重写优化) |
适用场景 | 备份、快速重启、容忍数据丢失 | 高数据安全性要求 |
AOF持久化
AOF 持久化的工作机制
-
命令追加(Append)
- 客户端执行写命令(如
SET
、HSET
)后,Redis 将该命令转换为 Redis 协议格式(RESP)。 - 命令追加到
aof_buf
缓冲区(内存)。 - 根据配置的同步策略(
appendfsync
),将aof_buf
写入并同步到 AOF 文件。
- 客户端执行写命令(如
-
文件同步策略(
appendfsync
)策略 行为 数据安全性 性能 always
每个写命令都同步到磁盘(调用 fsync
)最高(零丢失) 最差(频繁 IO) everysec
每秒批量同步一次(后台线程执行) 最多丢失1秒数据 平衡(默认配置) no
由操作系统决定同步时机(通常约30秒) 最低 最佳
AOF 文件重写(Rewrite)
-
触发条件
-
手动触发:执行
BGREWRITEAOF
命令。 -
自动触发:根据配置的阈值自动触发。
-
-
重写流程
-
创建子进程:主进程 fork 子进程执行重写(利用写时复制保证数据一致性)。
-
遍历数据库:子进程遍历所有数据库的键空间,生成重建数据的最小命令集。
-
优化策略:合并多个命令(如用
HMSET
替代多次HSET
);忽略过期键和已删除键的历史操作。 -
写入临时文件:新 AOF 命令写入临时文件(避免影响原文件)。
-
替换旧文件:重写完成后,用临时文件原子替换旧 AOF 文件。
-
-
重写期间的写入处理
-
双缓冲区机制:主进程将重写期间的写命令同时写入
aof_buf
(原AOF文件)和aof_rewrite_buf
(重写缓冲区)。 -
同步阶段:重写完成后,主进程将
aof_rewrite_buf
追加到新 AOF 文件,确保数据一致性。
-
AOF 文件加载与数据恢复
- 创建伪客户端:模拟客户端执行 AOF 文件中的命令。
- 逐条执行命令:按顺序重放所有写操作,重建内存数据库。
- 错误处理:若 AOF 文件损坏(如末尾不完整),可用
redis-check-aof --fix
工具修复;Redis 4.0+ 支持加载截断的 AOF 文件。
混合持久化(RDB + AOF)
- 文件结构:重写后的 AOF 文件前半段为 RDB 格式快照,后半段为增量 AOF 命令。
- 优点:快速加载(RDB 部分)+ 低数据丢失风险(AOF 部分);文件体积小于纯 AOF。
- 启用方式:设置
aof-use-rdb-preamble yes
。
生产环境建议
- 启用 AOF + 混合持久化:兼顾安全性与恢复速度。
- 监控 AOF 状态:通过
INFO persistence
查看aof_current_size
和aof_rewrite_in_progress
。 - 合理配置同步策略:对数据安全性要求极高:
appendfsync always
;平衡场景:appendfsync everysec
。 - 定期备份 AOF 文件:与 RDB 文件一同存储至异地。
事件处理
- Redis 采用 单线程事件驱动模型,通过高效的事件循环处理网络 I/O 和定时任务,实现高并发与低延迟。
文件事件(File Events)
- 功能:处理客户端请求、命令读取与响应等网络 I/O 操作。
- 实现:基于 I/O 多路复用(如
epoll
、kqueue
)监听多个套接字,实现非阻塞通信。- 连接处理:客户端发起连接时触发
accept
事件,创建连接对象。 - 命令处理:客户端发送命令后触发
read
事件,解析并执行命令,结果写入输出缓冲区,触发write
事件返回响应。
- 连接处理:客户端发起连接时触发
- 特点:单线程按序处理,避免竞态条件,依赖高效的数据结构与协议解析。
时间事件(Time Events)
- 功能:执行定时或周期性任务(如清理过期键、持久化、统计等)。
- 类型:
- 周期性事件:如
serverCron
(默认每秒 10 次),负责键过期检查、AOF 重写触发、集群心跳等。 - 一次性事件:如延迟执行的任务。
- 周期性事件:如
- 调度:事件按执行时间戳排序,每次事件循环选择最近的事件执行。
事件循环(Event Loop)
- 等待事件:调用 I/O 多路复用 API(如
epoll_wait
),阻塞至文件事件就绪或最近时间事件到达。 - 处理文件事件:执行就绪的读写事件(如接受连接、读取命令、返回响应)。
- 处理时间事件:执行所有到期的时间事件(如
serverCron
)。 - 循环重复:进入下一轮事件等待。
- 优先级:优先处理文件事件(保证响应速度),时间事件可能被延迟但不会丢弃。
设计优势
- 高效单线程:避免多线程上下文切换与锁竞争,内存操作快速。
- 无阻塞:I/O 多路复用 + 非阻塞套接字,充分利用 CPU。
- 可扩展性:通过合理拆分任务(如后台持久化使用子进程),避免主线程阻塞。
Redis客户端
客户端生命周期与核心流程
-
连接建立
- 客户端通过 TCP 连接服务器,触发文件事件
accept
。 - 创建
client
对象,初始化fd
、db
(默认选库 0)、querybuf
等字段。 - 将客户端加入服务器的全局客户端列表
clients
。
- 客户端通过 TCP 连接服务器,触发文件事件
-
命令处理
-
读取请求:客户端发送的命令数据被读入
querybuf
,按 Redis 协议(RESP)解析为argv
和argc
。 -
查找命令:根据
argv[0]
(命令名)在命令表commandTable
中查找对应的redisCommand
结构(含函数指针)。 -
执行命令:调用
cmd->proc(client)
执行命令,结果写入reply
缓冲区。 -
返回响应:将
reply
中的数据通过套接字发送给客户端,清空缓冲区。
-
-
连接关闭
-
主动关闭:客户端发送
QUIT
命令或断开连接。 -
被动关闭:服务器因超时(
timeout
配置)、协议错误或内存限制强制断开。 -
资源释放:释放
client
对象、缓冲区内存,关闭套接字。
-
客户端状态与特性
-
阻塞操作
-
场景:执行
BLPOP
、BRPOP
、SUBSCRIBE
等阻塞命令。 -
处理:将客户端标记
CLIENT_BLOCKED
,移入blocked_clients
列表;阻塞期间暂停读取新命令,直到数据到达或超时。
-
-
事务支持(MULTI模式):命令缓存在客户端的
mstate
队列,直到EXEC
或DISCARD
;通过WATCH
监控键,被修改时事务中止。 -
Pub/Sub 订阅
-
订阅状态:客户端订阅频道后,只能执行订阅相关命令,其他命令被拒绝。
-
数据推送:发布的消息直接写入客户端的
reply
缓冲区。
-
-
输出缓冲区管理(限制配置):超出限制时,服务器断开连接以防止内存耗尽。
客户端的限制与优化
-
最大连接数:
maxclients 10000
(默认 10000),超出限制时,新连接被拒绝。 -
超时控制:
timeout 300
(默认 300 秒无交互后断开连接)。 -
客户端列表查询:
CLIENT LIST
查看所有客户端信息(IP、状态、内存使用等)。
Redis服务器
服务器启动流程
- 初始化配置:加载
redis.conf
配置(端口、持久化策略、内存限制等);创建默认的 数据库,初始化键空间字典与过期字典。 - 启动事件循环:创建 事件循环器(
aeEventLoop
),绑定文件事件(网络 I/O)和时间事件;监听客户端连接请求。 - 加载持久化数据:若存在
dump.rdb
或appendonly.aof
,恢复数据到内存。 - 运行就绪:进入事件循环(
aeMain
),开始处理客户端请求与后台任务。
请求处理流程
- 接收连接:客户端发起连接,触发文件事件,调用
accept
创建client
对象,加入全局客户端列表。 - 读取命令:将客户端发送的数据存入
querybuf
,按 RESP 协议解析为命令参数(argv
和argc
)。 - 执行命令:查找命令表获取对应的处理函数;执行函数,操作数据库(如更新键空间),结果写入
reply
输出缓冲区。 - 返回响应:将
reply
中的数据通过套接字返回客户端,清空缓冲区。
多数据库管理
- 数据库切换:通过
SELECT
命令切换当前数据库(修改client.db
指针)。 - 键空间操作:所有数据操作基于
redisDb.dict
(键空间字典)和redisDb.expires
(过期字典)。 - 键过期策略:结合惰性删除(访问时检查)和定期删除(
serverCron
任务扫描)。
后台任务与扩展功能
- 持久化:RDB—通过
BGSAVE
fork 子进程生成快照;AOF—追加写命令,定期重写优化文件。 - 过期键清理:
serverCron
每秒执行 10 次,随机抽查并删除过期键。 - 内存管理:根据
maxmemory
策略(LRU、LFU 等)淘汰键,防止内存溢出。 - 慢查询日志:记录执行超时的命令(
slowlog-log-slower-than
配置)。
单线程模型的核心优势
- 无锁设计:避免多线程竞争,简化实现,内存操作原子化。
- 高效 I/O:通过 I/O 多路复用(如
epoll
)处理高并发连接。 - CPU 亲和性:单线程绑定 CPU 缓存,减少上下文切换开销。
相关文章:
Redis设计与实现——单机Redis实现
RedisDB RedisDB的核心结构 键空间(dict*dict) 结构:哈希表(字典),键为字符串对象(SDS),值为 Redis 对象(字符串、列表、哈希等)。 功能&#x…...
ES C++客户端安装及使用
介绍 Elasticsearch , 简称 ES ,它是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful 风格接口,多数据源&…...
C++学习之STL学习
在经过前面的简单的C入门语法的学习后,我们开始接触C最重要的组成部分之一:STL 目录 STL的介绍 什么是STL STL的历史 UTF-8编码原理(了解) UTF-8编码原理 核心编码规则 规则解析 编码步骤示例 1. 确定码点范围 2. 转换为…...
【东枫科技】使用LabVIEW进行NVIDIA CUDA GPU 开发
文章目录 工具包 CuLab - LabVIEW 的 GPU 工具包特性和功能功能亮点类似 LabVIEW 的 GPU 代码开发支持的功能数值类型和维数开发系统要求授权售价 工具包 CuLab - LabVIEW 的 GPU 工具包 CuLab 是一款非常直观易用的 LabVIEW 工具包,旨在加速 Nvidia GPU 上的计算密…...
LangChain对话链:打造智能多轮对话机器人
LangChain对话链:打造智能多轮对话机器人 目录 LangChain对话链:打造智能多轮对话机器人ConversationChain 是什么核心功能与特点基本用法示例内存机制自定义提示词应用场景与其他链的结合`SequentialChain` 是什么 硬件组成: NodeMC…...
HTML12:文本框和单选框
表单元素格式 属性说明type指定元素的类型。text、password、 checkbox、 radio、submit、reset、file、hidden、image 和button,默认为textname指定表单元素的名称value元素的初始值。type为radio时必须指定一个值size指定表单元素的初始宽度。当type为text 或pas…...
JVM规范之运行时数据区域
JVM运行时数据区 前言为什么要阅读jvm规范?阅读本篇文章可以学习到啥? 正文概述JVM线程私有的运行时数据区pc(program counter) RegisterJVM StackNative Method Stack JVM线程共享的运行时数据区HeapMethod AreaRun-time constant pool 总结参考链接 前…...
LVGL(lv_btnmatrix矩阵按钮)
文章目录 🔧 1. 基本概念📌 lv\_btnmatrix 是什么? 🧱 2. 基本结构和用法✅ 创建按钮矩阵✅ 设置按钮文字 🧰 3. 设置按钮行为🔄 4. 响应按钮点击🎨 5. 自定义样式📌 6. 使用技巧&am…...
AUTOSAR图解==>AUTOSAR_TR_AIDesignPatternsCatalogue
AUTOSAR 人工智能设计模式目录 AUTOSAR传感器执行器与仲裁设计模式的深入解析与图解 目录 简介传感器和执行器模式 架构概述组件结构交互流程应用场景 多请求者或提供者之间的仲裁模式 架构概述组件结构仲裁流程应用场景 总结 1. 简介 AUTOSAR(AUTomotive Open Sy…...
英语时态--中英文对“时间”的不同理解
文章目录 中英文时间上的差异我现在正在休息一般现在时1. 经常发生的动作2. 表客观事实3. 表示现在的状态一般将来时1. will2. be going to含义1:打算在将来某时做某事含义2:某事预计要发生而且不可避免中英文时间上的差异 我现在正在休息 “我现在正在休息。”用英文怎么说…...
Linux基础开发工具一(yum/apt ,vim)
前言 Linux下,如何进行软件安装,查找,卸载 1.源代码安装 2. rpm安装方式,安装包的本质,就是把源代码在Linux下编译好,然后打包(别人把自己编译好的软件打包给你让你去安装) 上面…...
Java 线程池原理
Java 线程池是一种管理和复用线程的机制,其原理如下: 核心概念 线程池的初始化 :在创建线程池时,需要设置一些关键参数,如核心线程数(corePoolSize)、最大线程数(maximumPoolSize&am…...
AJAX 使用 和 HTTP
ajax学习 promise和 awit Node.js 和 webpack 前端工程化 Git工具 AJAX异步的JS和XML: 使用XML对象和服务器通信 在这里插入图片描述 统一资源定位符 URL HTTP 超文本传输协议 域名 资源路径 资源目录和类型 URL 查询参数 使用?表示之后的参数…...
mem0跟Memgraph交互
目录 1. 安装和设置2. 配置连接3. 使用 mem0 进行交互4. 添加和查询数据5. 代码运行结果 1. 安装和设置 首先,确保你已经安装了 Memgraph 和 mem0 库。你可以使用 pip 来安装 mem0: uv pip install "mem0ai[graph]" uv pip install langchai…...
httpclient请求出现403
问题 httpclient请求对方服务器报403,用postman是可以的 解决方案: request.setHeader( “User-Agent” ,“Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:50.0) Gecko/20100101 Firefox/50.0” ); // 设置请求头 原因: 因为没有设置为浏览器形式&#…...
验证码与登录过程逻辑学习总结
目录 前言 一、验证码与登录 二、使用步骤 1.先apipost测试一波 2.先搞验证码 3.跨域问题 4.后端走起 总结 前言 近期要做一个比较完整的demo,需要自己做一个前端登录页面,不过api接口都是现成的,一开始以为过程会很easy,…...
openai接口参数max_tokens改名max-completion-tokens?
文章目录 关于max_tokens参数max_tokens改max-completion-tokens?控制 OpenAI 模型响应的长度 关于max_tokens参数 大模型 API(比如 OpenAI、DeepSeek、Moonshot 等)都是按照“Token 数量”来计费。 控制内容:控制一次请求返回的…...
【办公类-39-07】20250511批量生成通义万相图片(七)彩色背景蝴蝶-筛选无黑无白的图片
制作了教师裁剪的拼图块后,发现如果图案上有黑色,就没法看清出凹凸角,剪起来有误差 所以黑色也要剔除 通义万相下载的彩色蝴蝶有彩色背景的图片,放弃有白色和黑色图案的图片,保留彩色图案的蝴蝶 deepseek、阿夏 20250…...
容器技术 20 年:颠覆、重构与重塑软件世界的力量
目录 容器技术发展史 虚拟化技术向容器技术转变 Docker的横空出世 容器编排技术与Kubernetes 微服务的出现与Istio 工业标准的容器运行时 容器技术与 DevOps 的深度融合 无服务架构推波助澜 展望未来发展方向 从 20 世纪硬件虚拟化的笨重,到操作系统虚拟…...
Docker 部署 - Crawl4AI 文档 (v0.5.x)
Docker 部署 - Crawl4AI 文档 (v0.5.x) 快速入门 🚀 拉取并运行基础版本: # 不带安全性的基本运行 docker pull unclecode/crawl4ai:basic docker run -p 11235:11235 unclecode/crawl4ai:basic# 带有 API 安全性启用的运行 docker run -p 11235:1123…...
在C++中,符号位是否参与位运算
在C中,符号位是否参与位运算取决于具体的运算符和数据类型。以下是详细解释: 1. 按位与(&)、按位或(|)、按位异或(^) 规则:这些运算符会处理包括符号位在内的所有二…...
【计算机网络】NAT技术、内网穿透与代理服务器全解析:原理、应用及实践
📚 博主的专栏 🐧 Linux | 🖥️ C | 📊 数据结构 | 💡C 算法 | 🅒 C 语言 | 🌐 计算机网络 上篇文章:以太网、MAC地址、MTU与ARP协议 下篇文章:五种IO模型与阻…...
redis数据结构-08(SINTER、SUNION、SDIFF、SISMEMBER)
集合运算:SINTER、SUNION、SDIFF、SISMEMBER Redis 集合是一种功能强大的数据结构,可用于存储一组唯一元素。本课基于上一课对 Redis 集合的介绍,深入探讨了使 Redis 集合如此多功能的基本集合操作: SINTER 、 SUNION 、 SDIFF 和…...
大模型都有哪些超参数
大模型的超参数是影响其训练效果、性能和泛化能力的关键设置,可分为以下几大类别并结合实际应用进行详细说明: 一、训练过程相关超参数 学习率(Learning Rate) 作用:控制参数更新的步长,直接影响收敛速度和稳定性。过高会导致震荡或过拟合,过低则收敛缓慢。调整策略:初…...
【更新至2023年】1999-2023年上市公司人工智能词频统计数据(年报词频统计)
【更新至2023年】1999-2023年上市公司人工智能词频统计数据(年报词频统计) 1、时间:1999-2023年 2、来源:上市公司年报 3、指标:股票代码、公司简称、年报标题、年份、行业名称、行业代码、全文-文本总长度、仅中英…...
通过 Azure DevOps 探索 Helm 和 Azure AKS
俗话说:“慷慨之人必昌盛;滋润他人者,必得滋润。” 如果您觉得这篇文章对您有有所帮助,请点赞,关注,转发! 前言 在不断发展的云计算世界中,应用程序的无缝部署和管理至关重要。Azu…...
Go语言标识符
文章目录 标识符的组成规则Go语言关键字预定义标识符标识符命名惯例 特殊标识符标识符访问权限控制 在Go语言中,标识符(Identifier)是用来命名变量、函数、类型、常量等程序实体的名称。 标识符的组成规则 1、必须以字母或下划线(_)开头: 字母包括Unico…...
Spring Cloud : OpenFeign(远程调用)
RestTemplate虽然比直接用HTTPClient简单的多,但是还是存在着许多的问题,比如url拼接麻烦,容易出错,并且可读性很差 public OrderDetail selectOrderById(Integer orderId){OrderDetail orderDetail orderMapper.selectOrderById…...
JVM内存结构有哪些?HashMap和HashTable的区别?
JVM内存结构 JVM内存主要分为以下几个区域: 程序计数器(Program Counter Register) 线程私有,记录当前线程执行的字节码行号指示器 唯一一个不会出现OOM的内存区域 Java虚拟机栈(Java Virtual Machine Stacks) 线程私有,生命周期与线程相…...
三维空间中的组织行为映射:MATLAB 数据插值可视化技术
在组织行为学研究中,如何直观呈现多维变量之间的关系一直是个挑战。今天我们将深入解析一段 MATLAB 代码,看看如何通过数据插值和三维可视化技术,将抽象的组织行为数据转化为直观的三维曲面图,揭示组织自尊 (OBSE)、牺牲性领导 (SSL) 与责任感知 (FO) 之间的复杂关系。 �…...
ImportError: DLL load failed: 找不到指定的程序。
查看其他博客说是缺少libssl-1_1-x64.dll 和 libcrypto-1_1-x64.dll 然后去下载放到博客说的目录下 没有用 解决不了一点 OpenSSL for Windows 64位 完整安装包 在这里 项目地址: https://gitcode.com/open-source-toolkit/eb627 注意事项 此安装包仅适用于64位Windows系…...
计算机的三个根本性基础
1. 计算机是执行输入、运算、输出的机器 从硬件上看,计算机是执行输入、运算、输出的机器,计算机的硬件由大量的IC(Integrated Circuit,集成电路)组成。 IC会在其中内部对外部输入的信息进行运算,并把运算…...
C++ Builder XE 使用DevMode设置打印机的自定义纸张,打印方向
代码功能介绍(以备以后查询):该代码片段展示了如何将TPanel控件的内容作为图像打印出来。首先,代码创建了一个与TPanel大小相同的位图,并通过BitBlt函数将TPanel的内容复制到位图中。接着,代码配置打印机,设…...
QOwnNotes:功能强大的跨平台笔记应用程序
QOwnNotes是一款功能强大的跨平台笔记应用程序,专为追求高效、灵活笔记管理的用户设计。它不仅支持Windows、macOS和Linux等多种操作系统,还提供了丰富的功能,帮助用户轻松管理笔记、任务和清单。无论是日常记录、学习笔记还是工作计划&#…...
深入理解反序列化攻击:原理、示例与利用工具实战
反序列化漏洞是现代 Web 安全中的一个高危攻击类型,常常导致远程代码执行(RCE)、文件读写、身份伪造等严重后果。本文将从基础原理讲起,结合实际代码和工具(PHPGGC、ysoserial)演示反序列化攻击的完整过程。…...
【今日三题】素数回文(模拟) / 活动安排(区间贪心) / 合唱团(动态规划)
⭐️个人主页:小羊 ⭐️所属专栏:每日两三题 很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~ 目录 素数回文(模拟)活动安排(区间贪心)合唱团(动态规划) 素数回文(模拟) 素数回文 #include <iostream> #include <st…...
一文了解B+树的删除原理
1. B树的核心特性回顾 B树是一种广泛应用于数据库和文件系统的平衡多路搜索树,其核心特性包括: 阶数(m):定义每个节点最多拥有的子节点数(或键数)节点容量规则: 根节点:…...
Spring Boot项目(Vue3+ElementPlus+Axios+MyBatisPlus+Spring Boot前后端分离)
下载地址: 前端:https://download.csdn.net/download/2401_83418369/90811402 后端:https://download.csdn.net/download/2401_83418369/90811405 一、前端vue部分的搭建 这里直接看另一期刊的搭建Vue前端工程部分 前端vue后端ssm项目_v…...
26考研——中央处理器_指令流水线_指令流水线的基本概念 流水线的基本实现(5)
408答疑 文章目录 六、指令流水线指令流水线的基本概念流水线的基本实现流水线设计的原则流水线的逻辑结构流水线的时空图表示 八、参考资料鲍鱼科技课件26王道考研书 六、指令流水线 前面介绍的指令都是在单周期处理机中采用串行方法执行的,同一时刻 CPU 中只有一…...
DAY 22 复习日kaggle泰坦里克号人员生还预测
复习日 仔细回顾一下之前21天的内容,没跟上进度的同学补一下进度。 作业: 自行学习参考如何使用kaggle平台,写下使用注意点,并对下述比赛提交代码 kaggle泰坦里克号人员生还预测 输入: import pandas as pd from sklea…...
SpringCloud Gateway知识点整理和全局过滤器实现
predicate(断言): 判断uri是否符合规则 • 最常用的的就是PathPredicate,以下列子就是只有url中有user前缀的才能被gateway识别,否则它不会进行路由转发 routes:- id: ***# uri: lb://starry-sky-upmsuri: http://localhost:9003/predicate…...
婴幼儿托育实训室师资协同培养模式
随着社会对婴幼儿托育服务需求的日益增长,培养适应市场需求的高素质托育人才成为当务之急。产教融合作为一种有效的人才培养模式,对于婴幼儿托育实训室建设具有重要意义,能够有效整合学校和企业的资源,为婴幼儿托育实训室人才培养…...
Gartner 《2025大数据管理规划指南》学习心得
概要 本研究旨在为数据和分析(D&A)技术专业人员提供2025年的数据管理规划指导,帮助他们应对最新数据管理趋势,以增强决策制定并实现卓越的业务成果。强调了持续适应数据管理实践的组织将更有能力做好人工智能(AI&…...
理解反向Shell:隐藏在合法流量中的威胁
引言 在网络安全领域,反向Shell(Reverse Shell) 是一种隐蔽且危险的攻击技术,常被渗透测试人员和攻击者用于绕过防火墙限制,获取对目标设备的远程控制权限。与传统的“正向Shell”(攻击者主动连接…...