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

具体场景的 MySQL 与 redis 数据一致性设计

  • 场景1: 短视频修改名称,简介等视频数据
      • 更新还是清除
      • 更新策略如何设计?
          • 热 key 处理
          • 其他处理
          • 自己的数据查询
      • 其他问题
          • 冷热突变/突然的热 key 加入
          • 如果产品要更新后能所有用户立马看到效果怎么办 ?
  • 场景2: 抢红包
      • 如何设计?
          • 限制红包的数量
        • 分布式锁的自旋问题
  • 场景 3: 更改用户主页信息(用户名,简介什么的)
        • 如何设计?
      • 问题: 如果删除 redis 失败了怎么办?
          • 如果redis服务正常,但是就是某种神秘力量让redis删除失败了怎么办?
  • 总结:
    • 其他问题

场景1: 短视频修改名称,简介等视频数据

产品的要求: 修改之后自己能马上看到最新的数据,10s内其他用户能看到最新的数据

  • 场景分析:
    • 情况1: 修改的是一些爆火的视频,可能每秒有上万的访问量
    • 情况2: 修改的是爆冷的视频,每天只有一个访问量

更新还是清除

清除的策略:有可能清除到一个超热的 key 的数据,数万请求将全部打到 MySQL直接将 MySQL 打爆

  • 更新的时候加锁 : 更新的时候加分布式锁是可以防止缓存击穿;但是如果没有获取到锁的请求返回空还是阻塞等待释放锁

    • 如果阻塞等待: 服务端会阻塞上万的请求,同时自旋,压力巨大,可能会影响整个服务的运行,同时影响redis 的功能;
    • 如果返回空: 用户体验不好,用户看不到数据.
  • 这个情况要预防热 key 失效导致缓存击穿等问题,就不能使用清除的策略; 而是使用更新策略

更新策略如何设计?

热 key 处理

核心就是热 key 不能失效,否则就会有大问题,那么我们可以使用定时更新 Redis 数据的方式

  1. 数据设置一个下一次更新时间的字段(数据更新后的 5 秒中)
  2. 查询数据: (Lua )检查下次更新时间时候小于当前时间,如果小于当前时间(该更新了),更改下一次更新时间为当前后的 5s(避免其他请求打到 MySQL)
  3. 查询MySQL 的数据并更新到 Redis(第二步检查到该更新了情况时才执行; 否则直接返回)

这样只要是热 key 就会再 Redis 中不失效,并且每 5 秒会放一个请求到 MySQL 去将数据更新为最新的;对于 MySQL 的压力就是常数级

其他处理

冷数据处理:(要避免冷数据长期处于 Redis 中占用资源)

对于冷数据而言(由热变冷或者本身就是冷数据),设置过期时间

  • 热数据的过期时间会再更新的时候自动刷新(过期时间 10s,每次刷新间隔 5s);这样热数据没有失效的风险
  • 冷数据再 10s 后自动过期,不会长期占用 Redis 空间.
自己的数据查询
  • 因为自己查询自己数据的请求量非常少,所以可以通过直接查询 MySQL 的方式,就拿到的是最新的数据
  • 并且自己查询还可以做一次 Redis 同步,将数据自己更新为最新的状态.

其他问题

冷热突变/突然的热 key 加入
  • Redis 中没有数据,突然有大量的请求打进来

      1. 这种是非常极端的场景,一般的情况热 key 都是可以预见的
        比如一个粉丝千万的大 V,发的视频就很可能是热 key,那么对于他发的视频存 MySQL 的时候同时存一遍Redis
      1. 一个一般博主发的视频变火通常是一个流量逐渐增加的过程,
      • 比如一个视频开始有少数人偶然刷到了,觉得非常有意思,然后不停转发分享@等,然后变成一个爆火的视频,这是一个流程,这个流程期间我们已经将数据进行缓存了.

如果真的遇到没有预料到的热 key 突然大量访问怎么办?

  • 核心原则:不能打到 MySQL,不然 MySQL 必爆;

  • 解决方案: 放一个请求去更新到缓存(分布式锁)

  • 其他请求(未获取到锁)暂时返回空值(避免服务端阻塞请求太多)

