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

九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

文章目录

  • 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)
  • 1. RDB 概述
  • 2. RDB 持久化执行流程
  • 3. RDB 的详细配置
  • 4. RDB 备份&恢复
  • 5. RDB 持久化小结(优势 和 劣势)
  • 6. 最后:


Redis 持久化-RDB:官网文档地址: https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/

在这里插入图片描述

Redis 关于持久化方案:有两种:

  1. RDB(Redis DataBase)
  2. AOF(Append Of File)

这里我们主要介绍 RDB 持久化方案,AOF 持久化方案,在下一篇文章当中。

1. RDB 概述

RDB 是什么 ?:

在指定的时间间隔内将内存当中的数据集快照写入到磁盘当中,也就是 Snapshot 快照,恢复时将快照文件当中的内容读取到内存 当中。

2. RDB 持久化执行流程

RDB 及其执行流程:

在这里插入图片描述

对上图的解读:

具体流程如下:

  1. Redis 客户端执行 bgsave 命令或者自动触发 bgsave 命令。
  2. 主进程判断当前是否已经存在正在执行的子进程 ,如果存在,那么主进程直接返回。
  3. 如果不存在,正在执行的子进程 ,那么就 fork 一个新的子进程进行持久化数据,fork 过程是阻塞的,fork 操作完成后主进程即可执行其它操作。
  4. 子进程先将数据写入到 临时的 rdb 文件中 ,待快照数据写入完成后,再原子替换旧的 rdb 文件。
  5. 同时发送信号给主进程,通知主进程 rdb 持久化完成,主进程更新相关的统计信息。

小结:

  1. 整个过程中,主进程是不进行任何 IO 操作的,这就确保了极高的性能。
  2. 如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那 RDB 方式要比 AOF 方式更加的高效。
  3. RDB的缺点是最后一次持久化的数据可能丢失。

如果你是正常关闭 Redis ,仍然会进行持久化,不会造成数据丢失。

如果是 Redis 异常终止/宕机 ,就可能造成数据丢失。

后面在讲解快照配置的时候,进行说明。

Fork&Copy-On-Write:

  1. Fork 的作用是复制一个与当前进程一样的进程。新进程的所有数据(变量,环境变量,程序计数器等)数值都和原进程一致,但是是一个全新的进程,并作为原进程的子进程。

  2. 在 Linux 程序中,fork() 会产生一个和父进程完全相同的子进程,但子进程在此后都会 exec 系统调用,出于效率考虑,Linux 中引入了 “写时复制技术 即:copy-on-write” ,有兴趣的可以移步至🌟🌟🌟 https://blog.csdn.net/Code_beeps/article/details/92838520 一位网友的解读。

  3. 一般情况父进程和子进程会共用一段物理内存,只有进程空间的各段的内容要发送变化时,才会将父进程的内容复制一份给子进程。

3. RDB 的详细配置

  1. 默认快照配置:

Redis 当中的快照的文件是名为 dump.rdb 文件,这是默认的。

在 /etc/redis.conf 中配置文件名称当中,存在这个 dump.rdb 的配置。
在这里插入图片描述

如何配置

默认为 Redis 启动时命令行所在的目录下:

意思就是:默认会将 “dump.rdb” 快照文件存储到 Redis 启动时命令行所在的目录下
在这里插入图片描述

重点: 进入到/usr/local/bin 目录下, 启动 Redis, 这个那么这里的 ./ 所指的路径就是 /usr/local/bin , 如果你在 /root/ 目录下启动 Redis , 那么这里 ./ 所指的就是 /root/ 下了路径 , 这点请大家注意。

在这里插入图片描述

那么这样的默认配置就存在一个问题,那就是,如果我们每次去到不同的目录下启动 redis 的化,那么这个dump.rdb(快照存储我们信息/数据的文件) 就会存储到不同的目录下,这样就导致了,如果该目录下没有我们之前执行存储的数据的 dump.rdb 文件的话,我们Redis 就无法读取到该存有我们之前dump.rdb 数据的文件,也就无法恢复我们之前存储操作的数据了。

