4.1.2 Redis协议与异步方式
文章目录
- 4.1.2 Redis协议与异步方式
- 1. redis pipeline
- 2. redis事务
- 1. MULTI
- 2. EXEC
- 3. DISCARD
- 4. WATCH
- 3. lua脚本
- 1. lua基础语法
- 2. Lua 脚本中访问 Redis 的方式
- 3. Lua 脚本中的 KEYS 和 ARGV
- 4、返回值
- 5、错误处理
- EVALSHA 来代替 EVAL
- 4. ACID特性分析
- 5. redis发布订阅
- 1. 工作原理
- 2. 命令
- 6. redis异步连接
- 1、思想
- 2. 代码
- 1. static int redisAttach(reactor_t *r, redisAsyncContext *ac)
- 2. ac->ev.addRead = redisAddRead;ac->ev.addRead = redisAddWrite;
- 3. redisEventUpdate
- 4. 使用逻辑
- 7. redis自定义实现
- 1. Redis 协议简介(RESP)
- 2. 示例代码(发送命令 + 接收 RESP 响应)
4.1.2 Redis协议与异步方式
1. redis pipeline
- 一次性发送多个指令,减少网络传输时间
就是不用请求应答,直接一股脑发,redis整完,一股脑回 - 事务性(事务性特征)是指一组操作要么全部成功执行,要么全部失败回滚,中间不能只执行一部分。这种特性通常用于数据库或数据操作中,保证数据的一致性和可靠性,pipeline不具备
2. redis事务
用户定义一系列数据库操作,定义为一个完整的处理单元,一起执行
锁总线,其他核心看到执行结束或者还没执行,中间过程看不到
也是一种原子操作,数据库的操作,某个事务由多条命令构成,不允许其他跟redis建立的连接不允许碰
什么时候探讨事务?多条并发连接
什么时候探讨原子操作?多核
1. MULTI
开启事务,事务执行过程中,单个命令是入队列操作,直到调用EXEC一起执行
2. EXEC
提交事务
3. DISCARD
取消事务
4. WATCH
检测key的变动,若在事务执行过程中,key变动则取消事务(就比如同时有其他人操作了这个变量,就发现数值变动,就会执行失败neil)
乐观锁(redis):
“我假设你不会碰我操作的变量,冲突很少,出问题我再处理。”(用版本号实现,操作时候发现版本号不对,说明被改了,再去重试)
悲观锁(mysql):
“我假设你一定会碰,所以我提前上锁,防止你碰。”
对比项 | 乐观锁(Optimistic Lock) | 悲观锁(Pessimistic Lock) |
---|---|---|
核心假设 | 不会发生冲突 | 一定会发生冲突 |
操作方式 | 不加锁,操作前后做数据校验 | 操作前加锁,阻塞其他操作 |
并发性能 | 性能好,冲突少时效率高 | 并发低,阻塞多时效率低 |
实现方式 | 版本号(version)、时间戳等 | 数据库 select … for update、行锁等 |
失败处理 | 操作失败后重试 | 先加锁,保证别人不能动 |
典型场景 | 数据读多写少,如缓存、排行榜更新 | 数据写多读多,如账户转账、订单处理 |
3. lua脚本
redis嵌入了lua虚拟机:可以同时执行多个命令
工作中,通常使用lua脚本
1. lua基础语法
- 变量
local x = 5
- 表(类似数组、字典)
local arr = {1, 2, 3}
local map = {key = "value", age = 18}
- 条件判断
if x > 10 thenreturn "大于10"
elsereturn "小于等于10"
end
- 循环
for i = 1, 5 doredis.call("INCR", "counter")
end
- 函数
local function add(a, b)return a + b
end
2. Lua 脚本中访问 Redis 的方式
在 Lua 脚本中操作 Redis,要通过内置的 redis.call 或 redis.pcall 函数。
用法格式:
redis.call("命令", key1, key2, ..., arg1, arg2, ...)
call:命令失败抛异常(一般用这个)
pcall:命令失败不抛异常,返回错误对象(控制容错时用)
示例:
redis.call("SET", "foo", "bar")
local val = redis.call("GET", "foo")
3. Lua 脚本中的 KEYS 和 ARGV
Redis Lua 脚本只能通过传参的方式操作数据:
EVAL "return redis.call('GET', KEYS[1])" 1 mykey
KEYS[1]、KEYS[2]…:用于传递 key 名
ARGV[1]、ARGV[2]…:用于传递 参数值
示例:
local stock = tonumber(redis.call("GET", KEYS[1])) --tonumber把字符串转换成数字类型
if stock > 0 thenredis.call("DECR", KEYS[1])return 1
elsereturn 0
end
4、返回值
可以返回任意类型的值(字符串、数字、数组等):
return 1 -- 数字
return "ok" -- 字符串
return {1, 2, 3} -- 数组
Redis 会自动把 Lua 值转成客户端可识别的响应
5、错误处理
return redis.pcall("GET", KEYS[1])
使用 pcall 可以捕获错误,避免脚本中断。
EVALSHA 来代替 EVAL
EVAL 是 Redis 执行一段 Lua 脚本的命令,支持多 key、多参数传入,原子执行
使用 EVALSHA 来代替 EVAL 时,相当于只传递一个 hash(SHA1)值 到 Redis,而不传整段 Lua 脚本:
- 网络传输更小
- 安全(不暴露源码)
- 快速查找(Redis 内部用哈希表管理脚本)
Redis 内部维护了一个结构类似于:
unordered_map<string /* sha1 */, LuaScript>
Redis 内部维护了一张“哈希表”,这样可以根据 hash 快速定位并执行脚本,EVALSHA 时 Redis 会:
- 查找哈希是否存在
- 找到原始脚本
- 执行脚本(在 Lua 虚拟机中)
4. ACID特性分析
A:原子性:
其他核心要么看到还没有执行,要不然就是执行完了,不可能看到中间的结果,这里还有要求就是要不然操作全部成功,要不全部失败(要增加回滚操作,要是失败,需要恢复到事务开始之前的状态)
C:一致性:
执行事务后,数据从一个一致状态过渡到另一个一致状态(满足约束、逻辑正确)
一个是逻辑上一致性,一个是数据库一致性(完整约束)
I:隔离性
多个事务互不干扰,执行结果与串行执行一致
各个事务之间的影响程度,redis单线程执行,天然具有隔离性
D:持久性
一旦事务执行成功,结果会被永久保存,即使系统崩溃也能恢复
redis只有在aof持久化策略时候,才具备持久性
lua脚本满足原子性和隔离性,不满足一致性和持久性
5. redis发布订阅
消息推送、实时通信、微服务解耦、事件驱动等场景。
1. 工作原理
发布者 使用 PUBLISH 向某个频道发送消息;
订阅者 使用 SUBSCRIBE、PSUBSCRIBE 订阅一个或多个频道;
一旦有新消息,所有订阅者会立即收到消息;
是即时通信模型,不做持久化,也不记录历史消息。
2. 命令
命令 | 说明 |
---|---|
SUBSCRIBE | 订阅一个或多个频道 |
UNSUBSCRIBE | 取消订阅 |
PUBLISH | 向频道发布消息 |
PSUBSCRIBE | 模糊订阅(支持通配符) |
PUNSUBSCRIBE | 取消模糊订阅 |
PUBSUB | 查看订阅状态、频道数量等元信息 |
6. redis异步连接
1、思想
hiredis 异步客户端(redisAsyncContext)接入自定义的 reactor 事件驱动系统的适配器,核心作用是桥接 Redis 的异步事件与你的事件循环机制,相当于实现了一套 hiredis 的 I/O 多路复用抽象接口
2. 代码
1. static int redisAttach(reactor_t *r, redisAsyncContext *ac)
核心的“接口对接点”,它做了:
- 创建一个 redis_event_t 对象(包含 event_t 和 Redis 上下文);
- 设置该对象的 addRead、delRead、addWrite、delWrite、cleanup 函数;
- 将这些函数注册进 redisAsyncContext 的 ev 成员;
从此,Redis 就能通过调用这些函数来操作你的事件模型。
static int redisAttach(reactor_t *r, redisAsyncContext *ac) {redisContext *c = &(ac->c);redis_event_t *re;/* Nothing should be attached when something is already attached */if (ac->ev.data != NULL)return REDIS_ERR;/* Create container for ctx and r/w events */re = (redis_event_t*)hi_malloc(sizeof(*re));if (re == NULL)return REDIS_ERR;re->ctx = ac;re->e.fd = c->fd;re->e.r = r;// dont use event buffer, using hiredis's bufferre->e.in = NULL;re->e.out = NULL;re->mask = 0;//这些是 hiredis 要求你实现的“注册函数”。每当 Redis 需要监听某个 FD 的读/写事件,就会调用这些函数ac->ev.addRead = redisAddRead;ac->ev.delRead = redisDelRead;ac->ev.addRead = redisAddWrite;ac->ev.delWrite = redisDelWrite;ac->ev.cleanup = redisCleanup;//清理函数必不可少ac->ev.data = re;return REDIS_OK;
}
2. ac->ev.addRead = redisAddRead;ac->ev.addRead = redisAddWrite;
这两个去调用redisReadHandler / redisWriteHandler,去使用hiredis提供的读写处理
3. redisEventUpdate
这是事件变化的调度器,核心逻辑是根据 mask 来:
- 新增事件:调用 add_event()
- 删除事件:调用 del_event()
- 修改事件:调用 enable_event() 切换读写状态
4. 使用逻辑
int main() {// 1. 创建 event loopreactor_t *r = reactor_create();// 2. 连接 Redis 异步客户端redisAsyncContext *ac = redisAsyncConnect("127.0.0.1", 6379);if (ac->err) {printf("Redis error: %s\n", ac->errstr);return -1;}// 3. 接入自己的 reactorif (redisAttach(r, ac) != REDIS_OK) {printf("Failed to attach redis context to reactor\n");return -1;}// 4. 设置连接成功/断开回调(可选)redisAsyncSetConnectCallback(ac, connectCallback);redisAsyncSetDisconnectCallback(ac, disconnectCallback);// 5. 发送异步命令redisAsyncCommand(ac, commandCallback, NULL, "SET foo bar");// 6. 启动事件循环reactor_run(r);return 0;
}
hiredis实现了协议解析、读写事件、缓冲区操作、协议加密
我们适配文件实现了:适配事件对象以及事件操作函数
7. redis自定义实现
有时候,用户除了需要与项目网络层兼容,同时需要考虑与项目中数据结构契合;这个时候可以考虑自己实现 redis 协议,从解析协议开始转换成项目中的数据结构
1. Redis 协议简介(RESP)
Redis 协议其实非常简单,叫做 RESP(REdis Serialization Protocol),它是一个 文本协议,只要解析这些前缀符号就能实现读写。
类型 | 开头 | 示例 |
---|---|---|
简单字符串 | + | +OK\r\n |
错误 | - | -Error message\r\n |
整数 | : | :1000\r\n |
批量字符串 | $ | $3\r\nfoo\r\n |
多条批量字符串(数组) | * | *2\r\n$3\r\nfoo\r\n$3\r\nbar\r\n |
比如我们想执行这个命令:
SET name ChatGPT
手写协议是这样的:
*3\r\n
$3\r\n
SET\r\n
$4\r\n
name\r\n
$7\r\n
ChatGPT\r\n
只要把这个拼好(用 sprintf 或 writev),直接发给 Redis 服务端,它就能处理。
2. 示例代码(发送命令 + 接收 RESP 响应)
int fd = socket(AF_INET, SOCK_STREAM, 0);
connect(fd, ...);// 拼接 Redis 协议
char buf[256];
int len = snprintf(buf, sizeof(buf),"*3\r\n$3\r\nSET\r\n$4\r\nname\r\n$7\r\nChatGPT\r\n");
write(fd, buf, len);// 读取返回
char resp[128];
int n = read(fd, resp, sizeof(resp));
resp[n] = 0;printf("Redis response: %s\n", resp); // 应该打印:+OK
相关文章:
4.1.2 Redis协议与异步方式
文章目录 4.1.2 Redis协议与异步方式1. redis pipeline2. redis事务1. MULTI2. EXEC3. DISCARD4. WATCH 3. lua脚本1. lua基础语法2. Lua 脚本中访问 Redis 的方式3. Lua 脚本中的 KEYS 和 ARGV4、返回值5、错误处理EVALSHA 来代替 EVAL 4. ACID特性分析5. redis发布订阅1. 工作…...
ecovadis审核有什么原则?什么是ecovadis审核,有什么意义
EcoVadis审核概述 EcoVadis是一家全球知名的企业可持续发展评级机构,成立于2007年,旨在通过评估企业的环境(E)、社会(S)和治理(G)表现,帮助跨国公司管理供应链的可持续性…...
bitnet-b1.58-2B-4T和三进制
最近有个模型挺火啊现在都排进了HF排行榜的第四了 模型叫做microsoft/bitnet-b1.58-2B-4T 其实非常小的一个模型,只有2B,那这东西有多大意义呢? 它主要探索一个打法 也就是这篇论文 The era of 1-bit llms: All large language models ar…...
k8s报错kubelet.go:2461] “Error getting node“ err=“node \“k8s-master\“ not found“
问题 首先最初问题: [rootk8s-master ~]# kubectl get pods -owide --all-namespaces The connection to the server 192.168.2.129:6443 was refused - did you specify the right host or port?检查kubelet状态 查看kubelet status报找不到master节点 [rootk8…...
计算serise数据的唯一值数量
1. Series.unique() 功能:返回 Series 中所有唯一值的 数组(顺序按首次出现排列)。 返回值类型:numpy.ndarray(用户可能误认为是列表,但实际是 NumPy 数组)。 对 NaN 的处理:包含 …...
数组理论基础
什么是数组 在Java中,数组是一种数据结构,用来存储同一类型的多个元素。这些元素可以按照索引访问,方便对数据进行操作和管理。数组在编程中应用广泛,是一种基本且重要的数据结构。 数组的基本概念 1. 元素:数组中的…...
Linux操作系统--静态库和动态库的生成and四种解决加载找不到动态库的四种方法
目录 必要的知识储备: 生成静态库: 生成动态库: 解决加载找不到动态库的四种方法: 第一种:拷贝到系统默认的库路径 /usr/lib64/ 第二种:在系统默认的库路径/usr/lib64/下建立软链接 第三种࿱…...
安科瑞能源管理系统如何解决工业园区能源管理难,运维成本高的问题?
一、行业痛点:高能耗背后的“隐形炸弹 1. 能源管理粗放:水、电、气、冷热等多类型能源分散管理,人工抄表效率低,跑冒滴漏难追踪。 2. 电能质量隐患:变频设备引发谐波干扰,导致设备停机、电容器烧毁&#…...
大模型赋能工业制造革新:10个显效可落地的应用场景
在工业4.0的汹涌浪潮中,制造业正面临着前所未有的转型挑战。传统制造模式在效率、成本、质量等方面逐渐难以满足市场需求,企业急需借助新技术实现数字化转型,以提升自身竞争力。在此背景下,基于先进的数据分析技术、大模型、知识图…...
【android bluetooth 框架分析 02】【Module详解 4】【Btaa 模块介绍】
1. 背景 我们在上一篇文章中介绍 HciHal 模块时,有如下代码 // system/gd/hal/hci_hal_android_hidl.ccvoid ListDependencies(ModuleList* list) const {list->add<SnoopLogger>();if (common::init_flags::btaa_hci_is_enabled()) {list->add<ac…...
gitee新的仓库,Vscode创建新的分支详细步骤
第一步点击创建分支输入新分支的名字 第二步 第三步 第四步...
OpenHarmony - 小型系统内核(LiteOS-A)(五)
OpenHarmony - 小型系统内核(LiteOS-A)(五) 六、文件系统 虚拟文件系统 基本概念 VFS(Virtual File System)是文件系统的虚拟层,它不是一个实际的文件系统,而是一个异构文件系统之…...
Unity动态合批(Dynamic Batching)解析
什么是动态合批? 动态合批是Unity引擎的一项核心优化技术,用于减少绘制调用(Draw Calls)数量,提高游戏性能。它通过将多个使用相同材质的小型可移动物体的渲染操作合并为单个绘制调用,减轻CPU向GPU发送命令…...
【Python】迭代器(Iterator)vs 生成器(Generator)
迭代器(Iterator) vs 生成器(Generator) 1.迭代器(Iterator)1.1 是什么?1.2 示例1.3 适用场景 2.生成器(Generator)2.1 是什么?2.2 示例2.3 适用场景 3.迭代器…...
el-input 限制只能输入负数、正数或2位小数的数值
需求 el-input需要指定输入格式,当键盘事件触发时限制只能输入负数、正数或2位小数的数值。 解决方案 自定义校验数字输入的键盘事件方法函数。 具体实现步骤 1、创建验数字输入的键盘事件方法 /*** 校验数字输入的键盘事件* param {Event} event - 键盘事件对…...
对话框类别组件编写
形如如图所示的对话框的编写 一、基本组件的定义 <template><div><el-dialogclass"cust-dialog":title"title":model-value"show":show-close"showClose":top"toppx":width"widthpx":close-on-…...
ICMAN防水触摸芯片 - 复杂环境下精准交互,提升触控体验
▍核心优势 ◆ 超强抗干扰能力 ◆ 工业级设计,一致性和稳定性好 ▍提供场景化解决方案 【智能厨电矩阵】抽油烟机档位调节 | 电磁炉火力触控 | 洗碗机模式切换 【卫浴设备方案】淋浴房雾化玻璃控制 | 智能马桶触控面板 | 浴缸水位感应 【工业控制应用】仪器仪…...
深度剖析:生成式人工智能备案和登记的关键差异
在人工智能技术日新月异的当下,生成式人工智能以前所未有的态势广泛渗透至各个领域,从内容创作到智能客服,从图像生成到数据分析,其应用场景正呈指数级拓展。2024 年,网信部门协同相关部门,依据《生成式人工…...
kotlin + spirngboot3 + spring security6 配置登录与JWT
1. 导包 implementation("com.auth0:java-jwt:3.14.0") implementation("org.springframework.boot:spring-boot-starter-security")配置用户实体类 Entity Table(name "users") data class User(IdGeneratedValue(strategy GenerationType.I…...
d3.js绘制组合PCA边缘分布图
用d3.js研发了个组合PCA边缘分布图; 组合PCA边缘分布图中包括pca散点图、散点图可根据数据自动分为连续型和离散型、还有散点的各种配置、边缘有箱线边缘、密度边缘、柱状边缘一个各个边缘的配置等等,大部分你能想到的配置都是自行传参调整的࿰…...
开源语音合成模型SparkTTS使用
一、环境配置 git clone https://github.com/SparkAudio/Spark-TTS.git pip install -r requirements.txt 二、模型下载 从modelscope进行下载,pip install modelscope 创建一个download.py import torchfrom modelscope import snapshot_downloadsnapshot_dow…...
课程9. 数据降维
课程9. 数据降维 维度灾难奇异值分解SVD 变换SVD 的几何意义 SVD分解应用示例图像压缩文本分析推荐系统中的应用* 主成分分析PCA演示使用 PCA 降低多元数据的维数PCA 说明单词的语义相似性 t-SNE 维度灾难 机器学习和数据科学中的关键问题之一是数据高维性问题。我们已经遇到过…...
24-25【动手学深度学习】AlexNet + Vgg
1. AlexNet 1.1 原理 1.2 代码 import torch from torch import nn from d2l import torch as d2lnet nn.Sequential(nn.Conv2d(1, 96, kernel_size11,stride4, padding1), nn.ReLU(),nn.MaxPool2d(kernel_size3, stride2),nn.Conv2d(96, 256, kernel_size5, padding2), nn.…...
1.Axum 与 Tokio:异步编程的完美结合
摘要 深入解析 Axum 核心架构与 Tokio 异步运行时的集成,掌握关键原理与实践技巧。 一、引言 在当今的软件开发领域,高并发和高性能是衡量一个系统优劣的重要指标。对于 Web 服务器而言,能够高效地处理大量并发请求是至关重要的。Rust 语言…...
快速认识:数据库、数仓(数据仓库)、数据湖与数据运河
数据技术核心概念对比表 概念核心定义核心功能数据特征典型技术/工具核心应用场景数据库结构化数据的「电子档案柜」,按固定 schema 存储和管理数据,支持高效读写和事务处理。实时事务处理(增删改查),确保数据一致性&…...
【Linux】第十章 配置和保护SSH
1. 简单说下ssh如何实现用户的免密登录? (1)生成公钥和私钥:使用 ssh-keygen -t rsa 命令,在客户端(即你登录的机器)上生成一对密钥——公钥(~/.ssh/id_rsa.pub)和私钥&…...
量子计算:开启未来科技之门的钥匙
在当今科技飞速发展的时代,量子计算正逐渐从实验室走向实际应用,成为全球科技领域的焦点之一。它有望为众多行业带来前所未有的变革,从密码学、药物研发到金融风险评估等,量子计算的潜力不可限量。 一、量子计算的原理 量子计算基…...
基础知识 - 结构体
1、结构体类型与结构体变量 1.1 结构体的定义 结构体是一种自定义的数据类型,它把多个不同类型的变量封装在一起,形成一个新的复合数据类型。可以定义该结构体类型的变量,与使用 int 定义变量的方法相同 结构体是一些值的集合,这…...
uniapp上传图片时(可选微信头像、相册、拍照)
参考文献:微信小程序登录——头像_onchooseavatar-CSDN博客 <button open-type"chooseAvatar" chooseavatar"onChooseAvatar"> </button>onChooseAvatar(e) {uni.showLoading({title: 上传中...,mask: true});uni.uploadFile({url…...
2025年4月16日华为笔试第二题200分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 02. 智慧旅游路线规划 问题描述 LYA正在开发一款智慧旅游APP,该APP需要为游客规划城市景点之间的最佳路线。城市有 N N...
面试题之高频面试题
最近开始面试了,410面试了一家公司 针对自己薄弱的面试题库,深入了解下,也应付下面试。在这里先祝愿大家在现有公司好好沉淀,定位好自己的目标,在自己的领域上发光发热,在自己想要的领域上(技术…...
一路磕磕绊绊解决flutter doctor 报错CocoaPods not installed
flutter doctor执行之后,出现以下错误: 错误消息: ✗ CocoaPods not installed.CocoaPods is a package manager for iOS or macOS platform code.Without CocoaPods, plugins will not work on iOS or macOS.For more info, see https://flutter.dev/t…...
探寻Gson解析遇到不存在键值时引发的Kotlin的空指针异常的原因
文章目录 一、问题背景二、问题原因三、问题探析Kotlin空指针校验Gson.fromJson(String json, Class<T> classOfT)TypeTokenGson.fromJson(JsonReader reader, TypeToken<T> typeOfT)TypeAdapter 和 TypeAdapterFactoryReflectiveTypeAdapterFactoryRecordAdapter …...
面试算法高频08-动态规划-01
动态规划 递归知识要点 递归代码模板:提供递归代码的标准形式public void recur(int level, int param) ,包含终止条件(if (level> MAX_LEVEL))、当前层逻辑处理(process(level, param))、向下一层递归…...
【AI】以Llama模型为例学习如何进行LLM模型微调
以Llama模型为例学习如何进行LLM模型微调 推荐超级课程: 本地离线DeepSeek AI方案部署实战教程【完全版】Docker快速入门到精通Kubernetes入门到大师通关课AWS云服务快速入门实战目录 以Llama模型为例学习如何进行LLM模型微调背景预训练微调全部微调参数高效微调低秩适配 (LoR…...
细说STM32单片机FreeRTOS任务管理API函数vTaskList()的使用方法
目录 一、函数vTaskList() 1、 函数说明 2、返回的字符串表格说明 3、函数的使用方法 二、 vTaskList()的应用示例 1、示例功能、项目设置 2、软件设计 (1)main.c (2)freertos.c (3)FreeRTOSConf…...
ffmpeg 添加 nvenc支持
运行以下命令检查当前 FFmpeg 是否支持 hevc_nvenc: ffmpeg -hide_banner -encoders | grep nvenc 若输出包含 hevc_nvenc,说明编码器已集成,问题出在驱动或参数配置若无输出,则需要手动编译 ffmpeg 安装显卡驱动、cuda和cudnn…...
锚定效应的应用-独立站优化价格打折显示-《认知偏差手册》
锚定效应的应用-独立站优化价格打折显示-《认知偏差手册》 先看结果:价格展示 https://atemplate.com/pricing 旧的打折价格展示 新的打折价格展示 锚定效应是什么? 人类在进行决策时,会过度偏重先前取得的资讯(这称为锚点&…...
红宝书第四十九讲:XSS/CSRF攻击防御策略解析
红宝书第四十九讲:XSS/CSRF攻击防御策略解析 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 XSS(跨站脚本):黑客把恶意代码塞进网页,当你打开页面时&am…...
Unity基于屏幕空间的鼠标拖动,拖动物体旋转
代码的核心在于,鼠标的屏幕偏移映射到物体的旋转角度,代码中是使用射线去检测的,检测帧间隔鼠标的位置对应物体上的旋转 未解决的问题:旋转都是相对的,怎么去处理,鼠标拖动物体,物体不动&#…...
Unity3D 测试驱动开发(TDD)框架设计
前言 针对Unity3D测试驱动开发(TDD)框架的设计,需要结合Unity引擎特性与TDD核心原则,构建可维护、高效且与开发流程深度集成的测试体系。以下是分层次的框架设计方案: 对惹,这里有一个游戏开发交流小组&a…...
Google Mock(GMock):C++单元测试的高效模拟框架详解
标题: Google Mock(GMock):C单元测试的高效模拟框架详解 摘要: Google Mock(GMock)是C单元测试中的核心工具,能够高效隔离外部依赖并验证复杂交互逻辑。本文详细介绍了GMock的核心…...
智慧城市气象中台架构:多源天气API网关聚合方案
在开发与天气相关的应用时,获取准确的天气信息是一个关键需求。万维易源提供的“天气预报查询”API为开发者提供了一个高效、便捷的工具,可以通过简单的接口调用查询全国范围内的天气信息。本文将详细介绍如何使用该API,以及其核心功能和调用…...
vue3项目启动bug
项目场景: vue3 项目启动运行 问题描述 终端无法正常启动运行 C:/user/adminC:/user/admin> npm run dev > student_status_vue30.0.0 dev > vite原因分析: 暂无 解决方案: 在当前项目目录下运行: npx vite --host…...
逻辑回归 (Logistic Regression)
文章目录 逻辑回归 (Logistic Regression)问题的引出Sigmoid function逻辑回归的解释决策边界 (Decision boundary)逻辑回归的代价函数机器学习中代价函数的设计1. 代价函数的来源(1)从概率模型推导而来(统计学习视角)(…...
SLAM | 激光SLAM中的退化问题
在激光SLAM中,判断退化环境的核心是通过数学建模分析环境特征对位姿估计的约束能力。除了LOAM中提出的退化因子D外,还存在多种基于表达式和阈值设定的方法。以下是几种典型方法及其实现原理: 1. 协方差矩阵特征值分析 原理:通过分析点云协方差矩阵的特征值分布,判断环境中…...
【已更新】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题
完整内容请看文末最后的推广群 先展示问题一代码和结果、再给出四个问题详细的模型 import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from matplotlib.font_manager import FontPropertiesfrom matplotlib import rcParams# 设…...
[特殊字符] 基于大模型的地理领域文档中英互译自动化方案
一、📌 项目背景与挑战 在全球化商业环境中,跨国企业经常面临专业文档翻译的痛点: 传统方式效率低下:专业文档翻译需要专人耗时数小时甚至数天 专业术语准确性难保证:地理领域术语的特殊性 格式保持困难:…...
破局遗留系统!AI自动化重构:从静态方法到Spring Bean注入实战
在当今快速发展的软件行业中,许多企业都面临着 Java 遗留系统的维护和升级难题。这些老旧系统往往采用了大量静态方法,随着业务的不断发展,其局限性日益凸显。而飞算 JavaAI 作为一款强大的 AI 工具,为 Java 遗留系统的重构提供了全新的解决方案,能够实现从静态方法到 Spring B…...
高度图(Heightmap)
高度图的数学组成与建模方法 高度图(Heightmap)是一种基于规则网格的地形表示方法,其数学本质是将三维地形简化为二维离散函数,通过高度值的存储和插值实现地形重建。以下从数学建模角度系统阐述其组成原理及关键技术。 一、基础…...