如果产品要更新后能所有用户立马看到效果怎么办 ?
  • 跟产品说 "不行,这个功能做不了 ! ! ! "
  • 最好跟他讲清楚这样做会有什么问题,说服他用你的方案.

场景2: 抢红包

产品的要求: 抢红包后要立即看到抢红包的情况(哪些人抢了多少钱)

  • 业务分析:

    • 抢红包是一个短时间内高读写的场景
    • 并且抢到之后要立即看到结果情况
  • 红包就是一个可预见热 key,当红包发出来就会有大量的人同时抢红包,只要是热key 就要避免缓存击穿问题,所以同样需要使用更新的策略

  • 但是不同的是抢红包的场景不仅在短时间内有大量的读,还有大量的写.要避免红包数量与金额超过预定的值,并且要看到最新的结果,这边一般的处理方式使用分布式锁确保一致性避免超抢.

如何设计?

数据:

  • 红包记录: 总金额,总数量,剩余金额,剩余数量(Redis 与 DB 都要存)(作用:避免超抢)

  • 红包状态: 0:已抢完;1:正在抢;2:未抢完,空闲中

  • 抢红包记录(哪些人抢到了,抢了多少钱)(Redis,DB 都要存)

什么时候加锁?:只有正在抢红包才会加锁
什么时候阻塞?:已经加锁,有人在尝试抢(查询数据).

抢红包流程

  1. 先检查并上锁(Lua)
    • 先检查剩余数量是否大于 0&&抢红包记录中是否有自己 ;如果没有了,或者已经抢过了就查询数据结果返回
    • 如果都满足条件就检查状态是否为 2未抢完空闲中,如果是就更新为 1 正在抢);
  2. 进行拆红包逻辑,更新数据 MySQL 与 Redis(计算金额,转账,记录抢红包记录,与剩余金额,剩余红包数)然后释放锁(更新红包状态)
  3. 返回红包当前最新的数据

这样可以使用上锁更新 redis 的策略可以读到最新的数据,并且不会将请求打到 MySQL 上,防止缓存击穿

限制红包的数量

但是每一个红包都会有一个写操作,写操作会对其他请求造成阻塞,红包数量越大对服务的影响越大

所以要限制红包的数量(比如红包不能超过100个)

分布式锁的自旋问题
  • 当红包发出来有大量的用户去抢,只有一个用户能写,其他请求用户处于阻塞状态,自旋的请求锁,给 redis 造成极大的压力

如何减轻自旋获取锁带来的压力

同时在服务层也加锁

  • 每个服务只允许一个请求线程获取锁

具体做法:

  • 在服务层也加一个本地的锁,只有获取到本地锁的请求才可以去竞争分布式锁,这样竞争分布式锁的线程数为服务的数量,大大降低了大请求量情况下,同时竞争分布式锁带来的消耗

场景 3: 更改用户主页信息(用户名,简介什么的)

产品的要求: 更改完成后自己能马上看到最新数据,其他用户要在 10s 内看到新数据

场景分析

  • 用户主页是读写请求量不算太高的场景,基本不会遇到热 key 问题

  • 为什么?:因为用户数据并不是我们的主要业务,只有主要业务(请求量最大的业务)才容易出现热key 问题

    • 比如短视频那么主要请求量大的业务应该在视频,而不是用户,用户刷视频很少关心视频是谁发的,点开主页看一下(可能点开主页的请求只会占视频业务的 5%)
  • 但是也不能直接去查询 MySQL,应该还是用 redis 缓存一下

  • 因为很少出现热 key 问题,那么这个场景可以使用删除缓存的策略

如何设计?
  1. 更新
  • 先更新 MySQL 数据,
  • 然后再异步的清除redis 数据
  1. 自己查询(查 MySQL 最新的数据)
  • 查询 MySQL数据
  • 异步同步到 redis(10s 过期)
  • 返回数据
  1. 其他用户查询
  • 先查询Redis,命中直接返回
  • redis 未命中,查询 MySQL异步将数据同步到 redis(10s 过期)
  • 返回

问题: 如果删除 redis 失败了怎么办?