演示:

我们创建两个目录:分别是: test01,和 test02
在 test01 目录下执行 set k1 "test01"  同时查看该目录下是否生成 dump.rdb(快照文件)
在 test02 目录下执行 set k2 "test02" 同时查看该目录下是否生成 dump.rdb(快照文件)
[root@localhost home]# mkdir test01 # 创建目录

在这里插入图片描述

[root@localhost test01]# redis-cli
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth rainbowsea
OK
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set k1 "test01"
OK
127.0.0.1:6379> keys *
1) "k1"

在这里插入图片描述

在这里插入图片描述

同理执行:test02

在这里插入图片描述

在这里插入图片描述

怎么解决这个,Redis 在不同的目录下,导致数据存储快照不同,数据没有跟上?

我们可以自定义配置好这个 dump.rdb 文件的存放路径,不是默认的dir./(根据启动Redis目录不同而变化) ,而是一直配置在一个固定的路径下。就可以解决这个问题了。

这里我们将其配置到 /root/ 目录下,这样我们每次生成的 dump.rdb 文件就一直是在同一个路径的目录下了

dir /root/

在这里插入图片描述

注意:需要关闭 Redis 服务,重新启动 Redis 服务,配置才会生效

[root@localhost test02]# redis-server /etc/redis.conf
[root@localhost test02]# redis-cli

在这里插入图片描述

在这里插入图片描述

  1. save 和 bgsave
127.0.0.1:6379> save
127.0.0.1:6379> bgsave

在这里插入图片描述

