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

从一个事故中理解 Redis(几乎)所有知识点

从一个事故中理解Redis(几乎)所有知识点

作者:看破

一、简单回顾

事故回溯总结一句话:

(1)因为大 KEY 调用量,随着白天自然流量趋势增长而增长,最终在业务高峰最高点期占满带宽使用 100%。





(2)从而引发 redis 的内存使用率,在 5min 之内从 0%->100%。





(3)最终全面 GET SET timeout 崩溃(11 点 22 分 02 秒)。







(4)最终导致页面返回 timeout。

未解之谜

疑问点:内存使用率 100% 就等同于 redis 不可用吗?

解答:正常使用情况下,不是。

redis 有【缓存淘汰机制】,Redis 在内存使用率达到 100% 时不会直接崩溃。相反,它依赖内存淘汰策略来释放内存,确保系统的稳定性。





学习更多:24 替换策略:缓存满了怎么办?

24 | 替换策略:缓存满了怎么办?-Redis核心技术与实战-极客时间

这个配置在哪里?





大部分同学都是不会主动去调整这里的参数的。

因此大概率默认的是:volatile-lru

  • 行为:使用 LRU(Least Recently Used,最近最少使用)算法驱逐键。volatile-lru 仅驱逐设有过期时间的键,allkeys-lru 则驱逐所有键。

  • 适用场景:缓存场景,不介意丢失一些数据。

确保你根据实际需求配置适当的内存淘汰策略,以便在内存达到上限时,系统能够稳定地处理新请求,而不会出现写操作失败的情况(只要不是 noeviction)。

也就是说,照理 SET GET 都应该没啥问题才对(先不考虑其他复杂命令)。

  • 尽管 Redis 本身不会轻易崩溃,但如果内存耗尽且没有淘汰策略或者淘汰策略未能生效,Redis 可能拒绝新的写操作,并返回错误:OOM command not allowed when used memory > 'maxmemory'

  • 如果系统的配置或者操作系统的内存管理不当,可能会导致 Redis 进程被操作系统杀死。

疑问点:但是事故现象就是:内存使用率 100% 时,redis 不可用,怎么解释?

猜测 1:会是淘汰不及时导致的性能瓶颈吗?

也就是说:写入的速度>>淘汰的速度。

解答:如果是正常的业务写入,不可能!

  • redis 纯内存,淘汰速度是非常快的;

  • 这个业务特性,也并非高频写入;

这个 redis 实例其实里面存储的 KEY 很少,最终占了整个实例的内存使用率<5%。





不太符合正常使用下 KEY 不断增多,最终挤爆内存使用率的问题。

因此,初步结论:Redis 的崩溃一般不会是由于单纯写入速度超过淘汰速度引起的,尤其是使用了合理的内存淘汰策略时;如果写入速度非常高,而淘汰策略无法及时清除旧数据,Redis 可能会非常频繁地进行键的查找和淘汰操作,从而导致性能下降。

18 波动的响应延迟:如何应对变慢的 Redis?(上)

18 | 波动的响应延迟:如何应对变慢的Redis?(上)-Redis核心技术与实战-极客时间

具体机制如下:

过期 key 的自动删除机制。它是 Redis 用来回收内存空间的常用机制,应用广泛,本身就会引起 Redis 操作阻塞,导致性能变慢,所以,你必须要知道该机制对性能的影响。

Redis 键值对的 key 可以设置过期时间。默认情况下,Redis 每 100 毫秒会删除一些过期 key,具体的算法如下:

1.采样:

ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 个数的 key,并将其中过期的 key 全部删除;

2.如果超过 25% 的 key 过期了,则重复删除的过程,直到过期 key 的比例降至 25% 以下。

ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 是 Redis 的一个参数,默认是 20,那么,一秒内基本有 200 个过期 key 会被删除。这一策略对清除过期 key、释放内存空间很有帮助。如果每秒钟删除 200 个过期 key,并不会对 Redis 造成太大影响。

但是,如果触发了上面这个算法的第二条,Redis 就会一直删除以释放内存空间。注意,删除操作是阻塞的(Redis 4.0 后可以用异步线程机制来减少阻塞影响)。所以,一旦该条件触发,Redis 的线程就会一直执行删除,这样一来,就没办法正常服务其他的键值操作了,就会进一步引起其他键值操作的延迟增加,Redis 就会变慢。

