Redis 7.x 系列【14】数据类型之流(Stream)
有道无术,术尚可求,有术无道,止于术。
本系列Redis 版本 7.2.5
源码地址:https://gitee.com/pearl-organization/study-redis-demo
文章目录
- 1. 概述
- 2. 常用命令
- 2.1 XADD
- 2.2 XRANGE
- 2.3 XREVRANGE
- 2.4 XDEL
- 2.5 XLEN
- 2.6 XREAD
- 2.7 XGROUP CREATE
- 2.8 XACK
- 2.9 XPENDING
- 3. 应用场景
1. 概述
消息队列:是指把要传输的数据(消息)放在队列中,用队列机制来实现消息传递,生产者产生消息并把消息放入队列,然后由消费者去处理。消费者可以到指定队列拉取消息,或者订阅相应的队列,由服务端给其推送消息。
Redis 也支持消息队列功能,在 5.0 版本之前,基于以下两种方式实现:
Pub/SubList
Pub/Sub 发布订阅模式,消息的发送者不会将消息直接发送给特定的接收者,而是通过消息通道广播出去,让订阅该消息主题的订阅者消费到:

Pub/Sub 中的消息无法持久化,如果出现网络断开、宕机等,消息就会被丢弃。而且也没有 Ack 机制来保证数据的可靠性,假设一个消费者都没有,那消息就直接被丢弃了。
Redis List 也可以实现消息队列,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边)。 将需要延后处理的任务结构体序列化成字符串塞进 Redis 的列表,另一个线程从这个列表中轮询数据进行处理:

Redis List 同样存在诸多问题,比如,不支持多消费者模式,不支持延时消息,不支持优先级,不支持消息确认机制等等。
Redis Stream 是 5.0 版本中引入的一种新的数据结构,用于实现简单但功能强大的消息传递模式。以时间序列的方式存储消息,每个消息都有一个唯一的 ID ,并且可以被多个消费者订阅和消费。是 Redis 实现消息队列的另外一种模式,支持消息的持久化、支持自动生成全局唯一 1D、支持 Ack 确认消息模式、支持消费组模式等,旨在让消息队列更加的稳定和可靠。
其结构图如下:

各部分解释:
Message Content:消息内容Consumer group:消费组,通过XGROUP CREATE命令创建,同一个消费组可以有多个消费者Last_delivered_id:游标,每个消费组会有个游标Last_delivered_id,任意一个消费者读取了消息都会使游标往前移动。Consumer:消费者,消费组中的消费者Pending_ ids:消费者会有一个状态变量,用于记录被当前消费已读取但未 ack 的消息 Id ,如果客户端没有 ack ,这个变量里面的消息ID会越来越多,一旦某个消息被ack它就开始减少。这个pending_ids变量在Redis官方被称之为PEL(Pending Entries List),记录了当前已经被客户端读取的消息,但是还没有ack(Acknowledge character:确认字符),它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理
2. 常用命令
Stream 相关所有命令:
| 命名 | 描述 |
|---|---|
| XACK | 确认消费者已经成功处理从 Stream 中获取的消息 |
| XADD | 添加消息到队列末尾 |
| XAUTOCLAIM | 转移符合指定条件的待处理流条目的所有权 |
| XCLAIM | 改变待处理消息的所有权 |
| XDEL | 删除消息 |
| XGROUP CREATE | 为存储在 key 的流创建一个新的消费者组 |
| XGROUP CREATECONSUMER | 要在存储在key的流的消费者组中创建一个消费者 |
| XGROUP DELCONSUMER | 消费者组中删除一个消费者 |
| XGROUP DESTROY | 删除一个已存在的消费者组 |
| XGROUP SETID | 为消费者组设置最后传递的ID |
| XINFO CONSUMERS | 返回消费者组中的消费者列表 |
| XINFO GROUPS | 返回消费者组列表 |
| XINFO STREAM | 存储在的key流的相关信息 |
| XLEN | 获取 Stream 中的消息长度 |
| XPENDING | 通过消费者组从流中获取数据但不确认这些数据,会产生待处理条目 |
| XRANGE | 获取消息列表(可以指定范围) |
| XREAD | 获取消息(阻塞/非阻塞),返回大于指定 ID 的消息 |
| XREADGROUP | XREAD命令的一个特殊版本,支持消费者组 |
| XREVRANGE | 和 XRANGE 相比区别在于反向获取,ID从大到小 |
| XSETID | 内部命令。它用于主节点来复制流的最后传递的ID |
| XTRIM | 限制 Stream 的长度,如果已经超长会进行截取 |
2.1 XADD
XADD 命令用于向 Stream(流)数据结构末尾添加消息。
语法格式:
XADD key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID field value [field value ...]
参数说明:
key:指定要添加消息的Stream的名称。[NOMKSTREAM]:可选参数,用于指定当流不存在时是否报错。默认情况下,如果指定的流不存在,XADD命令会创建。如果使用NOMKSTREAM选项,则流不存在时命令会失败。[MAXLEN|MINID [=|~] threshold [LIMIT count]]:这组选项用于控制流的最大长度或最小消息ID。MAXLEN maxlen:限制Stream的最大长度。当长度达到maxlen时,旧的消息会被自动删除。MINID minid:指定最旧的消息ID。当插入新消息时,如果已经存在比minid更旧的消息,则会将这些消息删除。[=|~]:操作符,=表示精确匹配,~表示小于等于(对于MINID而言)或大于等于(对于MAXLEN而言)。[LIMIT count]:当使用MAXLEN和~时,指定需要保留的消息数量的最小值。
*|ID:消息的ID。使用*表示自动生成一个唯一的ID。如果不使用*,则需要提供一个有效的消息ID,它必须大于流中所有已存在的消息的ID。field value [field value ...]:消息的字段和值。可以指定一个或多个字段及其对应的值。
示例,插入消息:
localhost:0>XADD mystream * msg_1 100 msg_2 38
"1719279960591-0"
示例, 插入消息,并限制长度不超过 1000 条:
localhost:0>XADD mystream MAXLEN 1000 * msg_3 100 msg_4 38
"1719279971749-0"
查看控制台:

2.2 XRANGE
XRANGE 命令用于获取指定范围内的消息。
命令格式:
XRANGE key start end [COUNT count]
参数说明:
key:指定Stream的key。start:指定要检索的消息范围的起始ID。可以使用特殊值-来表示最小值。end:指定要检索的消息范围的结束ID。可以使用特殊值+来表示最大值。[COUNT count]:可选参数,用于限制返回的消息数量。
注意事项:
Stream的消息ID由两部分组成:一个时间戳和一个序列号。时间戳表示消息被添加到Stream的时间,而序列号则用于在同一时间戳内区分不同的消息。XRANGE命令返回的消息是按照它们在Stream中的顺序排列的,即按照消息ID的顺序。- 如果在检索消息时使用了
COUNT参数,但指定的范围内的消息数量少于COUNT指定的数量,那么只会返回范围内的所有消息。
示例,检索所有消息:
localhost:0>XRANGE mystream - +1) 1) "1719279960591-0"2) 1) "msg_1"2) "100"3) "msg_2"4) "38"2) 1) "1719279971749-0"2) 1) "msg_3"2) "100"3) "msg_4"4) "38"
示例,检索特定范围内的消息:
localhost:0>XRANGE mystream 1719279960591-0 1719279960600-01) 1) "1719279960591-0"2) 1) "msg_1"2) "100"3) "msg_2"4) "38"
示例,限制返回的消息数量:
localhost:0>XRANGE mystream - + COUNT 11) 1) "1719279960591-0"2) 1) "msg_1"2) "100"3) "msg_2"4)
2.3 XREVRANGE
XREVRANGE 命令与 XRANGE 命令类似,但它是按照消息 ID 的递减顺序(用于反向)获取指定范围内的消息。
命令格式:
XREVRANGE key end start [COUNT count]
示例,检索最后两个时间序列的消息:
localhost:0>XREVRANGE mystream + - COUNT 21) 1) "1719279971749-0"2) 1) "msg_3"2) "100"3) "msg_4"4) "38"2) 1) "1719279960591-0"2) 1) "msg_1"2) "100"3) "msg_2"4) "38"
2.4 XDEL
XDEL 命令用于从 Stream 中删除指定的消息。返回一个整数,表示被成功删除的消息数量。
命令格式:
XDEL key ID [ID ...]
参数说明:
key:指定Stream的key。ID:一个或多个要删除的消息的ID。
注意事项:
- 在使用
XDEL命令时,你需要确保提供的消息ID是存在的,否则命令将不会删除任何消息,并返回0。 - 可以通过一次
XDEL命令删除多个消息,只需在命令中提供多个消息ID即可。 XDEL命令不会改变Stream的其他消息的顺序或ID。
示例,删除消息:
localhost:0>XDEL mystream 1719280747405-0
"1"
2.5 XLEN
XLEN 命令用于获取指定 Stream 中包含的消息数量,即流的长度。如果 Stream 不存在或为空,则返回 0 。
命令格式:
XLEN key
示例:
localhost:0>XLEN mystream
"1"
2.6 XREAD
XREAD 命令是用于从 Stream 独立消费消息,支持阻塞等待新消息的到来。返回一个数组,其中每个元素都是一个包含 Stream key 和消息列表的数组。消息列表是一个包含消息 ID 和消息数据的数组。
命令格式:
XREAD [COUNT count] [BLOCK milliseconds] STREAMS key [key ...] ID [ID ...]
参数说明:
COUNT count:指定一次读取的最大消息数量。如果未指定,则默认为1。BLOCK milliseconds:用于指定阻塞的时间(以毫秒为单位)。如果指定了此参数,并且Stream中没有可消费的消息,客户端将在指定的时间内阻塞等待。如果设置为0,则表示非阻塞模式,即如果没有消息可消费,则立即返回。STREAMS key [key ...]:指定要从中读取消息的Stream的key。可以指定一个或多个。ID [ID ...]:对于每个指定的key,可以提供一个或多个消息ID。这些ID用于指定从哪个位置开始读取消息。如果某个key后面没有指定ID,则默认为从该Stream的最新消息开始读取。
示例,非阻塞模式读取最新消息:
XREAD COUNT 1 STREAMS mystream $
示例,阻塞模式,读取最新消息并等待新消息:
XREAD COUNT 1 BLOCK 10000 STREAMS mystream $
2.7 XGROUP CREATE
XGROUP CREATE 命令用于在已存在的流(stream)上创建一个新的消费者组(consumer group)。消费者组允许多个消费者(consumer)协作消费同一个流中的数据,并且每个消费者都可以从自己的位置开始读取流。
命令格式:
XGROUP CREATE <key> <groupname> <id> [MKSTREAM] [MKTABLE] [CREATECONSUMER <consumername>]
参数说明:
<key>:流的名称。<groupname>:消费者组的名称。<id>:消费者组初始的最后一个条目ID,即消费者组开始读取的起始点。可以使用$表示流的最新条目,或者使用0表示流的起始点,或者使用任何其他有效的ID。[MKSTREAM]:可选参数,如果流不存在,则创建它。[MKTABLE]:在Redis 6.2及更高版本中引入的可选参数,用于创建与流关联的二级索引表(secondary index table)。这通常用于支持基于特定字段的查询。[CREATECONSUMER <consumername>]:在Redis 6.2及更高版本中引入的可选参数,用于在创建消费者组时同时创建一个消费者。
示例,创建一个新的消费者组,从流的最新条目开始读取:
localhost:0>XGROUP CREATE mystream mygroup $ MKSTREAM
"OK"
2.8 XACK
XACK 命令用于确消费者已经成功处理了一个或多个消息。这些消息通常是从流(Stream)中读取的,并存储在消费者组的待处理条目列表(Pending Entry List,PEL)中。通过发送 XACK 命令,消费者通知 Redis 服务器它已经完成了一个或多个消息的处理,从而将这些消息从 PEL 中移除。
命令格式:
XACK <key> <groupname> <consumername> <ID> [<ID> ...]
参数说明:
<key>:流的名称。<groupname>:消费者组的名称。<consumername>:消费者的名称。<ID>:要确认的消息的ID,可以指定一个或多个。
示例,假设消费者已经读取了一些消息,并决定它们已经被成功处理。现在,消费者想要确认这些消息:
XACK mystream mygroup myconsumer 1526569900000-0 1526569900002-0
在这个例子中,消费者确认了两个消息,它们的 ID 分别是 1526569900000-0 和 1526569900002-0。
一旦消息被确认,它们将从该消费者组的 PEL 中移除,表示这些消息已经被成功处理。注意,即使消息被确认并从 PEL 中移除,它们仍然保留在流中,并且可以被其他消费者组或消费者读取。
如果消费者在处理消息时失败,或者需要稍后重试,它可以选择不发送 XACK 命令,这样消息将保持在 PEL 中,直到消费者准备好确认它们或它们因超时而被自动从 PEL 中移除(取决于消费者组的配置)。
2.9 XPENDING
XPENDING 命令用于查询消费者组中未确认消息的详细信息。允许你查看哪些消息正在等待被处理,以及哪些消费者拥有这些消息。
命令格式:
XPENDING <key> <groupname> [start end count] [consumername]
参数说明:
<key>:流的名称。<groupname>:消费者组的名称。[start end count]:这三个参数是可选的,用于限制查询结果的范围。start:查询的开始消息ID。end:查询的结束消息ID。count:要返回的消息数量。[consumername]:可选参数,指定要查询的消费者的名称。如果不提供此参数,将返回消费者组中的所有未确认消息。
XPENDING 命令返回一个数组,其中包含以下信息:
- 总未确认消息数:整数,表示在指定范围内未确认的消息总数。
- 最小消息
ID:字符串,表示在指定范围内未确认消息的最小ID。 - 最大消息
ID:字符串,表示在指定范围内未确认消息的最大ID。 - 每个消费者的未确认消息:一个数组,其中每个元素都是一个包含消费者名称和该消费者拥有的未确认消息数的数组。
注意事项:
XPENDING是一个只读命令,它不会修改任何数据。- 如果提供了
consumername参数,则只返回该消费者的未确认消息信息。 - 如果提供了
[start end count]参数,则只返回指定范围内的未确认消息信息。 - 通过
XPENDING命令,你可以轻松地监控消费者组中的未确认消息,从而确保消息得到及时处理,并在必要时进行故障排除。
示例:
XPENDING mystream mygroup
2) "1526569900000-0" # 最小消息ID
3) "1526569900002-0" # 最大消息ID
4) 1) 1) "myconsumer" # 消费者名称 2) (integer) 2 # 该消费者拥有的未确认消息数
3. 应用场景
Redis Stream 主要用于消息队列,所以可以用来解决应用解耦,异步消息,流量削峰等问题,实现高性能,高可用,可伸缩和最终一致性架构。但是更推荐使用专业的消息队列,比如RabbitMQ、RocketMQ等,对于简单的应用场景,如果能满足需求,也可以使用Redis Stream 。
相关文章:
Redis 7.x 系列【14】数据类型之流(Stream)
有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 XADD2.2 XRANGE2.3 XREVRANGE2.4 XDEL2.5 XLEN2.6 XREAD2.7 XG…...
(四)opengl函数加载和错误处理
#include <glad/glad.h>//glad必须在glfw头文件之前包含 #include <GLFW/glfw3.h> #include <iostream>void frameBufferSizeCallbakc(GLFWwindow* window, int width, int height) {glViewport(0, 0, width, height);std::cout << width << &qu…...
RuoYi-Vue3不启动后端服务如何登陆?
RuoYi-Vue3不启动后端服务如何登陆?RuoYi-Vue3使用的前端技术栈 是:Vue3 + Element Plus + Vite。 github开源地址:https://github.com/yangzongzhuan/RuoYi-Vue3 前后的分离在线演示项目地址:https://vue.ruoyi.vip/ 这种方式是用若依提供的在线后端接口,可以在此基础上修…...
Typora(跨平台 Markdown 编辑器 )正版值得购买吗
Typora 是一款桌面 Markdown 编辑器,作为国人开发的优秀软件,一直深受用户的喜爱。 实时预览格式 Typora 是一款适配 Windows / macOS / Linux 平台的 Markdown 编辑器,编辑实时预览标记格式,所见即所得,轻巧而强大…...
springboot个人证书管理系统-计算机毕业设计源码16679
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了个人证书管理系统的开发全过程。通过分析个人证书管理系统管理的不足,创建了一个计算机管理个人证书管理系统的方案。文章介绍了个人证书管理系统的系…...
读-改-写操作
1 什么是读-改-写操作 “读-改-写”(Read-Modify-Write,简称RMW)是一种常见的操作模式,它通常用于需要更新数据的场景。 这个模式包含三个基本步骤: 1.读(Read):首先读取当前的数据…...
海外仓系统应用教程:解决了小型海外仓哪些问题
大型海外仓通过对海外仓WMS系统的使用,大大提升了业务流程的效率和利润率。这也给很多小型海外仓造成了误区,觉得海外仓系统就是为大型海外仓设计的。其实小型海外仓对海外仓系统的需求同样强烈,现在也有很多专门转对中小型海外仓设计的WMS系…...
shell 脚本编程
简介: 用户通过shell向计算机发送指令的计算机通过shell给用户返回指令的执行结果 通过shell编程可以达到的效果 提高工作效率可以实现自动化 需要学习的内容: linuxshell的语法规范 编写shell的流程 第一步:用vi/vim创建一个.sh的文件…...
gin参数验证
一. 结构体验证 用gin框架的数据验证,可以不用解析数据,减少if else。如下面的代码,如果需要增加判断条件,就需要增加if或者if else。 type MyApi struct {a intb string }func checkMyApi(val *MyApi) bool {if val.a 0 {retur…...
【web3】分享一个web入门学习平台-HackQuest
前言 一直想进入web3行业,但是没有什么途径,偶然在电鸭平台看到HackQuest的共学营,发现真的不错,并且还接触到了黑客松这种形式。 链接地址:HackQuest 平台功能 学习路径:平台有完整的学习路径ÿ…...
Sectigo或RapidSSL DV通配符SSL证书哪个性价比更高?
在当前的网络安全领域,选择一款合适的SSL证书对于保护网站和用户数据至关重要。Sectigo和RapidSSL作为市场上知名的SSL证书提供商,以其高性价比和快速的服务响应而受到市场的青睐。本文将对Sectigo和RapidSSL DV通配符证书进行深入对比,帮助用…...
金蝶云星空字段之间连续触发值更新
文章目录 金蝶云星空字段之间连续触发值更新场景说明具体需求:解决方案 金蝶云星空字段之间连续触发值更新 场景说明 字段A配置了字段B的计算公式,字段B配置了自动C的计算公式,修改A的时候,触发了B的重算,但是C触发不…...
Python 获取字典中的值(八种方法)
Python 字典(dictionary)是一种可变容器模型,可以存储任意数量的任意类型的数据。字典通常用于存储键值对,每个元素由一个键(key)和一个值(value)组成,键和值之间用冒号分隔。 以下是 Python 字典取值的几…...
Day49
Day49 代理模式proxy 概念: 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能. 代理模式分为静态代理和动态代理…...
OpenCV 车牌检测
OpenCV 车牌检测 级联分类器算法流程车牌检测相关链接 级联分类器 假设我们需要识别汽车图像中车牌的位置,利用深度学习目标检测技术可以采取基于锚框的模型,但这需要在大量图像上训练模型。 但是,级联分类器可以作为预训练文件直接使用&…...
机器学习/pytorch笔记:time2vec
1 概念部分 对于给定的标量时间概念 t,Time2Vec 的表示 t2v(t)是一个大小为 k1的向量,定义如下: 其中,t2v(t)[i]是 t2v(t)的第 i 个元素,F是一个周期性激活函数,ω和 ϕ是可学习的参数。 以下是个人理解&am…...
降低开关电源噪声的设计总结
开关电源的特征就是产生强电磁噪声,若不加严格控制,将产生极大的干扰。下面介绍的技术有助于降低开关电源噪声,能用于高灵敏度的模拟电路。 电路和器件的选择 一个关键点是保持dv/dt和di/dt在较低水平,有许多电路通过减小dv/dt和…...
rust嵌入式开发2024
老的rust embedded book 其实过时了. 正确的姿势是embassy 入手. 先说下以前rust写嵌入怎么教学小白的. 第一步,从这里 svd2rust 工具,自己生成库第二部,有了这个库,相当于就有了pac外设访问文件,然后其实就可以搞起来了. 那么为啥不好搞了. 因为太乱了. 小白喜欢你告我咋弄…...
字符串
对应练习题:力扣平台 14. 最长公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {string strs1strs[0];//初始前缀字符串for (int i 1; i < strs.size(); i) {while(strs[i].find(strs1)!0)//遍历找到共同最长前…...
mysql8 锁表与解锁
方法1不行,就按方法2来执行; (一) 解锁方法1 连接mysql ,直接执行UNLOCK TABLES,细节如下: – 查询是否锁表 SHOW OPEN TABLES WHERE in_use >0 ; – 查询进程 show processlist ; – 查询到相对应的进程…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