默认的快照配置: 如图:同样是在 `/etc/redis.conf文件当中配置的。
在这里插入图片描述

在这里插入图片描述

注意理解这个时间段的概念.:

在这里插入图片描述

如果我们没有开启 save 的注释 那么在退出,Redis 时 也会进行备份 更新 dump.rdb 文件的。

  • save : save 时只管保存,其它不管,全部阻塞。手动保存,不建议。
  • bgsave: Redis 会在后台异步进行快照操作,快照同时还可以响应客户端请求。
  • 可以通过 lastave 命令获取最后一次成功执行快照的时间(unix 时间戳),可以使用工具转换。https://tool.lu/timestamp/
  1. flushall
  • 执行 flushall 命令,也会产生 dump.rdb 文件,数据为空。
  • Redis Flushall 命令用于清空整个 Redis 服务器的数据(删除所有数据库的所有 key )
    在这里插入图片描述

在这里插入图片描述

  1. Save

格式:save 秒钟 写操作次数, 如图

在这里插入图片描述

在这里插入图片描述

RDB 是整个内存的压缩过的 Snapshot,RDB 的数据结构,可以配置复合的快照触发条件

禁用:给 save 传空字符串,可以看文档:

  1. stop-writes-on-bgsave-error
    在这里插入图片描述

意思是:当 Redis 无法写入磁盘的话(比如磁盘满了), 直接关掉 Redis 的写操作。推荐 yes

  1. rdbcompression

在这里插入图片描述

该配置的意思是:

  1. 对于存储到磁盘中的快照,可以设置是否进行压缩存储。如果是的话,redis 会采用 LZF 算法进行压缩。
  2. 如果你不想消耗 CPU 来进行压缩的话,可以设置为关闭此功能,默认 yes。
  1. rdbchecksum

在这里插入图片描述

该配置的意思是:

  1. 在存储快照后,还可以让 redis 使用 CRC64算法来进行数据校验,保证文件是完整的。
  2. 但是这样做会增加大约 10% 的性能消耗,如果希望获取到最大的性能提升,可以关闭此功能,推荐 yes 打开。
  1. 动态停止 RDB:

  2. 动态停止RDB: redis-cli config set save "" ,就是给 save 属性赋值为 ""空字符串,表示禁用保护策略。这里使用命令是让 客户端在此刻,启动的客户端停止 RDB,一旦退出了该客户端就,该配置就失效了。RDB 持久化策略又启动了。


示例演示:

需求: 如果 Redis 的 key 在 30 秒内, 有 5 个 key 变化, 就自动进行 RDB 备份.
在这里插入图片描述

save 30 5

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4. RDB 备份&恢复

Redis 可以充当缓存,对项目进行优化,因此重要/敏感的数据建议在 MySQL要保存一份。

从设计层面来说,Redis 的内存数据,都是可以重新获取的(可能来自程序,也可能来自MySQL)

因此我们这里说的备份&恢复主要是给大家说明一下 Redis 启动时,初始化数据是从 dump.rdb 来的 整个机制。

演示:

这里我们演示的是:

将我们已经的 dump.rdb 备份文件复制拷贝(备份)一份,复制后之后,再将原来的dump.rdb 文件删除了(模拟文件损坏了,或者是执行 flushall 删除库)。再将我们拷贝备份的 dum.rdb 文件,复制过去,然后重启 redis 读取 dump.rdb 备份文件当中的数据,进行一个数据上的恢复。

config get dir 查询 rdb 文件的目录

127.0.0.1:6379> config get dir

在这里插入图片描述

将 dump.rdb 进行备份 如果有必要可以写 shell 脚本来定时备份 [参考韩顺平老师 Linux 课程定时
,备份 Mysql 数据库视频地址 https://www.bilibili.com/video/BV1Sv411r7vd?p=105 ] 。

[root@localhost ~]# cp /root/dump.rdb /root/dump.rdb.bak

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

127.0.0.1:6379> flushall

在这里插入图片描述

在这里插入图片描述

注意:这里得关闭一下服务器

在这里插入图片描述

[root@localhost ~]# rm /root/dump.rdb # 删除文件夹

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

关闭 Redis 服务器,重新启动 Redis 服务器,让它读取到我们配置的dump.rdb 备份文件,恢复我们的数据信息。

在这里插入图片描述

5. RDB 持久化小结(优势 和 劣势)

优势:

  1. 适合大规模的数据恢复
  2. 对数据完整性和一致性要求不高更适合使用
  3. 节省磁盘空间
  4. 恢复速度快
    在这里插入图片描述

劣势:

  1. 虽然 Redis 在 fork 时使用了写时拷贝技术(Cop-On-Write) ,但是如果数据庞大时还是比较消耗性能。
  2. 在备份周期在一定间隔时间做一次备份,所以如果 Redis 意外 down 掉 的话(如果正常关闭 Redis仍然会进行 RDB 备份,不会丢失数据),就会丢失最后一次快照后的所有修改。

6. 最后:

“在这个最后的篇章中,我要表达我对每一位读者的感激之情。你们的关注和回复是我创作的动力源泉,我从你们身上吸取了无尽的灵感与勇气。我会将你们的鼓励留在心底,继续在其他的领域奋斗。感谢你们,我们总会在某个时刻再次相遇。”

在这里插入图片描述

相关文章:

九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)

九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位) 文章目录 九. Redis 持久化-RDB(详细讲解说明,一个配置一个说明分析,步步讲解到位)1. RDB 概述2. RDB 持久化执行流程3. RDB 的详细配置4. RDB 备份&恢…...

Redis --- 秒杀优化方案(阻塞队列+基于Stream流的消息队列)

下面是我们的秒杀流程: 对于正常的秒杀处理,我们需要多次查询数据库,会给数据库造成相当大的压力,这个时候我们需要加入缓存,进而缓解数据库压力。 在上面的图示中,我们可以将一条流水线的任务拆成两条流水…...

使用VCS对Verilog/System Verilog进行单步调试的步骤

Verilog单步调试: System Verilog进行单步调试的步骤如下: 1. 编译设计 使用-debug_all或-debug_pp选项编译设计,生成调试信息。 我的4个文件: 1.led.v module led(input clk,input rst_n,output reg led );reg [7:0] cnt;alwa…...

Go语言中结构体字面量

结构体字面量(Struct Literal)是在 Go 语言中用于创建和初始化结构体实例的一种语法。它允许你在声明结构体变量的同时,直接为其字段赋值。结构体字面量提供了一种简洁、直观的方式来创建结构体对象。 结构体字面量有两种主要形式&#xff1…...

编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama

​​ 系列文章: 编程AI深度实战:私有模型deep seek r1,必会ollama-CSDN博客 编程AI深度实战:自己的AI,必会LangChain-CSDN博客 编程AI深度实战:给vim装上AI-CSDN博客 编程AI深度实战:火的编…...

19C RAC在vmware虚拟机环境下的安装

RAC安装规划 ===IP== ORA19C01 public ip : 192.168.229.191 heatbeat : 192.168.0.1 vip : 192.168.229.193 ORA19C02 public ip :192.168.229.192 heatbeat : 192.168.0.2 vip : 192.168.229.194 scan ip 192.168.229.195 hosts: echo "192.168.229…...

MongoDB 查询文档

MongoDB 查询文档 引言 MongoDB 是一个功能强大的文档型数据库,它使用 JSON 格式存储数据,并提供了灵活的查询机制。本文将深入探讨 MongoDB 的查询文档,包括查询基础、查询语法、查询优化以及一些高级查询技巧。 查询基础 MongoDB 的查询语句以 find() 方法开始,它允许…...

了解 ALV 中的 field catalog (ABAP List Viewer)

在 ABAP 中,字段目录是使用 ALV (ABAP List Viewer) 定义内部表中的数据显示方式的关键元素。它提供对 ALV 中显示的字段的各种属性的控制,例如列标题、对齐方式、可见性、可编辑性等。关键概念: Field Catelog 字段目…...

【C++STL标准模板库】二、STL三大组件

文章目录 1、容器2、算法3、迭代器 二、STL三大组件 1、容器 容器,置物之所也。 研究数据的特定排列方式,以利于搜索或排序或其他特殊目的,这一门学科我们称为数据结构。大学信息类相关专业里面,与编程最有直接关系的学科&…...

【高级篇 / IPv6】(7.2) ❀ 04. 在60E上配置ADSL拨号宽带上网(IPv4) ❀ FortiGate 防火墙

【简介】除了单位用户以外,大部分个人用户目前使用的仍然是30E、50E、60E系列防火墙,固件无法达到目前最高版本7.6,这里以最常用的60E为例,演示固件版本7.2下实现ADSL拨号宽带的IPv6上网。由于内容比较多,文章分上、下…...

基础IOIO

1.理解文件 1.侠义理解 文件是在从盘上的。磁盘是永久性存储介质。磁盘是外设。磁盘上对文件的所有操作,都是对外设的输入输出IO。 2.广义理解 linux下一切皆文件(键盘,显示器,网卡,磁盘) 3.文件操作的…...

starrocks最佳实践、行业实践

最佳实践 starrocks最佳实践 最佳实践集合 Bitmap索引适用场景和最佳实践 行业实践 行业实践...

详解CSS `clear` 属性及其各个选项

详解CSS clear 属性及其各个选项 1. clear: left;示例代码 2. clear: right;示例代码 3. clear: both;示例代码 4. clear: none;示例代码 总结 在CSS布局中,clear 属性是一个非常重要的工具,特别是在处理浮动元素时。本文将详细解释 clear 属性及其各个选…...

MVC、MVP和MVVM模式

MVC模式中,视图和模型之间直接交互,而MVP模式下,视图与模型通过Presenter进行通信,MVVM则采用双向绑定,减少手动同步视图和模型的工作。每种模式都有其优缺点,适合不同规模和类型的项目。 ### MVVM 与 MVP…...

【大数据技术】教程03:本机PyCharm远程连接虚拟机Python

本机PyCharm远程连接虚拟机Python 注意:本文需要使用PyCharm专业版。 pycharm-professional-2024.1.4VMware Workstation Pro 16CentOS-Stream-10-latest-x86_64-dvd1.iso写在前面 本文主要介绍如何使用本地PyCharm远程连接虚拟机,运行Python脚本,提高编程效率。 注意: …...

wsl+phpstorm+xdebug|windows子系统配置phpstorm开发调试|断点调试

安装wsl 安装apache php 安装xdebug扩展,并配置 这里是通过宝塔9.4面板安装的xdebug3.0 [xdebug] xdebug.modedebug xdebug.start_with_requesttrue xdebug.discover_client_hosttrue xdebug.client_host127.0.0.1配置PHPSTORM 注意:新建服务器一定要…...

如可安装部署haproxy+keeyalived高可用集群

第一步,环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip:192..168.244.101 Vip:192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…...

Linux——文件与磁盘

1. 磁盘结构 磁盘在我们的计算机中有着重要的地位,当文件没有被打开时其数据就存储在磁盘上,要了解磁盘的工作原理先要了解磁盘的结构。 1.1 磁盘的物理结构 以传统的存储设备机械硬盘为例,它通过磁性盘片和磁头来读写数据。磁盘内部有多个旋…...

Maven jar 包下载失败问题处理

Maven jar 包下载失败问题处理 1.配置好国内的Maven源2.重新下载3. 其他问题 1.配置好国内的Maven源 打开⾃⼰的 Idea 检测 Maven 的配置是否正确,正确的配置如下图所示: 检查项⼀共有两个: 确认右边的两个勾已经选中,如果没有请…...

Qt中的UIC、MOC、RCC宏定义说明

在Qt6新建工程的时候,CMakeLists.txt中会默认带有UIC,MOC,RCC的3个宏定义。 set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) uic(User Interface Compiler),用户界面编译器,将根据.ui文件生成相…...

SQLite Update 语句详解

SQLite Update 语句详解 SQLite 是一款轻量级的数据库管理系统,以其简单、易用和高效的特点在全球范围内得到了广泛的应用。在 SQLite 中,UPDATE 语句是用于修改数据库表中记录的常用命令。本文将详细解析 SQLite 的 UPDATE 语句,包括其语法…...

理解PLT表和GOT表

1 简介 现代操作系统都是通过库来进行代码复用,降低开发成本提升系统整体效率。而库主要分为两种,一种是静态库,比如windows的.lib文件,macos的.a,linux的.a,另一种是动态库,比如windows的dll文…...

InfluxDB 2.0 到 3.0 技术架构演进与性能分析

架构演进 关键技术变化:InfluxDB 3.0 相比 2.0 在架构上进行了重大的技术升级。首先,核心代码由 Go 语言重写为 Rust,以利用 Rust 更高的性能和内存安全特性,从而显著提升数据库的性能、可靠性和安全性。其次,引入列式…...

介绍一下Mybatis的底层原理(包括一二级缓存)

表面上我们的就是Sql语句和我们的java对象进行映射,然后Mapper代理然后调用方法来操作数据库 底层的话我们就涉及到Sqlsession和Configuration 首先说一下SqlSession, 它可以被视为与数据库交互的一个会话,用于执行 SQL 语句(Ex…...

docker gitlab arm64 版本安装部署

前言: 使用RK3588 部署gitlab 平台作为个人或小型团队办公代码版本使用 1. docker 安装 sudo apt install docker* 2. 获取arm版本的gitlab GitHub - zengxs/gitlab-arm64: GitLab docker image (CE & EE) for arm64 git clone https://github.com/zengxs…...

7、怎么定义一个简单的自动化测试框架?

定义一个简单的自动化测试框架可以从需求理解、框架设计、核心模块实现、测试用例编写和集成执行等方面入手,以下为你详细介绍: 1. 明确框架需求和范围 确定测试类型:明确框架要支持的测试类型,如单元测试、接口测试、UI 测试等…...

linux组管理

创建组:groupadd (创建组命令的详细使用:如何创建组-CSDN博客) 修改组:groupmod (修改组命令的详细使用:如何修改组-CSDN博客) 组配置文件: /etc/group...

【MySQL】常用语句

目录 1. 数据库操作2. 表操作3. 数据操作(CRUD)4. 高级查询5. 索引管理6. 用户与权限7. 数据导入导出8. 事务控制9. 其他实用语句注意事项 如果这篇文章对你有所帮助,渴望获得你的一个点赞! 1. 数据库操作 创建数据库 CREATE DATA…...

二维数组 C++ 蓝桥杯

1.稀疏矩阵 #include<iostream> using namespace std;const int N 1e4 10; int a[N][N];int main() {int n, m; cin >> n >> m;for (int i 1; i < n; i) {for (int j 1; j < m; j) {cin >> a[i][j];}}for (int j m; j > 1; j--) {for (i…...

SAP HCM 回溯分析

最近总有人问回溯问题&#xff0c;今天把12年总结的笔记在这共享下&#xff1a; 12年开这个图的时候总是不明白是什么原理&#xff0c;教程看N次&#xff0c;网上资料找一大堆&#xff0c;就是不明白原理&#xff0c;后来为搞明白逻辑&#xff0c;按照教材的数据一样做&#xf…...

MySQl的日期时间加

MySQL日期相关_mysql 日期加减-CSDN博客MySQL日期相关_mysql 日期加减-CSDN博客 raise notice 查询目标 site:% model:% date:% target:%,t_shipment_date.site,t_shipment_date.model,t_shipment_date.plant_date,v_date_shipment_qty_target;...

前部分知识复习03

一、光照模型 经验型&#xff1a; 1.Lambert光照模型 2.Phong光照模型 3.Blinn-Phong光照模型 物理型&#xff1a; 4.PBR光照模型 二、渲染路径 渲染路径&#xff1a;是为进行光照计算而设置的渲染方式 前向渲染路径顶点照明渲染路径延迟渲染路径 顶点照明渲染路径中的灯光…...

Windows图形界面(GUI)-QT-C/C++ - QT MDI Area

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 多文档编辑器 2. 多窗口应用程序 3. 多视图应用程序 三、常见样式 1. 子窗口管理 2. 布局管理 四、属性设置 1. 添加子窗口 2. 移除子窗口 3. 设置…...

基于微信小程序的私家车位共享系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…...

用deepseek制作我的第一个长视频---使用AI解决尝试新领域没有经验拖延的问题!

&#xff08;由于技术原因&#xff0c;联网搜索暂不可用&#xff09; 制作一个高质量的Vlog或生活记录长视频&#xff0c;即使零基础也能通过系统规划实现&#xff01;以下是为你定制的「从零到成品」全流程指南&#xff0c;结合叙事逻辑、剪辑技巧和效率工具&#xff0c;帮你…...

零基础学习电磁兼容(EMC)06--时域和频域

大部分工程师很熟悉示波器,并使用它读取信号的频率和电压值,然而,在EMC领域,绝大多数的数据都是从频谱分析仪、测量接收机等基于频率测量的设备中读取的,因此,了解这些频率参数的含义以及与时域信号的关系,是非常重要的。 时域和频域的本质:傅里叶变换及其逆过程 如下…...

解决在使用自己的数据集在 Ultralytics 上运行 RT - DETR 模型时显存爆满的问题

在使用自己的数据集在 Ultralytics 上运行 RT - DETR 模型时&#xff0c;显存爆满是一个常见问题。以下是一系列可以采取的步骤和方法&#xff0c;帮助你解决这个问题&#xff0c;同时使用 Ultralytics 的官方源码。 1. 环境准备 确保你已经安装了 Ultralytics 库&#xff0c…...

Android学习19 -- 手搓App

1 前言 之前工作中&#xff0c;很多时候要搞一个简单的app去验证底层功能&#xff0c;Android studio又过于重型&#xff0c;之前用gradle&#xff0c;被版本匹配和下载外网包折腾的堪称噩梦。所以搞app都只有找应用的同事帮忙。一直想知道一些简单的app怎么能手搓一下&#x…...

鼠标拖尾特效

文章目录 鼠标拖尾特效一、引言二、实现原理1、监听鼠标移动事件2、生成拖尾元素3、控制元素生命周期 三、代码实现四、使用示例五、总结 鼠标拖尾特效 一、引言 鼠标拖尾特效是一种非常酷炫的前端交互效果&#xff0c;能够为网页增添独特的视觉体验。它通常通过JavaScript和C…...

【CSS】什么是响应式设计?响应式设计的基本原理,怎么做

在当今多设备、多屏幕尺寸的时代&#xff0c;网页设计面临着前所未有的挑战。传统的固定布局已无法满足用户在不同设备上浏览网页的需求&#xff0c;响应式设计&#xff08;Responsive Web Design&#xff09;应运而生&#xff0c;成为网页设计的趋势和标准。本文将深入探讨响应…...

单机性能调优中的程序优化

目录 一、系统框架的选择 二、程序优化 表单压缩 局部刷新 仅取所需 逻辑清晰 谨慎继承 程序算法优化 批处理 延迟加载 防止内存泄漏 减少大对象引用 防止争用死锁 存储过程 内存分配 并行 异步 缓存 单机优化顾名思义就是我们要在单机上对系统的性能进行调优…...

2.4学习总结

洛谷1305代码 #include<stdio.h> #include<stdlib.h> struct treenode {char val;struct treenode* left;struct treenode* right; }; struct treenode* createnode(char val) {struct treenode* node (struct treenode*)malloc(sizeof(struct treenode));node-&…...

小程序-视图与逻辑

前言 1. 声明式导航 open-type"switchTab"如果没有写这个&#xff0c;因为是tabBar所以写这个&#xff0c;就无法跳转。路径开始也必须为斜线 open-type"navigate"这个可以不写 现在开始实现后退的效果 现在我们就在list页面里面实现后退 2.编程式导航…...

突破封闭集限制:OvSGTR引领开放词汇场景图生成新纪元

场景图生成&#xff08;Scene Graph Generation, SGG&#xff09;&#xff0c;这个领域&#xff0c;旨在通过解析图像来构建描述性的结构化图表&#xff0c;不仅能够识别图片中的物体&#xff0c;还能捕捉它们之间的相互关系。 这种能力对于诸如图像字幕、视觉问答以及图像生成…...

C语言基础之【程序流程结构】

C语言基础之【程序流程结构】 概述选择结构if语句if…else语句小练习&#xff1a;“三只小猪体重比较” if…else if…else语句小练习&#xff1a;“三只小猪体重比较” 三目运算符小练习&#xff1a;“三只小猪体重比较” switch语句小练习&#xff1a;**“成绩等级判断器”**…...

代码随想录35 动态规划

目录 leetcode 746.使用最小花费爬楼梯 leetcode 62.不同路径 思路&#xff1a; leetcode 63.不同路径|| leetcode 746.使用最小花费爬楼梯 给你一个整数数组 cost &#xff0c;其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用&#xff0c;即可选…...

【游戏设计原理】98 - 时间膨胀

从上文中&#xff0c;我们可以得到以下几个启示&#xff1a; 游戏设计的核心目标是让玩家感到“时间飞逝” 游戏的成功与否&#xff0c;往往取决于玩家的沉浸感。如果玩家能够完全投入游戏并感受到时间飞逝&#xff0c;说明游戏设计在玩法、挑战、叙事等方面达到了吸引人的平衡…...

51单片机 06 定时器

51 单片机的定时器属于单片机的内部资源&#xff0c;其电路的连接和运转均在单片机内部完成。 作用&#xff1a;1、用于计时&#xff1b;2、替代长时间的Delay&#xff0c;提高CPU 运行效率和处理速度。 定时器个数&#xff1a;3个&#xff08;T0、T1、T2&#xff09;&#xf…...

4 前端前置技术(中):node.js环境

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 前言...

【Leetcode刷题记录】1456. 定长子串中元音的最大数目---定长滑动窗口即解题思路总结

1456. 定长子串中元音的最大数目 给你字符串 s 和整数 k 。请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。 英文中的 元音字母 为&#xff08;a, e, i, o, u&#xff09;。 这道题的暴力求解的思路是通过遍历字符串 s 的每一个长度为 k 的子串&#xf…...