React Redux 与 Zustand
Redux
一、Redux 核心概念
1. 为什么需要 Redux?
-
解决的问题:在大型 React 应用中,跨组件共享状态、管理复杂数据流。
-
优势:
-
单一数据源:全局状态集中存储在
Store
中。 -
可预测性:通过严格的规则(纯函数、不可变性)管理状态变化。
-
调试友好:支持时间旅行调试(Redux DevTools)。
-
中间件支持:处理异步逻辑(如 API 调用)。
-
2. Redux 三大原则
原则 | 说明 |
---|---|
单一数据源 | 整个应用的状态存储在唯一的 Store 对象树中。 |
状态只读 | 只能通过 dispatch(action) 修改状态,禁止直接修改。 |
使用纯函数修改状态 | 通过 Reducer 函数接收旧状态和 Action ,返回新状态(无副作用)。 |
3. 核心概念
概念 | 作用 |
---|---|
Store | 全局状态容器,通过 createStore 创建。 |
Action | 描述状态变化的普通对象,必须包含 type 字段。 |
Reducer | 纯函数,接收当前 state 和 action ,返回新的 state 。 |
Dispatch | 触发状态更新的方法,store.dispatch(action) 。 |
Middleware | 扩展 Redux 功能(如处理异步操作),位于 dispatch 和 Reducer 之间。 |
二、Redux 与 React 集成(React-Redux)
1. 安装依赖
npm install redux react-redux @reduxjs/toolkit
2. 核心 API
-
Provider
:包裹根组件,将Store
传递给子组件。 -
useSelector
:从Store
中读取状态(替代mapStateToProps
)。 -
useDispatch
:获取dispatch
方法(替代mapDispatchToProps
)。
三、Redux 使用步骤(代码示例)
1. 定义 Reducer 和 Action
// src/store/counterSlice.js(使用 Redux Toolkit)
import { createSlice } from '@reduxjs/toolkit';const counterSlice = createSlice({name: 'counter',initialState: { value: 0 },reducers: {increment: (state) => {state.value += 1; // Redux Toolkit 允许直接修改(内部使用 Immer)},decrement: (state) => {state.value -= 1;},incrementByAmount: (state, action) => {state.value += action.payload;},},
});export const { increment, decrement, incrementByAmount } = counterSlice.actions;
export default counterSlice.reducer;
2. 创建 Store
// src/store/index.js
import { configureStore } from '@reduxjs/toolkit';
import counterReducer from './counterSlice';export const store = configureStore({reducer: {counter: counterReducer,},
});
3. 将 Store 注入 React 应用
// src/index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { Provider } from 'react-redux';
import App from './App';
import { store } from './store';ReactDOM.render(<Provider store={store}><App /></Provider>,document.getElementById('root')
);
4. 在组件中访问状态和触发 Action
// src/components/Counter.js
import React from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { increment, decrement, incrementByAmount } from '../store/counterSlice';function Counter() {const count = useSelector((state) => state.counter.value);const dispatch = useDispatch();return (<div><button onClick={() => dispatch(decrement())}>-</button><span>{count}</span><button onClick={() => dispatch(increment())}>+</button><button onClick={() => dispatch(incrementByAmount(5))}>+5</button></div>);
}export default Counter;
四、异步操作与中间件
1. 使用 Redux Thunk(处理异步逻辑)
// src/store/userSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import axios from 'axios';// 定义异步 Thunk
export const fetchUser = createAsyncThunk('user/fetchUser', async (userId) => {const response = await axios.get(`https://api.example.com/users/${userId}`);return response.data;
});const userSlice = createSlice({name: 'user',initialState: { data: null, loading: false, error: null },extraReducers: (builder) => {builder.addCase(fetchUser.pending, (state) => {state.loading = true;}).addCase(fetchUser.fulfilled, (state, action) => {state.loading = false;state.data = action.payload;}).addCase(fetchUser.rejected, (state, action) => {state.loading = false;state.error = action.error.message;});},
});export default userSlice.reducer;
2. 组件中调用异步 Action
function UserProfile({ userId }) {const dispatch = useDispatch();const { data, loading, error } = useSelector((state) => state.user);useEffect(() => {dispatch(fetchUser(userId));}, [dispatch, userId]);if (loading) return <div>Loading...</div>;if (error) return <div>Error: {error}</div>;return <div>Username: {data.name}</div>;
}
Redux Thunk 完整使用流程:用户数据请求
1. 创建异步 Thunk
// src/store/userSlice.js
import { createSlice, createAsyncThunk } from '@reduxjs/toolkit';
import axios from 'axios';// 创建异步 Thunk Action
export const fetchUser = createAsyncThunk('user/fetchUser', // 唯一标识符(推荐格式:"slice名称/action名称")async (userId, thunkAPI) => { // 接收参数和 Thunk APItry {const response = await axios.get(`https://api.example.com/users/${userId}`);return response.data; // 成功时返回数据作为 payload} catch (error) {return thunkAPI.rejectWithValue(error.message); // 失败时传递错误信息}}
);
关键点:
-
createAsyncThunk
会自动生成三种 action 类型:-
user/fetchUser/pending
(请求开始) -
user/fetchUser/fulfilled
(请求成功) -
user/fetchUser/rejected
(请求失败)
-
-
参数说明:
-
第一个参数:唯一标识符(建议用
slice名称/action名称
格式) -
第二个参数:异步处理函数(可接收参数和
thunkAPI
对象)
-
2. 创建 Slice 处理状态
const userSlice = createSlice({name: 'user', // slice 名称initialState: { // 初始状态data: null, // 用户数据loading: false, // 加载状态error: null // 错误信息},extraReducers: (builder) => {builder// 处理 pending 状态(请求开始).addCase(fetchUser.pending, (state) => {state.loading = true;state.error = null; // 重置错误})// 处理 fulfilled 状态(请求成功).addCase(fetchUser.fulfilled, (state, action) => {state.loading = false;state.data = action.payload; // 存储返回数据})// 处理 rejected 状态(请求失败).addCase(fetchUser.rejected, (state, action) => {state.loading = false;state.error = action.payload || action.error.message;});}
});export default userSlice.reducer;
3. 配置 Store
// src/store/store.js
import { configureStore } from '@reduxjs/toolkit';
import userReducer from './userSlice';export default configureStore({reducer: {user: userReducer // 注册 slice}
});
4. 在组件中使用
// src/components/UserProfile.js
import React, { useEffect } from 'react';
import { useDispatch, useSelector } from 'react-redux';
import { fetchUser } from '../store/userSlice';function UserProfile({ userId }) {const dispatch = useDispatch();const { data, loading, error } = useSelector(state => state.user);useEffect(() => {dispatch(fetchUser(userId)); // 触发异步请求}, [dispatch, userId]);if (loading) return <div>加载中...</div>;if (error) return <div>错误:{error}</div>;return (<div><h2>{data.name}</h2><p>邮箱:{data.email}</p></div>);
}export default UserProfile;
五、Redux 最佳实践
1. 项目结构
-
推荐结构(按功能模块划分):
src/store/slices/ // Redux Toolkit 的 Slice 文件index.js // Store 配置components/ // UI 组件features/ // 包含业务逻辑的组件
2. 状态设计原则
-
最小化状态:避免冗余数据,只存储必要状态。
-
规范化数据:使用
id
作为键,避免嵌套过深(可搭配normalizr
库)。
3. 性能优化
-
使用
React.memo
:避免不必要的组件渲染。 -
选择精确的状态片段:
useSelector
尽量返回最小化数据。// ✅ 精确选择 const count = useSelector((state) => state.counter.value);// ❌ 避免返回整个 state.counter const counter = useSelector((state) => state.counter);
4. 使用 Redux Toolkit
-
优势:减少样板代码,内置
immer
(允许直接修改状态)、createAsyncThunk
等工具。 -
替代方案:手动编写
action
、reducer
和中间件配置(传统 Redux)。
六、Redux 适用场景与替代方案
1. 何时使用 Redux?
-
多个组件需要共享同一状态。
-
状态更新逻辑复杂(如跨组件联动)。
-
需要时间旅行调试、持久化状态或记录状态历史。
2. 轻量替代方案
方案 | 特点 |
---|---|
Context API | React 内置,适合简单状态共享,但缺乏中间件、性能优化工具。 |
Recoil | Facebook 实验性状态管理库,原子化状态设计,适合复杂数据流。 |
Zustand | 轻量级,基于 Hook 的状态管理,API 简洁。 |
七、总结
-
Redux 核心:
Store
、Action
、Reducer
、Middleware
。 -
React-Redux 集成:
Provider
、useSelector
、useDispatch
。 -
异步处理:通过
Redux Thunk
或createAsyncThunk
管理 API 调用。 -
最佳实践:使用 Redux Toolkit 简化代码,合理设计状态结构。
Zustand
一、Zustand 核心概念
1. 定位与特点
-
轻量级状态管理:专为 React 设计,API 简洁,学习成本低。
-
脱离组件树:状态独立于 UI 层级,可在组件外访问。
-
高性能:按需订阅状态片段,避免不必要的渲染。
-
中间件支持:集成持久化、Immer(不可变更新)、日志等。
二、基础使用
1. 创建 Store
// store/counterStore.ts
import { create } from 'zustand';type CounterState = {count: number;increment: () => void;decrement: () => void;
};export const useCounterStore = create<CounterState>((set) => ({count: 0,increment: () => set((state) => ({ count: state.count + 1 })),decrement: () => set((state) => ({ count: state.count - 1 })),
}));
2. 组件中使用状态
import { useCounterStore } from './store/counterStore';function Counter() {const { count, increment, decrement } = useCounterStore();return (<div><button onClick={decrement}>-</button><span>{count}</span><button onClick={increment}>+</button></div>);
}
三、高级功能
1. 状态切片与选择器(Selector)
按需订阅部分状态,避免全局重新渲染:
// 只订阅 count 值的变化
const count = useCounterStore((state) => state.count);
2. 异步操作
在 Store 中定义异步 Action:
type UserStore = {user: User | null;fetchUser: (id: string) => Promise<void>;
};export const useUserStore = create<UserStore>((set) => ({user: null,fetchUser: async (id) => {const response = await fetch(`/api/users/${id}`);const user = await response.json();set({ user });},
}));
3. 中间件(Middleware)
持久化存储(Persist)
import { persist } from 'zustand/middleware';export const useAuthStore = create(persist((set) => ({token: null,login: (token) => set({ token }),logout: () => set({ token: null }),}),{ name: 'auth-storage' } // 存储到 localStorage)
);
不可变更新(Immer)
import { immer } from 'zustand/middleware/immer';export const useTodoStore = create(immer((set) => ({todos: [],addTodo: (text) =>set((state) => {state.todos.push({ text, completed: false }); // 直接修改 draft}),}))
);
四、最佳实践
1. 合理拆分 Store
-
按功能模块拆分:避免单一 Store 过于臃肿。
// store/userStore.ts export const useUserStore = create(...);// store/cartStore.ts export const useCartStore = create(...);
2. 类型安全(TypeScript)
为 Store 和 Actions 定义明确类型:
type UserState = {user: User | null;setUser: (user: User) => void;clearUser: () => void;
};export const useUserStore = create<UserState>((set) => ({user: null,setUser: (user) => set({ user }),clearUser: () => set({ user: null }),
}));
3. 性能优化
-
使用选择器:避免订阅无关状态。
-
结合
shallow
比较:优化对象/数组类型的状态订阅。import { shallow } from 'zustand/shallow';const { user, setUser } = useUserStore((state) => ({ user: state.user, setUser: state.setUser }),shallow );
4. 在组件外访问 Store
直接调用 Store 方法(如 API 模块中):
// 在非组件代码中
import { useCounterStore } from './store/counterStore';const { increment } = useCounterStore.getState();
increment();
五、与 Redux 和 Context API 对比
特性 | Zustand | Redux | Context API |
---|---|---|---|
复杂度 | 极低 | 高(需 Action、Reducer、Middleware) | 低 |
性能 | 按需订阅状态,自动优化 | 需手动优化(如 reselect ) | 全子树渲染,需手动优化 |
中间件/插件 | 支持(持久化、Immer 等) | 丰富(Redux Thunk、Saga 等) | 无 |
适用场景 | 中小型应用,快速开发 | 大型应用,需严格架构 | 简单状态共享,低频更新 |
TypeScript | 天然支持 | 需额外配置 | 支持 |
六、常见问题与解决方案
1. Store 状态更新后组件未渲染
-
原因:组件未订阅相关状态或选择器未正确更新。
-
解决:检查选择器逻辑,确保状态更新触发组件重渲染。
2. 循环依赖问题
-
场景:多个 Store 相互依赖。
-
解决:通过
getState
在 Action 中访问其他 Store:// store/authStore.ts import { useCartStore } from './cartStore';export const useAuthStore = create((set) => ({login: (user) => {const { clearCart } = useCartStore.getState();clearCart(); // 登录时清空购物车set({ user });}, }));
3. Zustand 与 Next.js 服务端渲染(SSR)
-
问题:服务端与客户端状态不一致。
-
解决:使用
persist
中间件 + 自定义存储(如 Cookie):import { persist, createJSONStorage } from 'zustand/middleware';export const useStore = create(persist((set) => ({ ... }),{name: 'store',storage: createJSONStorage(() => localStorage), // 或自定义存储}) );
七、总结
-
核心优势:简洁、高性能、脱离组件树、中间件支持。
-
适用场景:中小型 React 应用、需快速开发、状态共享与优化。
-
最佳实践:
-
按功能拆分 Store。
-
使用 TypeScript 确保类型安全。
-
合理使用选择器和中间件优化性能。
-
相关文章:
React Redux 与 Zustand
Redux 一、Redux 核心概念 1. 为什么需要 Redux? 解决的问题:在大型 React 应用中,跨组件共享状态、管理复杂数据流。 优势: 单一数据源:全局状态集中存储在 Store 中。 可预测性:通过严格的规则&#…...
Webug4.0靶场通关笔记07- 第9关反射XSS和第10关存储XSS
目录 第09关 反射型XSS 1.打开靶场 2.源码分析 3.渗透实战 第10关 存储型XSS 1.打开靶场 2.源码分析 3.渗透实战 本系列为通过《Webug4.0靶场通关笔记》的渗透集合,本文为反射型和存储型XSS漏洞关卡的渗透部分,通过对XSS关卡源码的代码审计找到漏…...
react学习笔记4——React UI组件库与redux
流行的开源React UI组件库 material-ui(国外) 官网: http://www.material-ui.com/#/github: GitHub - mui/material-ui: Material UI: Comprehensive React component library that implements Googles Material Design. Free forever. ant-design(国内蚂蚁金服) 官网: Ant…...
Java学习手册:Spring 事务管理
一、事务管理的概念 事务是一组操作的集合,这些操作要么全部成功,要么全部失败。事务管理的目的是保证数据的一致性和完整性。在数据库操作中,事务管理尤为重要,例如银行转账、订单支付等场景都需要事务管理来确保数据的正确性。…...
SpringBoot研究生双选系统开发实现
概述 SpringBoot研究生双选信息发布系统,该系统实现了研究生与导师双向选择的全流程管理,采用主流SpringBoot框架开发,是学习企业级教育管理系统开发的优质资源。适合作为计算机专业设计项目或高校信息化建设参考,完整实现…...
springboot中异步接口实现所有方式_20250501
几种异步接口实现demo package org.dromara.controller.app;// 导入必要的依赖库import cn.dev33.satoken.annotation.SaIgnore; import lombok.extern.slf4j.Slf4j; import org.springframework.core.io.Resource; import org.springframework.core.io.UrlResource; import o…...
【Linux网络】I/O多路转接技术 - epoll
📢博客主页:https://blog.csdn.net/2301_779549673 📢博客仓库:https://gitee.com/JohnKingW/linux_test/tree/master/lesson 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! &…...
机器学习经典算法:用决策树原理优化新能源汽车续航能力
🔥 “用决策树重构新能源车能量大脑!算法推导代码实战全解,续航暴增15%” 决策树算法就像我们生活中做决策的 “流程指南”,通过层层判断得出最终结论。比如你去超市买水果,站在琳琅满目的货架前,就不自觉地…...
深入探讨宾馆一次性牙刷价格,市场价格区间差异大
在我们日常出行、住宿的时候,宾馆的一次性牙刷是常见的、标配的物品。许多人或许都会感到好奇,这些一次性牙刷到底值多少钱。下面就来深入探讨一下宾馆一次性牙刷价格方面的问题。 市场价格区间 宾馆一次性牙刷价格差距大,便宜的一支可能只…...
深入解析 .NET Kestrel:高性能 Web 服务器的架构与最佳实践
Kestrel 是 .NET 中用于处理 HTTP 请求的高性能 Web 服务器。作为 ASP.NET Core 的默认服务器,Kestrel 被设计为在高并发、高吞吐量的环境下表现优异,并且能够支持多种协议和跨平台操作。本文将深入探讨 Kestrel 的架构设计、工作原理、配置方式、性能优…...
ZYNQ 纯PL端逻辑资源程序固化流程
ZYNQ 纯PL端逻辑资源程序固化 ZYNQ的程序固化流程比传统的FPGA固化流程复杂很多,Vivado生成的bit文件无法直接固化在ZYNQ芯片中。因为ZYNQ 非易失性存储器的引脚(如 SD 卡、QSPI Flash)是 ZYNQ PS 部分的专用引脚。这些非易失性存储器由 PS …...
【树莓派Pico FreeRTOS】-FreeRTOS-SMP移植
FreeRTOS-SMP移植 文章目录 FreeRTOS-SMP移植1、Raspberry Pi Pico SDK准备2、下载最新FreeRTOS-Kernel源码3、Raspberry Pi Pico的开发环境搭建4、编译配置5、FreeRTOSConfig.h文件设置6、演示代码RP2040 由 Raspberry Pi 设计,具有双核 Arm Cortex-M0+ 处理器和 264KB 内部 …...
数字智慧方案5961丨智慧能源与运维云平台解决方案(52页PPT)(文末有下载方式)
详细资料请看本解读文章的最后内容。 资料解读:智慧能源与运维云平台解决方案 在当今数字化时代,能源管理与设备运维的智能化、高效化成为企业发展的关键。智慧能源与运维云平台解决方案应运而生,为企业提供了全面且先进的能源管理和运维手段…...
2025东三省C题深圳杯C题数学建模挑战赛数模思路代码文章教学: 分布式能源接入配电网的风险分析
完整内容请看文章最下面的推广群 数据整理与分析 表1:有源配电网62节点系统负荷参数 内容:列出了62个节点的有功负荷(单位:kW)。 特点: 负荷范围:24 kW(节点19)到420 …...
腾讯云BI VS quickbi 企业选型(从企业实际功能使用和费用对比)
腾讯云BI VS quickbi 选型 一、总结 前段时间领导让调研腾讯云BI,用来做BI选型,现根据公司实际使用功能做如下总结。 建议继续使用quickbi,不选择腾讯云BI 原因: 腾讯云BI专业版,官方价格最低101996元。并且只能选…...
WebDeveloper 流量分析、sudo提权,靶场通关WP
一、信息收集 1、主机探测 arp-scan -l netdiscover -i eth0 -r 192.168.33.0/24 nmap -sP 192.168.66.0/24 2、端口扫描 nmap -sS -sV 192.168.66.141 PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) 80/tcp op…...
编写教育网站后端页面笔记
callbacktitle.html 对应表: 对应的功能: 控制器层数据: 页面没有写内容 chapter.html 对应表: questionbank ,intofloortime,questionBank,title,didtitles,option,answer,analyse 对应的功能:问题反馈页面 控制器层数据(控制器类): ChapterQuestionbankTitle c…...
C++漫溯键值的长河:map set
文章目录 1.关联式容器2.set2.1 find2.2 lower_bound、upper_bound 3.multiset3.1 count3.2 equal_range 4.map4.1 insert4.2 operate->4.3 operate[ ]4.4 map的应用实践:随机链表的复制 5.multimap希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动…...
西门子数字化研发设计制造一体化规划案例P87(87页PPT)(文末有下载方式)
资料解读:《西门子数字化研发设计制造一体化规划案例》 详细资料请看本解读文章的最后内容。 该文档围绕西门子为企业打造的智能化制造研发工艺生产一体化平台规划方案展开,全面阐述了从业务现状分析到项目实施及案例分享的整个过程。 业务现状与需求分析…...
Rust多线程性能优化:打破Arc+锁的瓶颈,效率提升10倍
一、引言 在 Rust 开发中,多线程编程是提升程序性能的重要手段。Arc(原子引用计数)和锁的组合是实现多线程数据共享的常见方式。然而,很多程序员在使用 Arc 和锁时会遇到性能瓶颈,导致程序运行效率低下。本文将深入剖…...
基于python的人工智能应用简述
基于Python的人工智能应用简述 Python已成为人工智能(AI)开发的首选语言,凭借其简洁性、丰富的库生态系统和强大的社区支持,广泛应用于各类AI应用场景。以下是Python在人工智能领域的主要应用领域和技术实现。 1. 机器学习(Machine Learning) Python通过Scikit-learn、Ten…...
《Android 应用开发基础教程》——第十章:使用 Gson 实现网络 JSON 数据解析与对象映射
目录 第十章:使用 Gson 实现网络 JSON 数据解析与对象映射 🔹 10.1 什么是 Gson? 🔸 10.2 添加依赖 🔸 10.3 基础使用 ✦ 示例 JSON 字符串: ✦ 定义对应的 Java 类: ✦ JSON ➜ 对象&am…...
【Android】四大组件之BroadcastReceiver
目录 一、什么是BroadcastReceiver 二、创建和使用BroadcastReceiver 三、跨应用广播接收权限 四、广播方式 五、广播类型与特性 六、BroadcasReceiver注册方式 七、BroadcasReceiver工作流程 你可以把广播接收器想象成一个“收音机”。它的作用是监听系统或应用发出的“…...
[UVM]寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗?
寄存器模型的镜像值和期望值定义是什么?他们会保持一致吗? 摘要:在 UVM (Universal Verification Methodology) 寄存器模型中,镜像值 (mirrored value) 和期望值 (desired value) 是两个非常重要的概念,用于管理寄存器…...
OpenGL-ES 学习(12) ---- VBO EBO VAO
目录 VBO 定义VBO 创建统一VertexData使用 VBO 绘制VAO VBO 定义 VBO(Vertex Buffer Object) 是指顶点缓冲区对象,而 EBO(Element Buffer Object)是指图元索引缓冲区对象,VBO 和 EBO实际上是同一类 buffer 按照用途的不同称呼 OpenGL-ES2.0 编程中&…...
【Redis分布式】主从复制
🔥个人主页: 中草药 🔥专栏:【中间件】企业级中间件剖析 一、主从复制 在分布式系统之中为了解决单点问题(1、可用性问题,该机器挂掉服务会停止2、性能支持的并发量是有限的)通常会把数据复制多…...
Node.js心得笔记
npm init 可用npm 来调试node项目 浏览器中的顶级对象时window <ref *1> Object [global] { global: [Circular *1], clearImmediate: [Function: clearImmediate], setImmediate: [Function: setImmediate] { [Symbol(nodejs.util.promisify.custom)]: [Getter] }, cl…...
多智能体空域协同中的伦理博弈与系统调停
在多智能体系统(MAS)广泛应用于低空飞行调度、应急响应与城市管理的背景下,AI之间的“协同”不仅是算法效率问题,更是伦理角色之间的权责动态博弈。尤其在高频互动、任务冲突、资源抢占等复杂场景中,智能体不再是“工具…...
面试中系统化地解答系统设计题:通用方法论
目录 一、明确需求(Clarify Requirements) (一)理解业务背景 (二)功能性需求(Functional Requirements) 1. 分析目标 2. 功能需求分类 A. 用户交互类功能 B. 数据处理类功能 C. 管理与运维类功能 D. 外部系统交互类功能 示例场景详解 3. 捕捉隐藏需求的技巧…...
kotlin中 热流 vs 冷流 的本质区别
🔥 冷流(Cold Flow) vs 热流(Hot Flow)区别 特性冷流(Cold Flow)热流(Hot Flow)数据生产时机每次 collect 才开始执行启动时就开始生产、始终运行生命周期与 collect 者…...
机器视觉开发-打开摄像头
以下是使用Python和OpenCV打开摄像头的最简单实现: import cv2# 打开默认摄像头(通常是0) cap cv2.VideoCapture(0)# 检查摄像头是否成功打开 if not cap.isOpened():print("无法打开摄像头")exit()print("摄像头已打开 - 按…...
Rerank详解
疑惑一 我对rag的流程理解是。后端首先建立embedding后的向量数据库,用户提问使用相同的embedding模型进行向量化,使用阈值控制相似度找出前topk个数据。然后rerank,将rerank的结果打包成prompt返回给大模型进行解答。我对于rerank的过程不是…...
深度探索DeepSeek:从架构设计到性能优化的实战指南
深度解码DeepSeek:从架构设计到工业级部署的全链路优化实践 引言:大模型时代的工程挑战 在人工智能技术进入工业化落地阶段的今天,大模型训练与推理的工程化能力已成为衡量企业技术实力的重要标尺。DeepSeek作为当前业界领先的超大规模语言…...
d202551
目录 一、175. 组合两个表 - 力扣(LeetCode) 二、511. 游戏玩法分析 I - 力扣(LeetCode) 三、1204. 最后一个能进入巴士的人 - 力扣(LeetCode) 一、175. 组合两个表 - 力扣(LeetCode…...
(C题|社交媒体平台用户分析问题)2025年第二十二届五一数学建模竞赛(五一杯/五一赛)解题思路|完整代码论文集合
我是Tina表姐,毕业于中国人民大学,对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在,我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…...
计网_PPP协议
2024.10.15:beokayy计算机网络学习笔记 PPP协议 PPP协议的特点PPP协议应满足的需求(了解)PPP协议的组成(PPP协议有三个组成部分) PPP协议的帧格式PPP协议的工作状态 ISP指的是运营商,比如中国联通、中国电信…...
Mem0.ai研究团队开发的全新记忆架构系统“Mem0”正式发布
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
二叉树删除结点详细代码
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h>typedef int data_t; typedef struct _node {data_t data;struct _node* left;struct _node* right; }node_t;int bst_create(node_t**, data_t);//函数声明BST创建 int bst…...
PyTorch线性代数操作详解:点积、矩阵乘法、范数与轴求和
本文通过代码示例详细讲解PyTorch中常用的线性代数操作,包括点积、矩阵乘法、范数计算以及按轴求和等操作,帮助读者掌握张量运算的核心方法。 1. 点积运算 点积(Dot Product)是两个向量对应元素相乘后求和的结果。 实现代码&…...
Java SE(6)——类和对象
1.初始面向对象 1.1 什么是面向对象 Java是一门纯面向对象的编程语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交换来完成一件事情 1.2 面向过程…...
Kubernetes(k8s)的API Server 组件原理与结合生产实战教程
一、API Server 架构深度解析 1. 核心架构设计 二、生产环境安全加固实战 1. 认证(Authentication) 2. 授权(Authorization) 3. 准入控制(Admission Control) 三、性能优化与调参 1. 关键启动参数 四…...
Java面试高频问题(31-33)
三十一、服务网格:东西向流量治理与故障注入 服务网格架构分层 mermaid graph BT subgraph Control Plane APilot --> BEnvoy Sidecar CMixer --> B DCitadel --> B end subgraph Data Plane B --> E服务A B --> F服务B B --> G服务C end 核心能…...
VSCode开发调试Python入门实践(Windows10)
我的Windows10上的python环境是免安装直接解压的Python3.8.x老版本,可参见《Windows下Python3.8环境快速安装部署。 1. 安装VSCode 在Windows 10系统上安装Visual Studio Code(VS Code)是一个简单的过程,以下是详细的安装方法与…...
C++——入门基础(2)
文章目录 一、前言二、C入门2.1 缺省参数2.2 函数重载2.2.1 参数类型不同2.2.1.1 整体参数类型不同2.2.1.2 参数类型顺序不同 2.2.2 参数个数不同2.2.3 避坑注意2.2.3.1无参与有参2.2.3.2 返回值不同 2.3 引用2.3.1 引用的概念2.3.2引用的结构2.3.3 引用的特点2.3.4引用的作用2…...
【MySQL】复合查询与内外连接
目录 一、复合查询 1、基本查询回顾: 2、多表查询: 3、自连接: 4、子查询: 单列子查询 多行子查询: 多列子查询: 在from语句中使用子查询: 5、合并查询: union࿱…...
第3篇:请求参数处理与数据校验
在 Web 开发中,请求参数处理与数据校验是保障系统稳定性的第一道防线。本文将深入探讨 Egg.js 框架中参数处理的完整解决方案,涵盖常规参数获取、高效校验方案、文件流处理等核心功能,并分享企业级项目中的最佳实践。 一、多场景参数获取策略…...
Android JIT编译:adb shell cmd package compile选项
Android JIT编译:adb shell cmd package compile选项 例如: adb shell cmd package compile -m speed -f --full 包名 配置参数指令说明: compile [-r COMPILATION_REASON] [-m COMPILER_FILTER] [-p PRIORITY] [-f] [--primary-dex] …...
排序算法——冒泡排序
一、介绍 「冒泡排序bubblesort」通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样,因此得名冒泡排序。 冒泡过程可以利用元素交换操作来模拟:从数组最左端开始向右遍历,依次比较相邻元素大小,如果“左…...
文献阅读篇#5:5月一区好文阅读,BFA-YOLO,用于建筑信息建模!(上)
期刊简介:《Advanced Engineering Informatics》创刊于2002年,由Elsevier Ltd出版商出版,出版周期Quarterly。该刊已被SCIE数据库收录,在中科院最新升级版分区表中,该刊分区信息为大类学科工程技术1区,2023…...
工行手机银行安全吗?在应用商店下载工商银行安全吗?
现在很多的人都会用手机银行,其中工行的使用几率也是比较高的,但大家在使用的过程中就会比较关心使用工行手机银行是否安全。如果直接在应用商店下载,是否有安全保障? 工行的手机银行会拥有较高的保障,从技术到服务都可…...