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

【redis】数据类型之Stream

Redis Stream是Redis 5.0版本引入的一种新的数据类型,它提供了一种持久化的、可查询的、可扩展的消息队列服务。

它结合了Redis高性能的特性与持久化能力,支持:

  • 多消费者组模式(Consumer Groups)
  • 消息回溯(历史消息查询)
  • 消息阻塞等待
  • 消息持久化(AOF/RDB)

与传统的PUB/SUB模式相比,Stream提供了消息持久化和可靠性投递机制;与专业消息中间件(如Kafka)相比,它更加轻量且完全兼容Redis生态系统。

Stream的基本概念与内部结构

Redis Stream是一个包含零个或任意多个流元素的有序队列。队列中的每个元素都包含一个唯一的ID和任意多个键值对。这些元素会根据ID的大小在流中有序地进行排列。通过将元素ID与时间进行关联,并强制要求新元素的ID必须大于旧元素的ID,Redis从逻辑上将流变成了一种只执行追加操作(append only)的数据结构。

元素ID

每个流元素都有一个唯一的ID,该ID由两部分组成:毫秒时间戳和序列号(<millisecondsTime)>-<sequenceNumber>),例如1717020000000-5

  • 毫秒时间戳:基于Redis实例的当前时间生成,决定ID的主要顺序。

  • 序列号:同一毫秒内的递增序号(64 位无符号整数),保证唯一性。

Redis允许用户自定义元素ID,但要求新元素的ID必须比流中所有已有元素的ID都要大。为了方便执行添加操作,Redis为XADD命令的id参数设定了一个特殊值*。当使用作为id参数的值时,Redis将自动为新添加的元素生成一个可用的新ID。

消息生命周期与状态变化

  • 未读状态:未被任何消费者读取的消息。

  • PENDING状态:通过XREADGROUP读取但未确认的消息(记录在消费者组的PEL列表中)。

  • ACKED状态:通过XACK确认后,消息从PEL移除,但仍保留在Stream中(除非手动删除或自动修剪)。

stream命令的使用

有关stream类型的命令可以通过help @stream命令来查看。有关命令的使用可以通过help 命令来查看,例如help xadd

XADD

XADD:发送消息。

语法:

XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|id field value [field value ...]

选项说明:

  • *:自动生成消息ID(格式:<毫秒时间戳>-<序列号>,如1717020000000-0)

  • field value:消息内容(至少1组键值对,支持多个字段)

使用:

127.0.0.1:6379> xadd mystream * k1 v1 k2 v2
"1742455243729-0"

XREAD

XREAD:读取消息。

语法:

XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]

选项说明:

  • BLOCK:阻塞等待毫秒数(0=无限等待)
  • ID:是对应流的起始消息ID(特殊值$表示只读新消息,0-0从头读取)

使用:

127.0.0.1:6379> xread count 10 streams mystream 0-0
1) 1) "mystream"2) 1) 1) "1742455243729-0"2) 1) "k1"2) "v1"3) "k2"4) "v2"

XRANGE

XRANGE:范围查询消息。

语法:

XRANGE key start end [COUNT count]

选项说明:

  • start/end:消息ID范围(特殊值-表示最小值,+表示最大值)

  • count:限制返回条目数(默认为全部)

使用:

# 查询所有消息
127.0.0.1:6379> xrange mystream - + count 3
1) 1) "1742455243729-0"2) 1) "k1"2) "v1"3) "k2"4) "v2"
2) 1) "1742457110169-0"2) 1) "k1"2) "v1"
3) 1) "1742457113644-0"2) 1) "k2"2) "v2"# 按指定范围查询
127.0.0.1:6379> xrange mystream 1742457110169-0 1742457113644-0
1) 1) "1742457110169-0"2) 1) "k1"2) "v1"
2) 1) "1742457113644-0"2) 1) "k2"2) "v2"

XLEN

XLEN:用于获取指定Stream中当前存储的消息总数(包含未被删除的条目)。

语法:

XLEN key

使用:

127.0.0.1:6379> xlen mystream
(integer) 7

XDEL

XDEL:根据消息ID删除消息,支持多个ID批量删除。

语法:

XDEL key ID [ID ...]

使用:

127.0.0.1:6379> xdel mystream 1742457110169-0
(integer) 1

XREVRANGE

XREVRANGE:逆序获取消息范围,与XRANGE相反。

语法:

XREVRANGE key end start [COUNT count]

使用:

127.0.0.1:6379> xrevrange mystream + - count 3
1) 1) "1742457125799-0"2) 1) "k6"2) "v6"
2) 1) "1742457122555-0"2) 1) "k5"2) "v5"
3) 1) "1742457119534-0"2) 1) "k4"2) "v4"

XGROUP

XGROUP:用于管理消费者组。

语法:

XGROUP [CREATE key groupname ID|$ [MKSTREAM]] [SETID key groupname ID|$] [DESTROY key groupname] [CREATECONSUMER key groupname consumername] [DELCONSUMER key groupname consumername]

选项说明:

  • CREATE key groupname ID|$ [MKSTREAM]:显式创建消费者,

    • id/$:起始ID
    • MKSTREAM:自动创建流
  • SETID key groupname ID|$:重置消费组的最后递送ID

  • DESTROY key groupname:强制删除整个消费者组

  • CREATECONSUMER key groupname consumername:显式创建消费者

  • DELCONSUMER key groupname consumername:删除消费者

使用:

127.0.0.1:6379> xgroup create mystream mygroup $
OK

XREADGROUP

XREADGROUP:从消费者组内读取消息并管理消费状态。

语法:

XREADGROUP GROUP group consumer [COUNT count] [BLOCK milliseconds] [NOACK] STREAMS key [key ...] ID [ID ...]

选项说明:

  • GROUP:消费者组名(需通过XGROUP CREATE预先创建)。
  • consumer-name:消费者标识(自动创建或显式管理)。
  • STREAMS:目标Stream键名及起始ID(>表示新消息,0-0表示历史消息)。
  • COUNT:单次读取消息数(默认全部)。
  • BLOCK:阻塞等待时间(毫秒,0表示无限等待)。

使用:

127.0.0.1:6379> xreadgroup group mygroup consumer1 count 1 streams mystream >
1) 1) "mystream"2) 1) 1) "1742459887439-0"2) 1) "kk"2) "vv"

XACK

XACK:消费者组模式下确认消息处理完成。

语法:

XACK key group ID [ID ...]

使用:

127.0.0.1:6379> xack mystream mygroup 1742459887439-0
(integer) 1

XPENDING

XPENDING:查询消费者组内未确认消息(Pending Entries List, PEL)。

语法:

XPENDING key group [[IDLE min-idle-time] start end count [consumer]]

使用:

127.0.0.1:6379> xpending mystream mygroup - + 10
1) 1) "1742460095984-0"2) "consumer1"3) (integer) 46824) (integer) 1

XCLAIM

XCLAIM:用于转移消费者组内未确认消息(Pending Entries List, PEL)所有权的核心命令,主要用于故障恢复、负载均衡和消息重试场景。

语法:

XCLAIM key group consumer min-idle-time id [id ...] [IDLE ms] [TIME unix-time-milliseconds] [RETRYCOUNT count] [FORCE] [JUSTID] [LASTID lastid]

选项说明:

  • consumer:接收消息的目标消费者名称
  • min_idle_time:消息空闲时间阈值(毫秒),仅空闲时间超过此阈值的消息会被转移
  • ID:要转移的消息ID(支持批量操作)
  • IDLE:设置消息的新空闲时间(默认重置为0)
  • RETRYCOUNT:设置消息的重试次数(默认自动+1)
  • JUSTID:仅返回转移成功的消息ID,不返回消息内容(用于批量操作优化性能)

使用:

127.0.0.1:6379> xclaim mystream mygroup consumer2 30 1742460095984-0
1) 1) "1742460095984-0"2) 1) "kk"2) "vv"127.0.0.1:6379> xpending mystream mygroup - + 10 consumer2
1) 1) "1742460095984-0"2) "consumer2"3) (integer) 210554) (integer) 3

XAUTOCLAIM

XAUTOCLAIM:自动化批量转移未确认消息,专为优化消费者组内消息故障恢复和负载均衡设计。它通过自动扫描并转移满足条件的 PENDING消息,显著简化了手动调用XCLAIM的复杂流程。

语法:

XAUTOCLAIM key group consumer min-idle-time start [COUNT count] [JUSTID]

使用:

127.0.0.1:6379> xautoclaim mystream mygroup consumer1 30 0-0
1) "0-0"
2) 1) 1) "1742460095984-0"2) 1) "kk"2) "vv"

XSETID

XSETID:手动设置Stream的最后一个消息ID。

语法:

XSETID key arg

使用:

127.0.0.1:6379> xsetid mystream 1742460095984-0
OK

XINFO

XINFO:用于获取Stream数据结构及关联消费者组的详细信息。

语法:

XINFO [CONSUMERS key groupname] [GROUPS key] [STREAM key] [HELP]

使用:

127.0.0.1:6379> xinfo consumers mystream mygroup
1) 1) "name"2) "consumer1"3) "pending"4) (integer) 15) "idle"6) (integer) 1228633
2) 1) "name"2) "consumer2"3) "pending"4) (integer) 05) "idle"6) (integer) 2619218

XTRIM

XTRIM:动态修剪Stream中的消息数量或时间范围,以控制内存占用和保持数据时效性。

语法:

XTRIM key MAXLEN|MINID [=|~] threshold [LIMIT count]

选项说明:

  • MAXLEN:保留最新threshold条消息(按消息数量修剪)
  • MINID:保留ID≥threshold的消息(按时间范围修剪)
  • =|~:=表示精确修剪;~表示近似修剪(效率更高但可能略微超出阈值)
  • LIMIT count:可选,限制单次修剪的消息数量(避免大范围删除阻塞服务)

使用:

127.0.0.1:6379> xtrim mystream maxlen 5
(integer) 3

使用场景

消息队列:替代Redis的LISTPub/Sub,支持持久化和消费者组。示例:订单处理、异步任务队列。

日志收集:将日志作为事件流存储,支持多消费者并行分析。

实时数据处理:结合XREAD阻塞读取,实时处理用户行为数据(如点击、搜索)。

事件溯源:记录系统状态变化,支持按时间回放事件。

Java使用示例

生产者生产消息

package com.morris.redis.demo.stream;import org.springframework.data.redis.connection.stream.ObjectRecord;
import org.springframework.data.redis.connection.stream.StreamRecords;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;@RestController
@RequestMapping("stream")
public class StreamProducer {@Resourceprivate RedisTemplate<String, Object> redisTemplate;@RequestMapping("/produce")public String sendMessage() {Map<String, Object> message = new HashMap<>();message.put("name", "morris");message.put("age", 18);ObjectRecord<String, Map<String, Object>> record = StreamRecords.newRecord().ofObject(message).withStreamKey(StreamConfig.STREAM_KEY);redisTemplate.opsForStream().add(record);return "success";}
}

消费者组初始化

package com.morris.redis.demo.stream;import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.RedisSystemException;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.Resource;@Slf4j
@Component
public class StreamConfig {public static final String STREAM_KEY = "java-stream";public static final String GROUP = "java-group";@Resourceprivate RedisTemplate redisTemplate;@PostConstructpublic void initConsumerGroup() {try {redisTemplate.opsForStream().createGroup(STREAM_KEY, GROUP);} catch (RedisSystemException e) {log.info("Consumer group already exists");}}
}

消费者消费消息