为什么会失败?

  • 我没有想出删除数据为什么会失败,删除数据操作没有任何复杂的逻辑,redis 也只是打个标记,基本不会失败,除非 redis 不可用了(redis 炸了或者网络不可用了)
  • 如果 redis 不可用了应该想办法限流降级,保证服务,MySQL 这些组件不会炸掉,应该赶快抢修将损失降到最小,而不是在这里纠结删除失败的问题
如果redis服务正常,但是就是某种神秘力量让redis删除失败了怎么办?

“失败了就失败了呗,多大点事儿.”

  • 删除失败确实会造成数据不一致的问题,但是影响不大,有过期时间兜底,10s 内数据一定会查询到最新的数据(数据在 10s 内一定会最终一致)
  • 而且你能保证删除成功能查询到最新的数据吗?
    • 万一命中了从数据库,但是从数据库没有同步好,还不是旧的数据,所以有短暂的数据不一致是可以接受的,只要最终一致就行

解决方案:

  • 不处理,一切交给过期时间来兜底(失败是低概率事件,并且有最终一致性保障,可以不用做处理)
  • 重试: 如果你想让它尽可能成功的话,如果遇到失败就重试几次,但是要注意的是重试的时候一定要保证幂等(删除策略也不用考虑这一点,但是一些增加,或者减少的计数型业务就一定需要幂等)

如果重试多次依旧失败就基本就是 redis 的问题了,这时候重试也没有用,就要赶紧告警处理才行.

总结:

  • 像场景 1 这种有可能清除热 key 造成缓存击穿的情况下,我们使用请求定时更新redis数据的方案

  • 像抢红包这种高度,并且要求高一致性的时候我们使用更新加锁的方案

  • 像更新个人主页消息这种读写并不是很高,并且没有热key 问题的我们可以使用删除缓存的方案

其他问题

  • 击穿预防: 在同一个key查询MySQL的时候,避免其他的key也去查询MySQL

    • 就是只放一个请求去查询值,其他请求暂时返回空
  • 预防缓存穿透: 避免别人使用不存在的 key 绕过缓存层直接攻击你的 MySQL(使用布隆过滤器)

  • 缓存雪崩预防: 防止缓存大面积失效,在数据预热阶段,或者同步缓存数据的时候,设置的过期时间可以说上下浮动的可变的值,而不是使用固定值,这样可以有效避免缓存雪崩问题

  • 限流策略: 同一个用户不能频繁的请求同一个接口(比如只允许 5 秒请求一次),可以在服务端与客户端同时限流.

  • 系统容灾: 当缓存 redis 不可用时(当请求 redis 全部失败,服务器应该立即采取限流措施),立即限流,降级,保护核心服务

  • 高可用:部署生产环境应该选用 cluster 模式保证服务的高可用.

相关文章:

具体场景的 MySQL 与 redis 数据一致性设计

场景1: 短视频修改名称,简介等视频数据更新还是清除更新策略如何设计?热 key 处理其他处理自己的数据查询 其他问题冷热突变/突然的热 key 加入如果产品要更新后能所有用户立马看到效果怎么办 ? 场景2: 抢红包如何设计?限制红包的数量 分布式锁的自旋问题 场景 3: 更改用户主…...

机器学习之SVD奇异值分解实现图片降维

SVD奇异值分解实现图片降维 目录 SVD奇异值分解实现图片降维1 SVD奇异值分解1.1 概念1.2 基本步骤1.2.1 矩阵分解1.2.2 选择奇异值1.2.3 重建矩阵1.2.4 降维结果 1.3 优缺点1.3.1 优点1.3.2 缺点 2 函数2.1 函数导入2.2 函数参数2.3 返回值2.4 通过 k 个奇异值降维 3 实际测试3…...

基于.Net Core+Vue的文件加密系统

1系统架构图 2 用例图 管理员角色的用例: 文件分享大厅:管理员可以访问文件分享大厅,下载文件。个人信息管理:管理员可以更新自己的个人信息,修改密码。用户管理:管理员负责创建、更新或删除用户账户&…...

数据结构(链表 哈希表)

在Python中,链表和哈希表都是常见的数据结构,可以用来存储和处理数据。 链表是一种线性数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。链表可以用来实现栈、队列以及其他数据结构。Python中可…...