那么,算法的第二条是怎么被触发的呢?其中一个重要来源,就是频繁使用带有相同时间参数的 EXPIREAT 命令设置过期 key,这就会导致,在同一秒内有大量的 key 同时过期。

可以类比 JVM 频繁 GC 造成的性能影响。



猜测 2:那就是写入太凶猛,且是【非正常业务写入】

那到底是什么导致了内存使用率激增呢??



蛛丝马迹

如何解决 Redis 内存使用率突然升高:

https://help.aliyun.com/zh/redis/support/how-to-solve-the-sudden-increase-in-redis-memory-usage?spm=a2c4g.11186623.0.i12



因此查阅了资料,发现最为贴近的答案。





证据支撑



真相大白

果然是这样,说明内存是被【缓冲区】挤爆的。

21 缓冲区:一个可能引发“惨案”的地方:

21 | 缓冲区:一个可能引发“惨案”的地方-Redis核心技术与实战-极客时间

知识点:Redis 的内存占用组成



使用 info memory 进行分析(我随便模拟了一个缓冲区溢出的 case,并非事故现场,因为当时不会)。

# Memoryused_memory:1072693248used_memory_human:1023.99Mused_memory_rss:1090519040used_memory_rss_human:1.02Gused_memory_peak:1072693248used_memory_peak_human:1023.99Mused_memory_peak_perc:100.00%used_memory_overhead:1048576000used_memory_startup:1024000used_memory_dataset:23929848used_memory_dataset_perc:2.23%allocator_allocated:1072693248allocator_active:1090519040allocator_resident:1090519040total_system_memory:16777216000total_system_memory_human:16.00Gused_memory_lua:37888used_memory_lua_human:37.89Kused_memory_scripts:1024000used_memory_scripts_human:1.00Mmaxmemory:1073741824maxmemory_human:1.00Gmaxmemory_policy:noevictionallocator_frag_ratio:1.02allocator_frag_bytes:17825792allocator_rss_ratio:1.00allocator_rss_bytes:0rss_overhead_ratio:1.00rss_overhead_bytes:0mem_fragmentation_ratio:1.02mem_fragmentation_bytes:17825792mem_not_counted_for_evict:0mem_replication_backlog:0mem_clients_slaves:0mem_clients_normal:1048576000mem_aof_buffer:0mem_allocator:jemalloc-5.1.0active_defrag_running:0lazyfree_pending_objects:0:1072693248used_memory_human:1023.99Mused_memory_rss:1090519040used_memory_rss_human:1.02Gused_memory_peak:1072693248used_memory_peak_human:1023.99Mused_memory_peak_perc:100.00%used_memory_overhead:1048576000used_memory_startup:1024000used_memory_dataset:23929848used_memory_dataset_perc:2.23%allocator_allocated:1072693248allocator_active:1090519040allocator_resident:1090519040total_system_memory:16777216000total_system_memory_human:16.00Gused_memory_lua:37888used_memory_lua_human:37.89Kused_memory_scripts:1024000used_memory_scripts_human:1.00Mmaxmemory:1073741824maxmemory_human:1.00Gmaxmemory_policy:noevictionallocator_frag_ratio:1.02allocator_frag_bytes:17825792allocator_rss_ratio:1.00allocator_rss_bytes:0rss_overhead_ratio:1.00rss_overhead_bytes:0mem_fragmentation_ratio:1.02mem_fragmentation_bytes:17825792mem_not_counted_for_evict:0mem_replication_backlog:0mem_clients_slaves:0mem_clients_normal:1048576000mem_aof_buffer:0mem_allocator:jemalloc-5.1.0active_defrag_running:0lazyfree_pending_objects:0

分析和解释

从上面的 INFO memory 输出中,我们可以看到一些关键信息,这些信息表明大部分内存被缓冲区占用殆尽:

1.内存使用情况:

  • used_memory: 1072693248 (1.02 GB)

  • maxmemory: 1073741824 (1.00 GB)

上面的输出表明,当前内存使用几乎达到了配置的最大内存限制,内存已接近耗尽。

