【MQ篇】RabbitMQ之惰性队列!
目录
- 引言:当“生产”大于“消费”,队列就“胖”了!肥宅快乐队列?🤔
- 队列界的“躺平”大师:惰性队列(Lazy Queues)驾到!😴
- 如何“激活”你的队列的“惰性”属性?💤
- 惰性队列 vs 普通队列:实测见真章!(附代码)📊
- 惰性队列的“个性”总结:优缺点一览!📊
- 什么时候选择惰性队列?✅
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解 MQ 请看 : 【MQ篇】初识MQ!
其他优质专栏: 【🎇SpringBoot】【🎉多线程】【🎨Redis】【✨设计模式专栏(已完结)】…等
如果喜欢作者的讲解方式,可以点赞收藏加关注,你的支持就是我的动力
✨更多文章请看个人主页: 码熔burning
引言:当“生产”大于“消费”,队列就“胖”了!肥宅快乐队列?🤔
朋友们!🤝 在高并发的系统里,生产者(负责发消息的)和消费者(负责处理消息的)就像两条生产线。理想情况是生产者发得快,消费者处理得也快,消息在队列里“嗖嗖嗖”地流动,来去如风!🌪️
但现实往往是残酷的!当生产者突然“打了鸡血”,疯狂发消息,而消费者却“打起了瞌睡”,处理不过来时,麻烦就来了!消息开始在队列里堆积!就像仓库的货物越积越多,库存爆满!
这就是咱们常遇到的 “消息堆积问题”!如果队列的消息数量达到了上限,新的消息再来,老的消息就可能被无情地丢弃,甚至变成咱们之前聊的“死信”了。这可不是闹着玩的,可能导致业务数据丢失!
解决消息堆积,有啥招儿? 文件里提了两个思路:
- 多请几个工人(增加消费者): 让更多消费者并行处理消息,提高整体消费速度!这对应咱们之前说的 Work Queue(工作队列)模式。
- 把仓库扩建一下(扩大队列容积): 让队列能存下更多消息,提高它“抗压”的上限!
第一种方法是治本,提高处理能力。但有时候处理能力不是说提就能提的,或者堆积是突发的、临时的。这时候,第二种方法就很重要了——让队列能存更多的消息。
问题来了,RabbitMQ 默认的队列模式,是尽量把消息保存在内存里的!内存快是快,但金贵啊!🐏 几百万、几千万条消息都放内存里?内存条会哭的!😭 而且,当内存实在放不下时,RabbitMQ 会被迫把一部分内存中的消息“分页”到磁盘上(page-out),这个过程会影响性能,而且当消息要被消费时,又得从磁盘“换页”回内存(page-in),一来一回,性能波动大。
怎么办?有没有一种队列,它不像默认队列那么“勤快”,非要把所有消息都往内存里搬,而是更“懒”一点,收到消息就先存盘,需要时再加载呢?
队列界的“躺平”大师:惰性队列(Lazy Queues)驾到!😴
从 RabbitMQ 的 3.6.0 版本开始,引入了一个新概念——Lazy Queues,也就是惰性队列!💡 它的出现,就是为了解决大量消息堆积时,默认队列模式的内存压力和性能抖动问题!
惰性队列的特点,正如它的名字一样——“惰性”!
- 消息直接存盘,不着急进内存: 默认队列收到消息,首先往内存里塞。惰性队列收到消息,二话不说,直接“啪!”存到磁盘上!💾 内存?等等再说!
- 消费者要了才从盘里捞: 只有当消费者来拉取消息时,惰性队列才会去磁盘读取消息,然后加载到内存中发送给消费者。
- 海量消息存储能力: 既然大部分消息都在磁盘上“躺着”,那它能存储的消息数量上限就大大提高了,号称支持数百万条消息存储!📦💯
惰性队列就像一个超大的“档案馆”,平时把文件(消息)都整理好存档(磁盘),只有需要调阅(消费)时,才去档案室取出文件,放到办公桌上(内存)处理。而默认队列就像一个“仓鼠”,总想把所有东西都塞到颊囊(内存)里,满了就抓狂(page-out)。🐿️➡️🧠➡️💥
如何“激活”你的队列的“惰性”属性?💤
让一个队列变得“惰性”,方法也很简单,就是在声明队列时,给它指定一个特殊的属性:x-queue-mode
,值为 lazy
。
你可以通过多种方式来设置:
-
命令行设置(给已有队列“变身”): 如果你的队列已经运行起来了,想把它改成惰性队列,可以使用 RabbitMQ 的命令行工具
rabbitmqctl set_policy
来设置一个策略。文件里提供了示例命令:rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues
这条命令的意思是:
rabbitmqctl set_policy Lazy
:添加一个名为Lazy
的策略。"^lazy-queue$"
:这个策略应用到名字匹配正则表达式^lazy-queue$
的队列上(即名字叫lazy-queue
的队列)。'{"queue-mode":"lazy"}'
:策略的具体内容是设置queue-mode
属性为lazy
。--apply-to queues
:这个策略应用的对象是所有的队列(虽然前面已经用正则匹配了名字)。
通过这种策略方式,你可以给符合某些规则的队列批量设置属性,很方便!
-
基于
@Bean
声明队列时设置: 在 Spring Boot 中,使用@Bean
声明 Queue 时,可以通过QueueBuilder
的.lazy()
方法,或者更底层地通过withArguments
方法添加x-queue-mode
参数来设置。文件里提供了.lazy()
方法的示例:// 惰性队列 - 使用 QueueBuilder.lazy() 方法 @Bean public Queue lazyQueue(){System.out.println("🛠️ 声明一个惰性队列 lazy.queue"); // 添加日志return QueueBuilder.durable("lazy.queue") // 指定队列名称,并持久化 ✅.lazy() // ⭐ 就这一句!让队列变惰性!😴.build(); }// 也可以通过 arguments 来设置,效果一样: // @Bean // public Queue lazyQueueWithArgs(){ // Map<String, Object> args = new HashMap<>(); // args.put("x-queue-mode", "lazy"); // ⭐ 设置 x-queue-mode 为 lazy ⭐ // return new Queue("lazy.queue.with.args", true, false, false, args); // }
.lazy()
方法就是QueueBuilder
提供的一个便捷方法,底层就是帮你加了x-queue-mode: lazy
这个参数。 -
基于
@RabbitListener
声明队列时设置: 如果你习惯直接在消费者注解上声明队列,也可以通过@Queue
注解的arguments
属性来设置x-queue-mode
。文件里提供了示例:@RabbitListener(bindings = @QueueBinding(value = @Queue(name = "lazy.listener.queue", durable = "true",arguments = {@Argument(name = "x-queue-mode", value = "lazy")} // ⭐ 在这里设置惰性属性 ⭐),exchange = @Exchange(name = "listener.exchange"),key = "lazy.key" )) public void listenLazyQueueFromListener(String msg){System.out.println("👂 接收到惰性队列消息:" + msg); // 添加日志 }
惰性队列 vs 普通队列:实测见真章!(附代码)📊
这是简单的测试思路:同时声明一个惰性队列和一个普通队列,然后往它们里面大量发送消息(比如 20 万条),看看有什么区别。
首先,声明这两个队列(通常绑定到同一个交换机或使用默认交换机):
// RabbitConfig.java 中定义队列
@Bean
public Queue lazyQueue(){System.out.println("🛠️ 声明惰性队列 lazy.queue");return QueueBuilder.durable("lazy.queue").lazy() // 设置为惰性队列.build();
}@Bean
public Queue normalQueue(){System.out.println("🛠️ 声明普通队列 normal.queue");return QueueBuilder.durable("normal.queue").build(); // 默认就是普通队列
}// 你还需要一个交换机(或者使用默认交换机 ""),并把这两个队列绑定上去
// @Bean public TopicExchange testExchange() { ... }
// @Bean public Binding lazyBinding(...) { ... bind(lazyQueue).to(testExchange).with("lazy.key"); }
// @Bean public Binding normalBinding(...) { ... bind(normalQueue).to(testExchange).with("normal.key"); }
然后,编写发送大量消息的测试代码:
// 你的测试类中
@Test
public void testSendManyMsg(){System.out.println("📨 正在批量发送消息...");long startTime = System.currentTimeMillis();for (int i = 0; i < 200000; i++) { // 发送 20 万条消息CorrelationData data = new CorrelationData(UUID.randomUUID().toString());// 往惰性队列发送rabbitTemplate.convertAndSend( "","lazy.queue", "message "+i,data);// 往普通队列发送// rabbitTemplate.convertAndSend( "","normal.queue", "message "+i,data); // 如果要测普通队列,取消注释,但要注意内存和性能}long endTime = System.currentTimeMillis();System.out.println("✅ 批量发送消息完成!");System.out.println("⏱️ 消耗时间: " + (endTime - startTime) + " ms");
}
当你运行这个测试,并且 RabbitMQ 中没有消费者快速消费时,消息就会在队列里堆积。
测试现象(预期):
- 发送到普通队列: 如果发送数量巨大(比如文件里的 20 万条)且超过了内存阈值,你会观察到 RabbitMQ 的内存使用率会很高,并且可能会出现 page-out(消息从内存换到磁盘)的现象,这个过程可能导致发送速度变慢,甚至 Blocking。如果你不设置队列长度上限 (
x-max-length
),它会一直往内存/磁盘里塞,直到资源耗尽。如果设置了上限,超过上限的消息就会被丢弃。 - 发送到惰性队列: 发送过程相对稳定,RabbitMQ 的内存使用率不会像普通队列那样暴增(因为它直接存盘了),但磁盘 I/O 会比较高。理论上,在资源允许的情况下,它能接收并存储比普通队列多得多的消息,而不会因为内存不足而开始 page-out 或丢弃消息(除非磁盘满了)。
这个测试的目的就是直观地告诉你,惰性队列在处理海量消息堆积时的优势——能存,而且存得比较“平稳”!
惰性队列的“个性”总结:优缺点一览!📊
解决消息堆积的方案:
- 增加更多消费者,提高消费速度(治本)。
- 使用惰性队列,提高队列的容积上限,能存更多消息(治标,但很重要!)。
惰性队列的优点(为啥要用它?):
- 基于磁盘存储,消息上限高: 这是它最突出的优点!能应对可怕的消息堆积,存下数百万条消息而不崩。📦💯
- 没有间歇性的 page-out,性能比较稳定: 默认队列在内存不足时换页操作会带来性能波动。惰性队列一开始就存盘,避免了这种不稳定的换页过程。📊
惰性队列的缺点(啥时候不适合?):
- 基于磁盘存储,消息时效性会降低: 从磁盘读消息比从内存慢是肯定的。如果你的业务对消息的“新鲜度”要求极高,需要消息一到就被秒级甚至毫秒级处理,那么惰性队列可能不是最佳选择。⏰
- 性能受限于磁盘的 IO: 既然消息主要在磁盘,那队列的吞吐量和延迟就很大程度上取决于你的磁盘性能(SSD 肯定比机械硬盘强)。如果你的磁盘 IO 是瓶颈,惰性队列的性能也会受影响。🐌
什么时候选择惰性队列?✅
- 预期会有大量消息堆积的场景: 这是惰性队列最适合发挥作用的时候,比如秒杀系统、日志收集、大数据量同步等。
- 对消息时效性要求不是极致苛刻的场景: 允许消息在队列里稍微多待几十毫秒甚至几百毫秒。
- 希望避免默认队列在内存满时带来的性能不稳定性。
如果你需要构建一个能“吞吐”海量消息,即使消费者处理不过来也能稳定存储,不丢消息(在磁盘空间允许前提下)的系统,那么惰性队列绝对是你应该考虑的利器!它不像默认队列那样“拼命”往内存里挤,而是选择一种更“躺平”、更稳健的方式来应对消息洪流!😴👍
希望这篇关于惰性队列的详细解析,能让你彻底理解它的“惰性”哲学和实际用途!如果你的系统正饱受消息堆积之苦,不妨试试这位“躺平”大师,也许会有意想不到的效果!🎉
了解RabbitMQ消息不丢的“三板斧”请看:
【MQ篇】RabbitMQ的生产者消息确认实战!
【MQ篇】RabbitMQ之消息持久化!
【MQ篇】RabbitMQ的消费者确认机制实战!
了解RabbitMQ消息失败重试请看:
【MQ篇】RabbitMQ之消费失败重试!
了解RabbitMQ死信交换机请看:
【MQ篇】RabbitMQ之死信交换机!
相关文章:
【MQ篇】RabbitMQ之惰性队列!
目录 引言:当“生产”大于“消费”,队列就“胖”了!肥宅快乐队列?🤔队列界的“躺平”大师:惰性队列(Lazy Queues)驾到!😴如何“激活”你的队列的“惰性”属性…...
计算机视觉——通过 OWL-ViT 实现开放词汇对象检测
介绍 传统的对象检测模型大多是封闭词汇类型,只能识别有限的固定类别。增加新的类别需要大量的注释数据。然而,现实世界中的物体类别几乎无穷无尽,这就需要能够检测未知类别的开放式词汇类型。对比学习(Contrastive Learning&…...
第二部分:网页的妆容 —— CSS(下)
目录 6 布局基础:Display 与 Position - 元素如何排列和定位6.1 小例子6.2 练习 7 Flexbox 弹性布局:一维布局利器7.1 小例子7.2 练习 8 Grid 网格布局:强大的二维布局系统8.1 小例子8.2 练习 9 响应式设计与媒体查询:适应不同设备…...
vite项目tailwindcss4的使用
1、安装taillandcss 前几天接手了一个项目,看到别人用tailwindcss节省了很多css代码的编写,所以自己也想在公司项目中接入tailwindcss。 官网教程如下: Installing Tailwind CSS with Vite - Tailwind CSS 然而,我在vite中按…...
css中:is和:where 伪函数
在 CSS 里,:is() 属于伪类函数,其作用是对一组选择器进行匹配,只要元素与其中任何一个选择器相匹配,就可以应用对应的样式规则。以下是详细介绍: 基本语法 :is() 函数的参数是一个或多个选择器,各个选择器之…...
线下零售数据采集:在精度与效率之间寻找平衡点
线下零售数据采集:在精度与效率之间寻找平衡点 为什么线下零售必须重视数据采集? 随着零售行业竞争加剧,门店执行的标准化与透明化成为供应链协作、销售提升的基础工作。 POG(陈列执行规范)的落地效果、陈列策略的调整…...
【Robocorp实战指南】Python驱动的开源RPA框架
目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心代码实现案例1:网页数据抓取案例2:Excel报表生成 运行结果验证 三、性能对比测试方…...
新ubuntu物理机开启ipv6让外网访问
Ubuntu 物理机 SSH 远程连接与 IPv6 外网访问测试指南 1. 通过 SSH 远程连接 Ubuntu 物理机 1.1 安装 SSH 服务 sudo apt update sudo apt install openssh-server1.2 检查 SSH 服务状态 sudo systemctl status ssh确认出现 active (running)。 1.3 获取物理机 IP 地址 i…...
驱动开发硬核特训 │ Regulator 子系统全解
一、Regulator子系统概述 在 Linux 内核中,Regulator 子系统是专门用于管理电源开关、电压调整、电流控制的一套完整框架。 它主要解决以下问题: 设备需要的电压通常不一样,如何动态调整?有些设备休眠时需要关闭供电࿰…...
入门版 鸿蒙 组件导航 (Navigation)
入门版 鸿蒙 组件导航 (Navigation) 注意:使用 DevEco Studio 运行本案例,要使用模拟器,千万不要用预览器,预览器看看 Navigation 布局还是可以的 效果:点击首页(Index)跳转到页面(…...
怎样将visual studio 2015开发的项目 保存为2010版本使用
用的老旧电脑跑vs2015太慢了,实在忍不了了! 想把用 Visual Studio 2015 的做的项目保存为 Visual Studio 2010 兼容的格式,以后都使用2010写了。自己在网上搜了一下,亲测以下步骤可以的 手动修改解决方案和项目文件 修改解决方案…...
【学习笔记】软件测试流程-测试设计阶段
软件测试设计阶段这个阶段主要工作是编写测试用例。 什么是测试用例? 测试用例(TestCase)是为项目需求而编制的一组测试输入、执行条件以及预期结果,以便测试某个程序是否满足客户需求。简而言之,测试用例是每一个测…...
Rust 学习笔记:关于切片的两个练习题
Rust 学习笔记:关于切片的两个练习题 Rust 学习笔记:关于切片的两个练习题引用和切片引用的大小以下程序能否通过编译? Rust 学习笔记:关于切片的两个练习题 参考视频: https://www.bilibili.com/video/BV1GrDQYeEzS…...
BeeWorks企业内部即时通讯软件支持国产化,已在鸿蒙系统上稳定运行
一、企业用户面临的困境与痛点 一些企业用的即时通讯软件比较旧,存在的问题不仅影响了日常工作的正常开展,也阻碍了企业信息化建设的进程: ● 国产系统与移动端不兼容:仅支持Windows和MAC系统,无法在银河麒麟、统信U…...
java对文字按照语义切分
实现目标 把一段文本按照一个完整的一句话为单元进行切分。如:以逗号,感叹号结尾看作是一个句子。 实现方案 StanfordCoreNLP切分 引入依赖 <dependency><groupId>edu.stanford.nlp</groupId><artifactId>stanford-corenlp<…...
华纳云:centos如何实现JSP页面的动态加载
JSP(JavaServer Pages)作为Java生态中常用的服务器端网页技术,具有动态内容生成、可扩展性强、与Java无缝结合等优势。 而CentOS作为一款稳定、高效、安全的Linux服务器操作系统,非常适合部署JSP应用。 想要让JSP页面实现动态更新加载,避免…...
Android 消息队列之MQTT的使用(二):会话+消息过期机制,设备远程控制,批量控制实现
目录 一、实际应用场景 室内温湿度数据上传设备远程控制批量控制实现 二、会话管理、消息过期设置 4.1 会话管理 Clean Session参数 新旧会话模式对比典型应用场景 4.2 消息过期设置 MQTT 5.0消息过期机制 Message Expiry Interval属性QoS级别影响 三、实际应用场景 …...
一、JVM基础概念
一、JVM的设计目标 一次编译,到处运行(跨平台) ➔ Java编译成字节码,由JVM在不同平台解释/编译执行,实现跨平台。 内存管理与垃圾回收 ➔ JVM统一负责内存分配和回收,降低内存泄漏的风险。 性能优化 ➔ JIT(即时编译…...
深度学习---Pytorch概览
一、PyTorch 是什么? 1. 定义与定位 开源深度学习框架:由 Facebook(Meta)AI 实验室开发,基于 Lua 语言的 Torch 框架重构,2017 年正式开源,主打动态计算图和易用性。核心优势:灵活…...
第33周JavaSpringCloud微服务 分布式综合应用
第33周JavaSpringCloud微服务 分布式综合应用 一、分布式综合应用概述 分布式知识体系内容广泛,主要包括分布式事务、分布式锁、RabbitMQ等消息中间件的应用以及跨域问题的解决。 1.1 课程重点内容介绍 分布式事务 :在大型项目中普遍存在,…...
Paramiko 完全指南
目录 Paramiko 概述核心功能与模块框架安装与依赖基础用法与案例详解 SSH 连接与命令执行密钥认证SFTP 文件传输交互式会话端口转发 高级功能与实战技巧常见问题与解决方案总结与资源推荐 1. Paramiko 概述 是什么? Paramiko 是一个纯 Python 实现的 SSHv2 协议库…...
夜莺监控V8(Nightingale)二进制部署教程(保姆级)
夜莺监控部署 前置工作 1. 部署好mysql 2. 部署好redis 3. 部署好prometheus夜莺压缩包下载 本教程基于Centos7系统下的二进制方式部署,先去官网进行压缩包下载 在系统创建/opt/n9etest目录,并将压缩包拖进目录 mkdir /opt/n9etest进入/opt/n9etest࿰…...
鸿蒙应用开发 知识点 官网快速定位表
ArkTS 语言介绍 ArkTS 语言介绍 基础入门 资源分类与访问 添加组件(基础组件) 显示图片 (Image) 按钮 (Button) 单选框 (Radio) 切换按钮 (Toggle) 进度条 (Progress) 视频播放 (Video) 使用文本 文本显示 (Text/Span) 文本输入 (TextInput/TextArea) 使用弹窗 使用弹…...
【神经网络与深度学习】两种加载 pickle 文件方式(joblib、pickle)的差异
引言 从深度学习应用到数据分析的多元化需求出发,Python 提供了丰富的工具和模块,其中 pickle 和 joblib 两种方式在加载数据文件方面表现尤为突出。不同场景对性能、兼容性以及后续处理的要求不尽相同,使得这两种方式各显优势。本文将通过深…...
quickbi finebi 测评(案例讲解)
quickbi & finebi 测评 国产BI中入门门槛比较低的有两个,分别是quickbi和finebi。根据我的经验通过这篇文章做一个关于这两款BI的测评文章。 quickbi分为个人版、高级版、专业版、私有化部署四种。这篇文章以quickbi高级版为例,对quickbi进行分享。…...
vue的生命周期 以及钩子
最早可以在created 时调用后端接口获取数据,因为beforecreated的时候 那个data 都还还是初始化出来 修改数据的时候触发 update 案例1:create 案例2:一进来页面获取搜索框焦点 echarts 饼图渲染 初始化dom后才去准备实例,所以必须要在dom之后…...
Mariadb 防火墙服务器和端口:mysql | 3306
Centos7 Mariadb 理解:Mariadb数据库就类似于我们生活中常见的Excel。 主要工作原理就是我们创造一个数据库其中创造一个数据表再在数据表中输入内容,分为三类。在详细点就是打开Excel(数据库),我们在其中加入…...
爬虫学习笔记(二)--web请求过程
Web请求全过程(重要) 从输入完网址(如输入百度网址)到返回页面以及页面中的数据这一完整的过程发生了什么事情? 服务器端渲染 在服务器端直接把数据和html整合,统一返回给浏览器,在页面源代码…...
开发vue项目所需要安装的依赖包
在开发Vue项目时,通常需要安装以下几个核心依赖包:1、Vue CLI、2、Vue Router、3、Vuex、4、Axios。这些依赖包可以确保你的Vue项目拥有基础的功能和良好的开发体验。接下来,我们将详细介绍每个依赖包的作用、安装方法以及使用案例。 一、VUE…...
Java SE(4)——方法详解
1.方法的概念&使用 1.1 什么是方法? Java中的方法类似于C语言中的函数,是用于执行特定任务的代码块。 那么用方法组织起来的代码块和普通的代码相比有什么优势呢? 1.当代码规模较大且应用场景较为复杂时,方法能够模块化地组…...
网络安全实战指南:从安全巡检到权限维持的应急响应与木马查杀全(命令查收表)
目录 一、安全巡检的具体内容 1. 巡检的频率与目标是什么 2. 巡检的内容是什么以及巡检后如何加固 二、Windows环境下应急响应的主要流程 1. 流程概述及每个步骤详细解释 步骤1:隔离与遏制 步骤2:识别与分析 步骤3:清除与恢复 步骤4…...
Infrared Finance:Berachain 生态的流动性支柱
在加密市场中,用户除了参与一级和二级交易,还有一种低门槛参与的就是空投。从 2021 年 DeFi 成为主流开始,空投一直都是“以小搏大”的机会,通过参与项目早期的链上交互和任务以获取空投奖励,近几年已成为一种广受欢迎…...
Hadoop和Spark大数据挖掘与实战
1.概述 本节将系统讲解大数据分析的完整流程,包括数据采集、预处理、存储管理、分析挖掘与结果可视化等核心环节。与此同时,我们还将对主流数据分析工具进行横向对比,帮助读者根据实际需求选用最合适的工具,提升数据价值挖掘的效…...
TCP vs UDP:核心区别、握手过程与应用场景(附对比图)
🌐 引言 在网络通信中,TCP(传输控制协议)和UDP(用户数据报协议)是两大核心传输层协议。它们各有优劣,适用于不同场景。本文将用图文对比实战示例,帮你彻底理解两者的区别࿰…...
人工智能-深度学习之多层感知器
深度学习 任务任务1任务2任务3 机器学习的弊端多层感知器 (MLP/人工神经网络)MLP实现非线性分类Keras介绍与实战准备Keras or TensorflowKeras建立MLP模型 实战(1): 建立MLP实现非线性二分类实战(2): MLP实…...
Improving Deep Learning For Airbnb Search
解决问题 问题1: 解决推荐酒店与用户实际预定酒店价格存在偏差问题,实际预定比推荐要更便宜: 所以问题为是否更低价格的list更倾向于用户偏好,应该被优先推荐? 1. 该文通过数据分析与模型演进,将模型改造为item sco…...
多模态大型模型,实现以人为中心的精细视频理解
大家看完觉得有帮助记得点赞和关注!!! 抽象 精细理解视频中人类的动作和姿势对于以人为中心的 AI 应用程序至关重要。在这项工作中,我们介绍了 ActionArt,这是一个细粒度的视频字幕数据集,旨在推进以人为中…...
向量数据库Milvus的部署与使用
Milvus介绍 Milvus是一个开源、高性能、高扩展性的向量数据库,Milvus可以用来存储文本、图像、音频等非结构化数据,本质上是用Embeddings将非结构化数据转换成能够捕捉其基本特征的数字向量,然后将这些向量存储在向量数据库中,从…...
1.文档搜索软件Everything 的使用介绍
Everything 是 Windows 文件搜索的效率天花板,通过灵活语法和极速响应,彻底告别「找文件焦虑」。 定位:一款专注于 极速文件名搜索 的 Windows 工具,免费且轻量(安装包仅几 MB)。 核心优势…...
2025系统架构师---论企业集成平台的技术与应用
摘要 本文探讨了企业集成平台的技术与应用,以某商业银行开发的绩效考核平台系统为例,分析了企业集成平台的基本功能及关键技术,并详细阐述了在表示集成、数据集成、控制集成和业务流程集成方面的应用和实施方式。通过异构系统之间的集成,绩效考核平台与其他系统实现了有机…...
STM32Cubemx-H7-16-FreeRTOS-1-创建工程,实现两个灯的基本亮灭
前言 裸机也是开发到一半快要结束了,接下来开始上操作系统,然后先能使用基本的,后面再讲理论。 Cubemx创建工程 基本打开生成就不说了,直接从界面开始 从这里开始吧 1.首先开启外部高速晶振 2.先这样选择 选择HSE时钟环ÿ…...
深入浅出限流算法(二):更平滑的滑动窗口
好的,接续上一篇关于固定窗口计数器的讨论,我们现在来看看它的改进版——滑动窗口算法,它旨在解决固定窗口那个恼人的“临界突变”问题。 在上一篇文章中,我们探讨了最简单的固定窗口计数器限流算法,并指出了它最大的缺…...
纷析云开源财务软件:基于Spring Boot的轻量化财务中台实践
一、技术架构与核心设计 全栈开源技术栈 后端框架:基于Spring Boot 3.x构建,集成MyBatis-Plus作为ORM层,支持JDK 17特性(如虚拟线程并发处理),确保高吞吐与稳定性。 前端框架:采用Vue 3 TypeS…...
软考-软件设计师中级备考 5、数据结构 树和二叉树
1、树的基本概念 节点的度:节点拥有的子树数目。例如,若一个节点有 3 棵子树,其度为 3。树的度:树中节点的最大度数。如树中所有节点的度最大为 4,则树的度是 4。叶子节点:度为 0 的节点,也…...
php 需要学会哪些技术栈,掌握哪些框架
作为一个「野生」程序员,我的学习过程比较急功近利。 我记得自己写的第一个 PHP 程序是留言本。一上来对 PHP 一窍不通,所以直接去网上找了个留言本的源码,下载下来后先想办法让它在自己电脑上运行起来。通过这个过程掌握了 PHP 开发环境的搭…...
短视频矩阵系统贴牌批量剪辑功能开发,支持OEM
一、引言 在短视频行业蓬勃发展的当下,短视频矩阵运营已成为企业和个人实现品牌推广、流量增长的重要策略。然而,面对大量的视频素材和多个运营账号,传统的单个视频剪辑、发布方式效率极低,难以满足矩阵运营的需求。为了提高内容…...
【Java EE初阶】多线程(二)
1.在图中代码,我们调用了start方法,真正让系统调用api创建了一个新线程,而在这个线程跑起来之后,就会自动执行到run。调用start方法动作本身速度非常快,一旦执行,代码就会立即往下走,不会产生任…...
分布式链路追踪理论
基本概念 分布式调用链标准-openTracing Span-节点组成跟踪树结构 有一些特定的变量,SpanName SpanId traceId spanParentId Trace(追踪):代表一个完整的请求流程(如用户下单),由多个Span组成…...
conda和bash主环境的清理
好的!要管理和清理 Conda(或 Bash)安装的包,可以按照以下步骤进行,避免冗余依赖,节省磁盘空间。 📌 1. 查看已安装的包 先列出当前环境的所有安装包,找出哪些可能需要清理ÿ…...
Linux系统管理与编程14:Shell变量及定制bash登录界面
兰生幽谷,不为莫服而不芳; 君子行义,不为莫知而止休。 1.准备工作 创建用户wu useradd wu passwd wu 修改权限 chmod uw /etc/sudoers 编辑 visudo 在root行下,添加:“wu ALL……” 图14- 1 恢复文件权限并…...