1161 Merging Linked Lists (25)

Given two singly linked lists L1​a1​→a2​→⋯→an−1​→an​ and L2​b1​→b2​→⋯→bm−1​→bm​. If n≥2m, you are supposed to reverse and merge the shorter one into the longer one to obtain a list like a1​→a2​→bm​→a3​→a4​→bm−1​⋯. For ex…...

第23篇 基于ARM A9处理器用汇编语言实现中断<五>

Q:怎样修改HPS Timer 0定时器产生的中断周期? A:在上一期实验的基础上,可以修改按键中断服务程序,实现红色LED上的计数值递增的速率,主程序和其余代码文件不用修改。 实现以下功能:按下KEY0…...

VS Code--常用的插件

原文网址:VS Code--常用的插件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍VS Code(Visual Studio Code)常用的插件。 插件的配置 默认情况下,插件会放到这里:C:\Users\xxx\.vscode\extensions 修改插件位置的方法 …...

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代,数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者,面临着一项艰巨的任务:如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…...

【md文档】公式简单介绍

在Markdown文档中,可以使用LaTeX语法来插入数学公式。以下是一些常见的LaTeX公式示例及其在Markdown中的写法: 1. 行内公式 行内公式使用单个美元符号 $ 包裹。 ‘’’ 这是一个行内公式:$E mc^2$效果: 这是一个行内公式&…...

macOS Sequoia 15.3 beta3(24D5055b)发布,附黑、白苹果镜像下载地址

“ 镜像(黑苹果引导镜像、白苹果Mac镜像、黑苹果虚拟机镜像)下载地址:黑果魏叔官网。” 关于macOS Sequoia 15.3 beta3(24D5055b),以下是对其的详细介绍: 一、版本发布信息 发布时间 &#xf…...

HTML学习笔记(4)

目录 一、背景相关样式 二、定位position 三、javascript 1、变量的定义 2、数据类型 3、绑定事件 一、背景相关样式 background-image: url(); // 背景图片 background-repeat: repeat; // 背景图片是否平铺 no-repeat background-size: 200px; // 背景图片尺寸 cover把…...

密钥轮换时,老数据该如何处理

密钥轮换时是否需要重新加密老数据,取决于具体的加密策略和密钥管理系统的设计。以下是两种常见情况及处理方式: 1. 密钥轮换不涉及重新加密老数据 场景:如果密钥轮换仅用于新数据的加密,而老数据仍使用旧密钥解密。 处理方式&a…...

Django框架:python web开发

1.环境搭建: (a)开发环境:pycharm (b)虚拟环境(可有可无,优点:使用虚拟环境可以把使用的包自动生成一个文件,其他人需要使用时可以直接选择导入包&#xff…...

RCD-IoT:在高数据包传输率下,利用资源受限设备实现工业监测与控制

论文标题 中文:RCD-IoT:在高数据包传输率下,利用资源受限设备实现工业监测与控制 英文:RCD-IoT: Enabling Industrial Monitoring and Control with Resource-Constrained Devices Under High Packet Transmission Rates 作者信…...

LabVIEW实车四轮轮速信号再现系统

开发了一个基于LabVIEW的实车四轮轮速信号再现系统。该系统解决现有电机驱动传感器成本高、重复性差、真实性差和精度低等问题,提供一种高精度、低成本的轮速信号再现解决方案。 项目背景 ABS轮速传感器在现代汽车安全系统中发挥着至关重要的作用。为保证其准确性和…...

【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)

文章目录 S07L32 Exercise 09 - Macros1 训练目标2 操作指令2.1. 打开 macros-practice.txt 文件2.2. 练习1:将旧版 Python 代码转换为新版写法2.3. 练习2:根据列表内容批量创建 Shell 脚本2.4. 练习3:对电话号码作格式化处理2.5. 练习4&…...

LabVIEW 实现线路板 PCB 可靠性测试

在电子设备制造领域,线路板 PCB(Printed Circuit Board)的可靠性直接影响产品的整体性能和使用寿命。企业在生产新型智能手机主板时,需要对 PCB 进行严格的可靠性测试,以确保产品在复杂环境下能稳定运行。传统的测试方…...