package com.morris.redis.demo.stream;import org.springframework.data.redis.connection.stream.*;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.List;@RestController
@RequestMapping("stream")
public class StreamConsumer {@Resourceprivate RedisTemplate redisTemplate;@RequestMapping("/consumer")public Object consumeMessages() {Consumer consumerConfig = Consumer.from(StreamConfig.GROUP, "java-consumer");StreamOffset<String> offset = StreamOffset.create(StreamConfig.STREAM_KEY, ReadOffset.lastConsumed());List<MapRecord<String, Object, Object>> records = redisTemplate.opsForStream().read(consumerConfig, StreamReadOptions.empty().count(10), offset);records.forEach(record -> {redisTemplate.opsForStream().acknowledge(StreamConfig.STREAM_KEY, StreamConfig.GROUP, record.getId());});return records;}
}

相关文章:

【redis】数据类型之Stream

Redis Stream是Redis 5.0版本引入的一种新的数据类型&#xff0c;它提供了一种持久化的、可查询的、可扩展的消息队列服务。 它结合了Redis高性能的特性与持久化能力&#xff0c;支持&#xff1a; 多消费者组模式&#xff08;Consumer Groups&#xff09;消息回溯&#xff08…...

day17 周末两天偷懒没更新,今天炼丹加学习,完结STL常用容器部分

还剩下两个常用容器&#xff0c;一个是set(集合容器) &#xff0c; 一个是map容器 set/multiset 容器 set容器是关联式容器&#xff0c;该容器的特点是&#xff1a;所有元素都会在插入时被自动排序 set/multiset 都是关联式容器 &#xff0c;其底层结构是使用二叉树实现的。…...

嵌入式开发场景中Shell脚本执行方式的对比

‌Shell脚本执行方式对比表‌ ‌执行方式‌‌命令示例‌‌是否需要执行权限‌‌是否启动子Shell‌‌环境变量影响范围‌‌适用场景‌‌嵌入式开发中的典型应用‌‌直接执行脚本‌./script.sh是是子Shell内有效独立运行的脚本&#xff0c;需固定环境自动化构建脚本&#xff08;…...

数据结构之多项式相加的链表实现

在计算机科学中&#xff0c;多项式的表示和运算经常会用到。使用链表来表示多项式是一种常见且有效的方法&#xff0c;它可以方便地处理多项式的各项&#xff0c;并且在进行多项式相加等运算时具有较好的灵活性。 多项式通常由一系列的项组成&#xff0c;每一项包含一个系数和…...

Java 实现将Word 转换成markdown

日常的开发中&#xff0c;需要将word 等各类文章信息转换成格式化语言&#xff0c;因此需要使用各类语言将word 转换成Markdown 1、引入 jar包 <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version&g…...

IEEE PDF Xpress校验出现 :字体无法嵌入问题以及pdf版本问题

文章目录 问题描述一、字体嵌入问题首先查看一下&#xff0c;哪些字体没有被嵌入查看window的font文件夹里的字体下载字体的网站修复字体嵌入问题 二、pdf版本不对 问题描述 在处理IEEE的camera ready的时候&#xff0c;提交到IEEE express的文件没有办法通过validate&#xf…...

Sa-Token

简介 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 官方文档 常见功能 登录认证 本框架 用户提交 name password 参数&#xff0c;调用登…...

StarRocks 中 CURRENT_TIMESTAMP 和 CURRENT_TIME 分区过滤问题

背景 本文基于Starrocks 3.3.5 最近在进行Starrocks 跑数据的时候&#xff0c;发现了一个SQL 扫描了所有分区的数据&#xff0c;简化后的SQL如下&#xff1a; select date_created from tableA where date_createddate_format(current_time(), %Y-%m-%d %H:%i:%S) limit 20其…...

GithubPages+自定义域名+Cloudfare加速+浏览器收录(2025最新排坑)

前言 最近刷到一个小视频&#xff0c;讲述了选择域名选择的三宗罪&#xff0c;分别是 不要使用 .net&#xff0c;因为它价格贵&#xff0c;但是在顶级域名中的 SEO 效果却不是很好&#xff0c;也就是性价比很低不要使用 .cn&#xff0c;因为国外访问该网站可能会很慢&#xf…...