2.缓冲区占用:

  • used_memory_overhead: 1048576000 (1.00 GB)

这个值表示 Redis 开销的内存,包括缓冲区、连接和其他元数据。在这种情况下,大部分 used_memory (1.02 GB) 被 used_memory_overhead (1.00 GB) 占用,这意味着大部分内存都被缓冲区等开销占据。

3.数据集占用:

  • used_memory_dataset: 23929848 (23.93 MB)

  • used_memory_dataset_perc: 2.23%

这里显示,实际存储的数据只占了非常少的一部分内存(约 23.93 MB),而绝大部分内存被缓冲区占据。

4.客户端缓冲区:

  • mem_clients_normal: 1048576000 (1.00 GB)

这表明普通客户端连接占用了约 1.00 GB 内存,这通常意味着输出缓冲区可能已经接近或达到了设定的限制。

5.内存碎片:

  • allocator_frag_ratio: 1.02

  • mem_fragmentation_ratio: 1.02

碎片率不高,表明内存被合理使用但被缓冲区占用过多。



总结

从上面的例子可以看出,Redis 的内存几乎被缓冲区占用殆尽。以下是具体的结论:

  • 当前内存使用 (used_memory) 已经接近最大内存限制 (maxmemory),即 1.02 GB 接近 1.00 GB 的限制。

  • 内存开销 (used_memory_overhead) 很大,主要被客户端普通连接使用(可能是输出缓冲区),而实际的数据仅占用了很少的内存。

  • 分配器和 RSS 碎片率 (allocator_frag_ratio 和 mem_fragmentation_ratio) 较低,表明碎片不是问题。

缓冲内存的理论最大值推导

为什么要有缓冲区

Redis 工作原理-单客户端视角简单版:





Redis 工作原理-单客户端视角复杂版:





缓冲区的功能其实很简单,主要就是用一块内存空间来暂时存放命令数据,以免出现因为数据和命令的处理速度慢于发送速度而导致的数据丢失和性能问题。

因此,Redis 工作原理-多客户端视角简单版(含缓冲区)。





输入缓冲区

定义







内存占用





输出缓冲区

定义





内存占用

Redis Server 的输出大小通常是不可控制的。存在 bigkey 的时候,就会产生体积庞大的返回数据。另外也有可能因为执行了太多命令,导致产生返回数据的速率超过了往客户端发送的速率,导致服务器堆积大量消息,从而导致输出缓冲区越来越大,占用过多内存,甚至导致系统崩溃。Redis 通过设置 client-output-buffer-limit 来保护系统安全。





不出意外,默认是:32MB 8MB 60s





对于 Pub/Sub 连接:

  • 硬限制:每个 Pub/Sub 客户端连接的输出缓冲区最大可以达到 32MB 。

  • 连接池最大连接数:300 个连接,其中所有连接假设都在处理 Pub/Sub 消息且达到了最大缓冲区限制。

故理论上,最大输出缓冲区可以达到:

最大输出缓冲区占用=硬限制×连接池最大连接数最大输出缓冲区占用=硬限制×连接池最大连接数=32MB×300=9600MB=9.375GB

因此,在这种配置下,所有 Pub/Sub 连接的输出缓冲区理论上的最大占用内存为 9.375 GB。



因此,在 client-output-buffer-limit 是默认的情况下,最大占用内存为 9.375 GB。

所以,MAX(输出缓冲区+输入缓冲区)是否会造成内存使用率 100%?

当然!







MAX(输出缓冲区+输入缓冲区)=10.375GB >> 一个实例的内存规格(在本 case 中,是 2G)



最后的效果就是:

对象存储的部分因为是有过期时间的,过期了自然被清理了。

  • 【缓冲内存】↑ (涌入)

  • 【对象内存】↓ (定时清理)

  • 并受 MAX 内存掣肘(上限)

最终的结局:Redis 的内存完全被缓冲区占据。

自然,每当有 SET 请求进来的时候,SET 不进来——因为「内存淘汰策略」(maxmemory-policy) 淘汰的是【对象内存】,压根起不到作用!!!

结论:

Redis 的内存完全被缓冲区占据,实际上 Redis 将无法正常工作,包括数据存储(SET 操作)和数据读取(GET 操作)。