深入内核讲明白Android Binder【二】

深入内核讲明白Android Binder【二】 前言一、Binder通信内核源码整体思路概述1. 客户端向服务端发送数据流程概述1.1 binder_ref1.2 binder_node1.3 binder_proc1.4 binder_thread 2. 服务端的binder_node是什么时候被创建的呢?2.1 Binder驱动程序为服务创建binder…...

TextButton组件的功能与用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了CircleAvatar Widget,本章回中将介绍Button这种Widget,闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 关于Button相信大家都很熟悉,也就是我们常用的按钮。用户按下按钮后…...

HTML5+Canvas实现的鼠标跟随自定义发光线条源码

源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷&#xff0c;在黑色的背景中&#xff0c;鼠标滑过即产生彩色变换的发光线条效果&#xff0c;且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…...

AS自治系统

引言 通过前几天的学习&#xff0c;我们基本了解了静态路由&#xff0c;有静态就肯定有动态&#xff0c;那他们又有哪些区别呢&#xff1f; 静态路由&#xff1a;由网络管理员手工填写的路由信息。动态路由&#xff1a;所有路由器运行相同路由协议&#xff0c;之后&#xff0c;…...

PyQt6 与 REST API:如何实现桌面应用与 Web 服务的无缝对接

PyQt6 与 REST API&#xff1a;如何实现桌面应用与 Web 服务的无缝对接 今日水一篇 在当今互联网时代&#xff0c;数据交互无处不在。桌面应用与 Web 服务的结合&#xff0c;能够为用户提供更丰富、更实时的功能体验。本文将介绍如何利用 PyQt6 实现桌面应用与 REST API 的无…...

endnote x9 如何将参考文献和文中的应用格式由annotated变为编码,例[1],[2]

在 EndNote X9 中&#xff0c;将参考文献和文中引用格式更改为编码形式&#xff08;如 [1], [2]&#xff09;需要以下步骤&#xff1a; 1. 选择合适的输出样式 打开 EndNote X9。点击菜单栏的 "Edit" > "Output Styles" > "Open Style Manage…...

题解 CodeForces 430B Balls Game 栈 C/C++

题目传送门&#xff1a; Problem - B - Codeforceshttps://mirror.codeforces.com/contest/430/problem/B翻译&#xff1a; Iahub正在为国际信息学奥林匹克竞赛&#xff08;IOI&#xff09;做准备。有什么比玩一个类似祖玛的游戏更好的训练方法呢&#xff1f; 一排中有n个球…...

管理口令安全和资源(二)

DBMS_METADATA DBMS_METADATA 是 Oracle 数据库中的一个包&#xff0c;它提供了用于管理数据库元数据的工具和过程。元数据是关于数据的数据&#xff0c;它描述了数据库的结构&#xff0c;包括表、视图、索引、存储过程、用户和其他数据库对象的信息。DBMS_METADATA 包允许用户…...

【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)

文章目录 一、产品简介二、漏洞描述三、影响版本四、漏洞检测方法五、解决方案 一、产品简介 FortiOS是Fortinet公司核心的网络安全操作系统&#xff0c;广泛应用于FortiGate下一代防火墙&#xff0c;为用户提供防火墙、VPN、入侵防御、应用控制等多种安全功能。 FortiProxy则…...

Cadence笔记--原理图导入PCB

1、以PMU6050为例&#xff0c;首先在原理图双击PMU6050器件&#xff0c;在PCB_Footprint目录填写PCB封装名称并且保存&#xff0c;如下图所示&#xff1a; 2、确保原理图命名的名称不一样&#xff0c;否则会出错&#xff0c;这里PMU6050更改了NC等名称&#xff0c;如下图所示&a…...

TOSUN同星TsMaster使用入门——3、使用系统变量及c小程序结合panel面板发送报文

本篇内容将介绍TsMaster中常用的Panel面板控件以及使用Panel控件通过系统变量以及c小程序来修改信号的值&#xff0c;控制报文的发送等。 目录 一、常用的Panel控件介绍 1.1系统——启动停止按钮 1.2 显示控件——文本框 1.3 显示控件——分组框 1.4 读写控件——按钮 1.…...