Canvas粒子系统终极指南:从基础运动到复杂交互的全流程实现

文章目录 一、粒子系统基础架构1.1 粒子数据结构设计1.2 粒子系统管理器 二、基础粒子效果实现2.1 重力场模拟2.2 弹性碰撞效果 三、高级交互实现3.1 鼠标吸引效果3.2 颜色渐变粒子 四、性能优化策略4.1 粒子池复用4.2 分层渲染 五、复杂效果实现5.1 烟花爆炸效果5.2 流体模拟 …...

【QT】新建QT工程(详细步骤)

新建QT工程 1.方法(1)点击new project按钮&#xff0c;弹出对话框&#xff0c;新建即可&#xff0c;步骤如下&#xff1a;(2) 点击文件菜单&#xff0c;选择新建文件或者工程&#xff0c;后续步骤如上 2.QT工程文件介绍(1).pro文件 --》QT工程配置文件(2)main.cpp --》QT工程主…...

详解Http:在QT中使用Http协议

目录 一、HTTP 概述 1、主要特点 2、HTTP 方法 3、HTTP 状态码 4、HTTP 头部 5、HTTP的工作原理 二、在Qt中使用HTTP 1、发送简单的HTTP请求 2、发送POST请求 3、处理异步请求 4、使用QSslConfiguration进行HTTPS 5、 处理JSON响应 6、处理错误 三、总结 一、HTTP…...

Next.js 中间件鉴权绕过漏洞 (CVE-2025-29927) 复现利用与原理分析

免责声明 本文所述漏洞复现方法仅供安全研究及授权测试使用&#xff1b; 任何个人/组织须在合法合规前提下实施&#xff0c;严禁用于非法目的&#xff1b; 作者不对任何滥用行为及后果负责&#xff0c;如发现新漏洞请及时联系厂商并遵循漏洞披露规则。 漏洞原理 Next.js 是一个…...

AI时代的数据底座:火山引擎多模态数据湖的设计与实践

资料来源&#xff1a;火山引擎-开发者社区 随着大模型的发展和应用&#xff0c;文本的边界被拓宽&#xff0c;图像、视频、语音各种模态涌现&#xff0c;并给数据管理、检索、计算带来巨大挑战。 火山引擎多模态数据湖 解决方案则可实现海量结构化、半结构化及非结构化数据的统…...

Numpy用法(二)

一.数组变维 1.1 reshape reshape() 可以改变数组维度&#xff0c;但是返回的是一个新的数组&#xff0c;原数组的形状不会被修改.reshape后产生的新数组是原数组的一个视图&#xff0c;即它与原数组共享相同的数据&#xff0c;但可以有不同的形状或维度&#xff0c;且对视图…...

STM32 IIC通信

目录 IIC简介硬件电路连接I2C时序基本单元IIC完整数据帧MPU6050封装硬件IIC内部电路 IIC简介 IIC&#xff08;Inter-Integrated Circuit&#xff09;是 IIC Bus 简称&#xff0c;中文叫集成电路总线。它是一种串行通信总线&#xff0c;使用多主从架构&#xff0c;由飞利浦公司…...

快速入门 JSON 数据格式

引言 JSON&#xff0c;全称 JavaScript Object Notion&#xff0c;类似于XML&#xff0c;YAML&#xff0c;Properties等&#xff0c;是一种数据交换格式&#xff0c;相比于XML&#xff0c;更简单&#xff0c;更轻量&#xff0c;更容易理解。 JSON vs XML 使用 JSON 目前被广…...

FFmpeg —— 中标麒麟系统下使用FFmpeg内核+Qt界面,制作完整功能音视频播放器(附:源码)

🔔 FFmpeg 相关音视频技术、疑难杂症文章合集(掌握后可自封大侠 ⓿_⓿)(记得收藏,持续更新中…) 程序运行效果...

硬件测试工装设计不合理的补救措施