分析:为何缓冲区激增(Redis 不可用的时间点 11:22:02,之前都发生了什么)

知道了缓冲区挤爆 Redis 内存会导致 Redis 不工作之后,接下来就是分析为何当时出现了缓冲区激增并最终导致 redis 不可用。

实例信息





相关代码



案件还原

1.自然增长导致流出带宽不断变大直至 96MB/s。





2.流出带宽超过 96MB/s,输出缓冲区内存占用激增甚至溢出 (300setMaxTotal*10 机器 ip 数量个客户端,之前推导过可以到 9G)。





3.导致输出缓冲区爆了,redis 客户端连接不得不关闭。

4.客户端连接关闭后,导致请求都走 DB。

5.DB 走完之后都会执行 SET。

6.SET 流量飙升,且因都是大 KEY,导致流入带宽激增(别看写 QPS 只有 50,但是如果每个写都是 2MB,就可以做到瞬间占满流入带宽)。







7.Redis 主线程模型,处理请求的速度过慢(大 KEY),出现了间歇性阻塞,无法及时处理正常发送的请求,导致客户端发送的请求在输入缓冲区越积越多。

8.输入缓冲区内存随即激增。





9.最终,redis 内存被缓冲区内存(输入、输出)完全侵占。

10.后续的 SET GET 命令甚至都进不了输入缓冲区,阻塞持续到客户端配置的 SoTimeout 时间;但是流入流出带宽依然占据并持续,总带宽到达了 216MB/s > 实例最大带宽 192MB/s。