Redis 缓存穿透、击穿、雪崩 的区别与解决方案

前言 Redis 是一个高性能的键值数据库&#xff0c;广泛应用于缓存、会话存储、实时数据分析等场景。然而&#xff0c;在高并发的环境下&#xff0c;Redis 缓存可能会遇到 缓存击穿、缓存穿透 和 缓存雪崩 这三大问题。这些问题不仅影响系统的稳定性和性能&#xff0c;还经常出…...

用Cursor生成一个企业官网前端页面(生成腾讯、阿里官网静态页面)

用Cursor生成一个企业官网前端页面 第一版&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

北京市房屋建筑物轮廓shp数据arcgis高度字段内容下载分析

标题中的“北京市房屋建筑物轮廓shp数据arcgis高度字段”涉及到的是地理信息系统&#xff08;GIS&#xff09;中的数据格式和属性字段。在GIS领域&#xff0c;SHP&#xff08;Shapefile&#xff09;是一种常见的矢量数据格式&#xff0c;用于存储地理空间特征&#xff0c;如点、…...

深度学习常见术语解释

正例与负例&#xff1a; 在分类任务中&#xff0c;通常将目标类别称为正例&#xff08;positive&#xff09;&#xff0c;非目标类别称为负例&#xff08;negative&#xff09;。 True Positives&#xff08;TP&#xff09;&#xff1a; 被正确地划分为正例的个数&#xff0c;…...

《内网穿透:网络拓展与安全防护的平衡艺术》

一、引言&#xff1a;开启内网穿透的大门 在当今数字化浪潮席卷全球的时代&#xff0c;网络已成为人们生活和工作中不可或缺的一部分。我们日常使用的网络&#xff0c;如同一个庞大而复杂的生态系统&#xff0c;其中内网和外网犹如两个相互关联却又有所区别的世界。 想象一下…...

文件读取和输入输出

文件指针 在C语言中&#xff0c;文件操作是通过文件指针来进行的。文件指针是一个指向 FILE 结构的指针&#xff0c;用于标识和操作一个文件。 FILE *fp; 常用的文件操作函数 fopen&#xff1a;打开文件。fclose&#xff1a;关闭文件。fread&#xff1a;从文件中读取数据。…...

【Linux系列】查看服务器是否使用了 SSD 的多种方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

基础入门-传输加密数据格式编码算法密文存储代码混淆逆向保护安全影响

知识点&#xff1a; 1、传输格式&传输数据-类型&编码&算法 2、密码存储&代码混淆-不可逆&非对称性 一、演示案例-传输格式&传输数据-类型&编码&算法 传输格式 JSON XML WebSockets HTML 二进制 自定义 WebSockets&#xff1a;聊天交互较常…...

通过idea创建的springmvc工程需要的配置

在创建的spring mvc工程中&#xff0c;使用idea开发之前需要配置文件包括porm.xml、web.xml、springmvc.xml 1、porm.xml 工程以来的spring库&#xff0c;主要包括spring-aop、spring-web、spring-webmvc&#xff0c;示例配置如下&#xff1a; <project xmlns"http:/…...

PyTest自学-认识PyTest

1 PyTest自学-认识PyTest 1.1 PyTest可以用来做什么&#xff1f; PyTest是一个自动化测试框架&#xff0c;支持单元测试和功能测试&#xff0c;有丰富的插件&#xff0c;如&#xff0c;pytest-selemium, pytest-html等。 1.2 安装pytest 使用pip install -U pytest。 1.3 py…...

JavaScript系列(31)--装饰器详解

JavaScript装饰器详解 &#x1f3a8; 今天&#xff0c;让我们深入探讨JavaScript的装饰器&#xff08;Decorators&#xff09;。装饰器是一种用于修改类和类成员的强大语言特性&#xff0c;它让我们能够以声明式的方式增强类的功能。 装饰器基础概念 &#x1f31f; &#x1f…...

培养未来:2024年少儿编程教育的实践与思考