硬件测试工装设计不合理的补救措施主要包括重新评估设计需求、优化工装结构、强化工装校准与验证。其中&#xff0c;优化工装结构尤其重要&#xff0c;通过结构优化能够有效解决因设计不合理导致的测试准确性下降和可靠性不足的问题。根据工程实践数据&#xff0c;经过优化结构…...

任意文件读取漏洞

fofa语句&#xff1a;body"/vite/client" /fs/etc/passwd?import&raw?? https://35.175.173.157/fs/etc/passwd?import&raw?? http://geometer.dev.mvergely.com/fs/etc/passwd?import&raw??...

如何使用RK平台的spi驱动 spidev

RK平台spidev驱动读取RC522版本号示例 1. 硬件与驱动确认 确认SPI接口连接&#xff1a;RC522的SPI引脚与RK开发板的对应SPI控制器正确连接&#xff08;CS、CLK、MOSI、MISO&#xff09;检查内核配置&#xff1a; Bash # 内核需启用以下配置 CONFIG_SPIy CONFIG_SPI_MASTERy…...

网路传输层UDP/TCP

一、端口号 1.端口号 1.1 五元组 端口号(port)标识了一个主机上进行通信的不同的应用程序. 如图所示, 在一个机器上运行着许多进程, 每个进程使用的应用层协议都不一样, 比如FTP, SSH, SMTP, HTTP等. 当主机接收到一个报文中, 网络层一定封装了一个目的ip标识我这台主机, …...

1.2-WAF\CDN\OSS\反向代理\负载均衡

WAF&#xff1a;就是网站应用防火墙&#xff0c;有硬件类、软件类、云WAF&#xff1b; 还有网站内置的WAF&#xff0c;内置的WAF就是直接嵌在代码中的安全防护代码 硬件类&#xff1a;Imperva、天清WAG 软件&#xff1a;安全狗、D盾、云锁 云&#xff1a;阿里云盾、腾讯云WA…...

Dify 服务器部署指南

1. 系统要求 在开始部署之前&#xff0c;请确保你的服务器满足以下要求&#xff1a; 操作系统&#xff1a;Linux&#xff08;推荐使用 Ubuntu 20.04 或更高版本&#xff09;内存&#xff1a;至少 4GB RAM存储&#xff1a;至少 20GB 可用空间网络&#xff1a;稳定的互联网连接…...

从车间到数字生态:MES如何引领制造业智能化革命‌

在全球制造业加速迈向工业4.0的浪潮中&#xff0c;传统生产模式正经历颠覆性变革。制造执行系统&#xff08;MES&#xff09;作为连接物理车间与数字世界的核心纽带&#xff0c;正从“生产辅助工具”升级为“智能决策大脑”&#xff0c;推动制造业向数据驱动、柔性化与可持续化…...

Error:Flash Download failed

出现这个就是编译器要换...

Spring容器生命周期详解

Spring容器生命周期详解 Spring容器的生命周期从启动到关闭分为多个阶段&#xff0c;包括Bean的加载、实例化、初始化、使用和销毁。以下是详细流程和关键点&#xff1a; 1. 容器启动阶段 1.1 容器实例化 核心接口&#xff1a;BeanFactory&#xff08;基础容器&#xff09;或…...

革新测试管理 2.0丨Storm UTP统一测试管理平台智能化升级与全流程优化

承接上篇&#xff1a;从基础架构到深度协同 在首篇文章《革新测试管理 | 统一测试管理平台如何实现远程、协同、自动化&#xff1f;》中&#xff0c;我们探讨了Storm UTP如何通过云端协作、自动化测试框架和分布式执行能力打破传统测试壁垒。经过一年多的客户实践与技术迭代&a…...

将 char [] str = “hello,you,world” 改为 “world,you,hello“,要求空间复杂度为1

题目&#xff1a; 将 char [] str “hello,you,world” 改为 "world,you,hello",要求空间复杂度为1 &#xff08;也就是使用的变量只能是单个字符或者常数&#xff0c;不能使用数组&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 解…...

运维规则之总结(Summary of Operation and Maintenance Rules)