11.造成最终的不可用(后续的命令想进场,要依赖当前输入缓冲区里的命令被执行给你腾出来位置,但是还是那句话 Redis 主线程处理消化的速度,实在是太慢了;从图中,可以看到 Redis 的 QPS 骤降。







11:35 分之后,我把 redis 降级了,全使用 db 来抗流量。



二、开发运维规范

可以看到 Redis 的性能是有边界的,不能盲目相信所谓的高性能。

真正理解性能须使用 benchmark。





它也是有问题能造成他的性能瓶颈的。





在上述的事故中,就占了【网络资源消耗高】【存储资源消耗高】两大问题。

因此也到了本文的方法论环节:从业务部署、Key 的设计、SDK、命令、运维管理等维度展示云数据库 Redis 开发运维规范:

  • 业务部署规范:https://help.aliyun.com/zh/redis/use-cases/development-and-o-and-m-standards-for-apsaradb-for-redis

  • Key 设计规范:https://help.aliyun.com/zh/redis/use-cases/development-and-o-and-m-standards-for-apsaradb-for-redis

  • SDK 使用规范:https://help.aliyun.com/zh/redis/use-cases/development-and-o-and-m-standards-for-apsaradb-for-redis

  • 命令使用规范:https://help.aliyun.com/zh/redis/use-cases/development-and-o-and-m-standards-for-apsaradb-for-redis

  • 运维管理规范:https://help.aliyun.com/zh/redis/use-cases/development-and-o-and-m-standards-for-apsaradb-for-redis

业务部署规范

Key 设计规范

SDK 使用规范

命令使用规范

运维管理规范

三、重点行动项

大 KEY

大 KEY 其实并不是长度过长的 KEY,而是存放了慢查询命令的 KEY。

对于 String 类型,慢查询的本质在于 value 的大小。

对于其他类型,慢查询的本质在于集合的大小(时间复杂度带来)。







如何找到大 key?

阿里云:发现并处理 Redis 的大 Key 和热 Key:

https://help.aliyun.com/zh/redis/user-guide/identify-and-handle-large-keys-and-hotkeys?spm=a2c4g.11186623.0.i1

如何解决大 key?

其实就是一个字 "拆"。

1.对于字符串类型的 key,我们通常要在业务层面将 value 的大小控制在 10KB 左右,如果 value 确实很大,可以考虑采用序列化算法和压缩算法来处理,推荐常用的几种序列化算法:Protostuff、Kryo 或者 Fst。

2.对于集合类型的 key,我们通常要通过控制集合内元素数量来避免 bigKey,通常的做法是将一个大的集合类型的 key 拆分成若干小集合类型的 key 来达到目的。

压测关注点

1.数据是否倾斜(不能只看聚合信息,要切换到分片上,看数据节点);

2.是否有大 key、热 key;

a.压测过程中关注(1)CloudDBA-实时 TOP KEY 统计(2)CloudDBA-慢请求;

b.压测后(1)CloudDBA-离线全量 KEY 分析(2)CloudDBA-诊断报告,做到分析报告时间覆盖压测时段;

3.CPU 使用率、内存使用率、带宽使用率变化趋势(流入、流出都要看,最好看一个缓存周期);

4.如果可以,打开审计日志,看写入日志是否符合代码逻辑。

常用运维命令

出线上事故的时候,用于快速分析和保留现场。

CLIENT LIST



info memory

MEMORY USAGE

相关文章:

从一个事故中理解 Redis(几乎)所有知识点

作者&#xff1a;看破 一、简单回顾 事故回溯总结一句话&#xff1a; &#xff08;1&#xff09;因为大 KEY 调用量&#xff0c;随着白天自然流量趋势增长而增长&#xff0c;最终在业务高峰最高点期占满带宽使用 100%。 &#xfeff; &#xfeff; &#xff08;2&#xff…...

MySQL程序介绍<二>

目录 mysqlcheck - 表维护程序 Mysqldump - 数据库备份程序 mysqladmin - MySQL 服务器管理程序 mysqlshow - 显⽰数据库、表和列信息 mysqldumpslow - 总结慢查询⽇志⽂件 ​编辑 mysqlbinlog - 处理⼆进制⽇志⽂件 mysqlslap - 负载仿真客⼾端 接着上篇继续介绍MySQL…...

Java项目实战II基于Spring Boot的毕业就业信息管理系统设计与实现(源码+数据库+文档)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着高校扩…...

LeetCode 1343.大小为K且平均值大于等于阈值的子数组数目

题目&#xff1a; 给你一个整数数组 arr 和两个整数 k 和 threshold 。 请你返回长度为 k 且平均值大于等于 threshold 的子数组数目。 思路&#xff1a;定长滑动窗口 入 更新 出 代码&#xff1a; class Solution {public int numOfSubarrays(int[] arr, int k, int t…...

【电商项目】1分布式基础篇

1 项目简介 1.2 项目架构图 1.2.1 项目微服务架构图 1.2.2 微服务划分图 2 分布式基础概念 3 Linux系统环境搭建 查看网络IP和网关 linux网络环境配置 补充P123&#xff08;修改linux网络设置&开启root密码访问&#xff09; 设置主机名和hosts映射 主机名解析过程分析&…...

PHP嵌套函数

PHP嵌套函数&#xff08;Nested Functions&#xff09;在标准的PHP语法中并不直接支持&#xff0c;也就是说&#xff0c;你不能在一个函数内部直接定义另一个函数。然而&#xff0c;可以通过闭包&#xff08;Closures&#xff09;和匿名函数&#xff08;Anonymous Functions&am…...

外包干了2个月,技术明显退步

回望过去&#xff0c;我是一名普通的本科生&#xff0c;于2019年通过校招有幸加入了南京某知名软件公司。那时的我&#xff0c;满怀着对未来的憧憬和热情&#xff0c;投入到了功能测试的岗位中。日复一日&#xff0c;年复一年&#xff0c;转眼间&#xff0c;我已经在这个岗位上…...

kaptcha依赖maven无法拉取的问题

老依赖了&#xff0c;就是无法拉取&#xff0c;也不知道为什么&#xff0c;就是用maven一直拉去不成功&#xff0c;还以为是魔法的原因&#xff0c;试了好久发现不是&#xff0c;只好在百度寻求帮助了&#xff0c;好在寻找到了这位大佬的文章Maven - 解决无法安装 Kaptcha 依赖…...

48.旋转图像

秋招未止脚步不止&#xff0c;大厂&#xff0c;我一定要上大厂&#xff01; 题目链接 . - 力扣&#xff08;LeetCode&#xff09; 自己的思路 感觉好难&#xff0c;想不出来. 噫噫噫&#xff0c;我想着想着又想出来了。 //发现规律了&#xff0c;先左右对称&#xff0c; 再…...

每天5分钟玩转C#/.NET之goto跳转语句

前言 在我们日常工作中常用的C#跳转语句有break、continue、return&#xff0c;但是还有一个C#跳转语句很多同学可能都比较的陌生就是goto&#xff0c;今天大姚带大家一起来认识一下goto语句及其它的优缺点。 goto语句介绍 goto 语句由关键字 goto 后跟一个标签名称组成&…...

Java处理大数据小技巧:深入探讨与实践

引言 一、选择合适的数据结构 1. 使用高效的集合 2. 并发安全的数据结构 二、内存管理 1. JVM参数调优 2. 避免内存泄漏 三、并行计算与分布式处理 1. 利用Java并发API 2. 分布式框架 四、数据压缩与序列化 1. 数据压缩 2. 高效序列化 五、外部存储与缓存 1. NoS…...

我开源了Go语言连接数据库和一键生成结构体的包【实用】

项目地址&#xff1a;https://gitee.com/zht639/my_gopkg autosql autosql 是一个简化数据库使用的模块&#xff0c;支持常见的数据库&#xff08;MySQL、PostgreSQL、SQLite、SQL Server&#xff09;。该模块不仅提供了数据库连接函数&#xff0c;还能自动生成数据表对应的结…...

Sentinel 快速入门

前置推荐阅读:Sentinel 介绍-CSDN博客 前置推荐阅读&#xff1a;Nacos快速入门-CSDN博客 快速开始 欢迎来到 Sentinel 的世界&#xff01;这篇新手指南将指引您快速入门 Sentinel。 Sentinel 的使用可以分为两个部分: 核心库&#xff08;Java 客户端&#xff09;&#xff1a…...

基于SpringBoot健康生活助手微信小程序【附源码】

基于SpringBoot健康生活助手微信小程序 效果如下&#xff1a; 管理员登录界面 管理员主界面 用户管理界面 健康记录管理界面 健康目标管理界面 微信小程序首页界面 活动信息界面 留言反馈界面 研究背景 近年来&#xff0c;由于计算机技术和互联网技术的飞速发展&#xff0c;…...

功能安全实战系列-软件FEMA分析与组件鉴定

本文框架 前言1. 功能安全分析1.1 Why1.2 What?1.3 How?1.3.1 分析范围确定1.3.2 失效模式分析1.3.3 安全措施制定1.3.4 确认是否满足功能安全目标2. 软件组件鉴定2.1 Why2.2 How?前言 在本系列笔者将结合工作中对功能安全实战部分的开发经验进一步介绍常用,包括Memory(Fl…...

【数据结构与算法】链表(上)

记录自己所学&#xff0c;无详细讲解 无头单链表实现 1.项目目录文件 2.头文件 Slist.h #include <stdio.h> #include <assert.h> #include <stdlib.h> struct Slist {int data;struct Slist* next; }; typedef struct Slist Slist; //初始化 void SlistI…...

svn-拉取与更新代码

右键项目文件 进行更新与提交代码&#xff0c;提交代码选择更改的文件以及填写commit...

【C++ 算法进阶】算法提升四

数组查询问题 &#xff08;数组优化&#xff09; 题目 数组为 {3 &#xff0c; 2&#xff0c; 2 &#xff0c;3 &#xff0c;1} 查询为&#xff08;0 &#xff0c;3 &#xff0c;2&#xff09; 这个查询的意义是 在数组下标0~3这个范围上 有多少个2 &#xff08;答案为2&…...

多种方式实现安全帽佩戴检测

为什么要佩戴安全帽 在探讨安全帽佩戴检测之前&#xff0c;我们先来了解下安全帽佩戴的必要性&#xff1a; 保护头部免受外力伤害 防止物体打击 在建筑施工、矿山开采、工厂车间等场所&#xff0c;经常会有高空坠物的风险。例如在建筑工地上&#xff0c;可能会有工具、材料、…...

基于PHP+MySQL+Vue的网上订餐系统

摘要 本文介绍了一个基于PHPMySQLVue技术的网上订餐系统。该系统旨在为用户提供便捷的在线订餐服务&#xff0c;同时提高餐厅的运营效率。系统后端采用PHP语言开发&#xff0c;利用MySQL数据库进行数据存储与管理&#xff0c;实现了用户注册登录、菜品浏览、购物车管理、订单提…...

Vue学习笔记 Class绑定 Style绑定 侦听器 表单输入绑定 模板引用 组件组成 组件嵌套关系

文章目录 Class绑定绑定对象绑定数组注意事项 style绑定绑定对象代码效果展示 绑定数组 侦听器注意的点代码效果 表单输入绑定示例代码效果展示 修饰符.lazy.number.trim 模板引用组件组成组件组成结构引入组件步骤style中的scoped作用 组件嵌套关系 Class绑定 绑定对象 绑定数…...

【AIGC】ChatGPT与人类理解力的共鸣:人机交互中的心智理论(ToM)探索

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;心智理论(Theory of Mind,ToM)心智理论在心理学与神经科学中的重要性心智理论对理解同理心、道德判断和社交技能的重要性结论 &#x1f4af;乌得勒支大学研究对ChatGPT-4…...

代码训练营 day39|0-1背包问题,LeetCode 416

前言 这里记录一下陈菜菜的刷题记录&#xff0c;主要应对25秋招、春招 个人背景 211CS本CUHK计算机相关硕&#xff0c;一年车企软件开发经验 代码能力&#xff1a;有待提高 常用语言&#xff1a;C 系列文章目录 第九章 动态规划part03 文章目录 前言系列文章目录第九章 动态…...

LeetCode 203 - 移除链表元素

题目描述 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 解题思路 创建一个虚拟头节点dummyHead&#xff0c;并将其next指向给定的头节点head&#xff0c;这样可以避免处理头节点的特…...

【海图界面上一些常见术语UTC、HDG、COG、SOG、LAT、LON的基本解释】

当然&#xff0c;以下是关于海图界面上一些常见术语UTC、HDG、COG、SOG、LAT、LON的基本解释&#xff1a; UTC (Coordinated Universal Time) 定义&#xff1a;UTC 是协调世界时&#xff08;Coordinated Universal Time&#xff09;的缩写&#xff0c;是一种与地球自转无关的…...

HL7协议简介及其在STM32上的解析实现

近期完成一个医疗相关的项目,其中包括了体征监测设备,该设备使用的通信协议便是HL7 V2.4 协议,在医疗信息化领域,HL7(Health Level Seven)协议扮演着至关重要的角色。它是一种国际标准,用于定义医疗机构间以及医疗设备与信息系统之间的数据交换格式和通信协议。HL7标准旨…...

TensorRT推理端到端

TensorRT推理端到端 1.参考链接2.宿主机上安装CUDA 12.4.13.安装nvidia-container-toolkit4.创建ghcr.io/intel/llvm/ubuntu2204_base容器5.容器内安装CUDA 12.4.1 + TensorRT10.1.06.安装依赖7.准备resnet50模型8.准备bert模型9.准备yolov5m模型10.编译TensorRT推理程序11.onn…...

获取历史的天气预报数据的网站

要获取从2019年到现在某个中国城市的天气数据&#xff0c;您可以通过以下方法实现&#xff1a; 1. 使用第三方天气数据API 许多天气服务提供商提供了历史天气数据的API接口&#xff0c;您可以通过这些API获取所需的数据。以下是一些常用的天气数据API提供商&#xff1a; 1.1…...

【VUE】Vue中常用的修饰符

事件修饰符 .stop&#xff1a;阻止事件冒泡。.prevent&#xff1a;阻止默认事件。.capture&#xff1a;使用事件捕获模式。.self&#xff1a;只当事件在该元素本身&#xff08;比如不是子元素&#xff09;触发时触发回调。.once&#xff1a;只触发一次事件。 按键修饰符 .en…...

数据分箱:如何确定分箱的最优数量?

选择最优分箱可以考虑以下几种方法&#xff1a; 一、基于业务理解 分析业务背景&#xff1a;从业务角度出发&#xff0c;某些特征可能有自然的分组或区间划分。例如&#xff0c;年龄可以根据不同的人生阶段进行分箱&#xff0c;收入可以根据常见的收入等级划分。 优点&#x…...