目录 引言 &#xff1a; 正文&#xff1a; 一、Scratch教学的深化 二、代码编程的多样化 三、赛教融合驱动 四、社区互动与共同成长 结语 &#xff1a; 引言 &#xff1a; 在快速发展的科技时代&#xff0c;编程教育作为培养未来技术人才的重要环节&#xff0c;不断经历…...

ComfyUI-PromptOptimizer:文生图提示优化节点

ComfyUI-PromptOptimizer 是 ComfyUI 的一个自定义节点&#xff0c;旨在优化文本转图像模型的提示。它将用户输入的提示转换为更详细、更多样化、更生动的描述&#xff0c;使其更适合生成高质量的图像。无需本地模型。 1、功能 提示优化&#xff1a;优化用户输入的提示以生成…...

用户中心项目教程(三)---再谈nvm,nodejs和神器Geek

目录 1.昨日回顾 2.nodejs&&nvm使用 2.1问题抛出 2.2解决方案 3.geek的使用 3.1页面展示 3.2下载链接 3.3如何使用 4.按照官方文档操作 4.1官方文档 4.2我的演示 4.3可能出现的问题 1.昨日回顾 我依稀记得昨天的时候关于这个umi3相关的兼容性问题导致的这个…...

CSS布局新视角:BFC(块级格式化上下文)的作用与优势

在CSS布局的世界中&#xff0c;BFC&#xff08;Block Formatting Context&#xff0c;块级格式化上下文&#xff09;是一个既重要又神秘的概念。它不仅是解决复杂布局问题的关键工具&#xff0c;也是提升页面性能和用户体验的重要手段。本文将从新视角出发&#xff0c;深入探讨…...

智能化植物病害检测:使用深度学习与图像识别技术的应用

植物病害一直是农业生产中亟待解决的问题&#xff0c;它不仅会影响作物的产量和质量&#xff0c;还可能威胁到生态环境的稳定。随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;尤其是深度学习和图像识别技术的应用&#xff0c;智能化植物病害检测已经成为一…...

Spring Boot Actuator 详细介绍

Spring Boot Actuator 详细介绍 1. 简介 Spring Boot Actuator 是 Spring Boot 提供的一个用于监控和管理应用程序的强大功能模块。它可以帮助我们了解应用程序的运行状况、指标收集、环境信息、日志级别管理等。 2. 添加依赖 2.1 在 pom.xml 中添加以下依赖&#xff1a; …...

微软确认Win10停更不碍Microsoft 365使用!未来是否更新成谜

快科技1月17日消息&#xff0c;微软澄清了关于Windows 10停止支持后Microsoft 365办公套件使用情况的误解。 前两天微软更新支持文档&#xff0c;表示2025年10月14日Windows 10停止支持之后&#xff0c;Microsoft 365应用程序将不再支持Windows 10设备&#xff0c;引发用户担忧…...

uniapp 微信小程序 editor 富文本编辑器

<view class"inp boxsizing"><view class"contentBox"><!-- 富文本编辑器 --><view classwrapper><view classtoolbar tap"format"><view :class"formats.bold ? ql-active : " class"iconfon…...

数据结构学习笔记——排序

排序 1. 排序相关概念 稳定性&#xff1a;关键字相同的数据记录&#xff0c;排序后相对顺序仍保持不变 例如&#xff0c;两个25&#xff0c;在排序完后&#xff0c;有*的25仍在后方&#xff0c;说明该排序算法是稳定的 内部排序&#xff1a;数据元素全部放在内存中的排序 外…...

CSS 样式 margin:0 auto; 详细解读

一、基本语法 margin 属性是用于设置元素的外边距&#xff0c;它可以接受一个、两个、三个或四个值。 margin:0 auto 是一种简洁的写法&#xff0c;其中包含了两个值。 二、值的含义 第一个值 0 表示元素的上下外边距为 0。这意味着该元素的顶部和底部与相邻元素或父元素之间…...

leetcode24-两两交换链表中的节点

leetcode 24 思路 本题仍然引入虚拟头节点来实现会更加简单&#xff0c;因为不用单独考虑对于头节点进行交换的场景对于边界条件考虑更少&#xff0c;交换的步骤按照下图中的步骤来 首先将dummy->22->11->3 但是在第一步的时候&#xff0c;dummy->2&#xff0c…...