运维规则之总结 在运维领域&#xff0c;经验和流程往往决定了系统的稳定性与可靠性。一个运维人&#xff0c;总结出了以下10条运维规则&#xff0c;涵盖了从基础管理到高级策略的全面内容&#xff0c;旨在帮助运维人员更好地应对各种挑战&#xff0c;确保系统的平稳运行。 1.…...

MongoDB 创建数据库

MongoDB 创建数据库 引言 MongoDB 是一款高性能、可扩展的 NoSQL 数据库&#xff0c;广泛应用于大数据领域。在 MongoDB 中&#xff0c;创建数据库是进行数据存储的第一步。本文将详细介绍 MongoDB 数据库的创建方法&#xff0c;包括手动创建和自动创建两种方式。 MongoDB 数…...

SpringSecurity OAuth2:授权服务器与资源服务器配置

文章目录 引言一、OAuth2基础概念与架构二、授权服务器配置三、令牌策略与存储方式四、资源服务器配置五、远程令牌验证与内省总结 引言 在现代分布式应用架构中&#xff0c;OAuth2已成为实现安全授权与认证的事实标准。Spring Security对OAuth2提供了全面支持&#xff0c;使开…...

Vue 2 探秘:visible 和 append-to-body 是谁的小秘密?

&#x1f680; Vue 2 探秘&#xff1a;visible 和 append-to-body 是谁的小秘密&#xff1f;&#x1f914; 父组件&#xff1a;identify-list.vue子组件&#xff1a;fake-clue-list.vue 嘿&#xff0c;各位前端探险家&#xff01;&#x1f44b; 今天我们要在 Vue 2 的代码丛林…...

C#高级:启动、中止一个指定路径的exe程序

一、启动一个exe class Program {static void Main(string[] args){string exePath "D:\测试\Test.exe";// 修改为你要运行的exe路径StartProcess(exePath);}private static bool StartProcess(string exePath){// 创建一个 ProcessStartInfo 对象来配置进程启动参…...

windows下安装sublime

sublime4 alpha 4098 版本 下载 可以根据待破解的版本选择下载 https://www.sublimetext.com/dev crack alpha4098 的licence 在----- BEGIN LICENSE ----- TwitterInc 200 User License EA7E-890007 1D77F72E 390CDD93 4DCBA022 FAF60790 61AA12C0 A37081C5 D0316412 4584D…...

Qt 日志输出(重定向)

在软件开发中&#xff0c;日志输出是调试和问题排查的关键手段。Qt框架提供了灵活的日志系统&#xff0c;支持从简单的控制台输出到复杂的自定义日志处理。本文将详细介绍Qt中五种常用的日志输出方法&#xff0c;并附上完整代码示例。 一、使用Qt内置日志函数 Qt提供了五个全局…...

51c嵌入式~MOS~合集1

我自己的原文哦~ https://blog.51cto.com/whaosoft/12074888 一、MOS管&#xff1a;米勒效应、开关损耗以及参数匹配 MOS管即场效应管&#xff08;MOSFET&#xff09;&#xff0c;属于压控型&#xff0c;是一种应用非常广泛的功率型开关元件&#xff0c;在开关电源、逆变器…...

一文详解k8s体系架构知识

0.云原生 1.k8s概念 1. k8s集群的两种管理角色 Master&#xff1a;集群控制节点&#xff0c;负责具体命令的执行过程。master节点通常会占用一股独立的服务器&#xff08;高可用部署建议用3台服务器&#xff09;&#xff0c;是整个集群的首脑。 Master节点一组关键进程&#xf…...

Linux内核软中断分析

一、软中断类型 在Linux内核中&#xff0c;中断处理分为上半部&#xff08;硬中断&#xff09;和下半部。上半部负责快速响应硬件事件&#xff0c;而下半部用于处理耗时任务&#xff0c;避免阻塞系统。下半部有三种机制&#xff1a;软中断&#xff08;Softirq&#xff09;、小任…...

从医疗大模型到综合医疗智能体:算法、架构与路径全流程分析

一、引言 1.1 研究背景与意义 随着信息技术的飞速发展,医疗领域正经历着深刻的变革。医疗智能体作为人工智能技术在医疗行业的重要应用,正逐渐成为提升医疗服务质量、优化医疗流程、促进医疗资源合理分配的关键力量。从最初简单的医疗信息管理系统,到如今能够辅助诊断、制定…...

2025跳槽学习计划

&#xff08;1&#xff09;编程基础&#xff1a; 目录学习资料Chttps://www.bilibili.com/video/BV1z64y1U7hs?spm_id_from333.1387.favlist.content.clickLinuxPytorchhttps://www.bilibili.com/video/BV1if4y147hS?spm_id_from333.1387.favlist.content.clickopencv数据结…...

数据库后续

-- 添加作者字段 alter table t_hero add author varchar(100); -- 更新数据 update t_hero set author "曹雪芹" where id 1; update t_hero set author "曹雪芹" where id 2; update t_hero set author "曹雪芹" where id 3; upd…...

程序员软件工具推荐列表

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 程序员软件工具推荐列表1. Snipaste2. VSCod…...

如何在WordPress中限制用户登录到一台设备

在当今的互联网环境下&#xff0c;许多用户习惯共享账户信息&#xff0c;虽然看似无害&#xff0c;却可能对网站运营产生负面影响。尤其是对于那些经营会员网站和在线课程的平台&#xff0c;限制用户同时登录的设备数量显得尤为重要。本文将详细探讨如何在WordPress中限制用户登…...

基于大模型的自发性气胸全方位预测与诊疗方案研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 二、大模型预测自发性气胸的原理及技术基础 2.1 大模型介绍 2.2 模型构建与训练数据 2.3 模型训练与优化 三、术前风险预测与准备 3.1 术前风险预测指标 3.2 基于预测的术前准备 3.3 手术方案与麻醉方案制定…...

文章记单词 | 第14篇(六级)

一&#xff0c;单词释义 affection&#xff1a;n. 喜爱&#xff0c;钟爱&#xff1b;爱慕之情&#xff1b;感情stream&#xff1a;n. 小河&#xff0c;溪流&#xff1b;一连串&#xff0c;源源不断&#xff1b;水流&#xff0c;气流&#xff1b;vi. 流&#xff0c;流动&#x…...

系统如何查找文件?inode号又是什么?

下面分别详细解释您提到的三个问题&#xff1a; “文件系统怎么定位文件”、“inode 是什么”、“为什么删除后还可能被占用”。 一、文件系统怎么定位文件 1.1 目录与文件名并不直接存储文件数据 在常见的 Unix/Linux 文件系统&#xff08;如 ext4、xfs&#xff09;或类似的…...

Uni-app入门到精通:tabBar节点实现多页面的切换

tabBar节点用于实现多页面的切换。对于一个多tabBar应用&#xff0c;可以通过tabBar节点配置项指定一级导航栏&#xff0c;以及tabBar切换时显示的对应页面。在pages.json中提供tabBar节点配置&#xff0c;不仅是为了方便快速开发导航&#xff0c;更重要的是提示App平台和小程序…...

torchvision中数据集的使用

1、torchvision及其数据集的介绍 1.1 torchvision介绍 torchvision 是 PyTorch 的一个官方库&#xff0c;专门用于计算机视觉任务。它提供了以下核心功能&#xff1a; 预训练模型&#xff1a;如 ResNet、VGG、EfficientNet 等。数据集&#xff1a;内置常用视觉数据集&#xf…...

uniapp开发实战自定义组件形式实现自定义海报功能

在 UniApp 中实现自定义海报功能,可以通过 Canvas 来绘制海报。Canvas 提供了丰富的绘图 API,可以精确控制文字、图片和二维码的位置。下面是一个完整的示例,展示如何创建一个自定义海报组件。 项目结构 假设你的项目结构如下: project-root/ ├── pages/ │ └──…...