Redis进阶(持久化、复制、集群、多线程、缓存)

news2024/11/13 20:25:26

Redis进阶

  • 1.Redis持久化
    • 1.1 什么是Redis持久化?为什么需要持久化?
    • 1.2 Redis持久化方式——RDB(Redis DataBase)
      • 1.2.1 什么是RDB?
      • 1.2.2 备份文件位置
      • 1.2.3 触发RDB的方式
        • 1.2.3.1 自动触发
        • 1.2.3.2 手动触发
        • 1.2.3.3 其他触发方式
      • 1.2.4 RDB优缺点
    • 1.3 Redis持久化方式——AOF(Append Only File)
      • 1.3.1 什么是AOF
      • 1.3.2 备份的位置(Redis7)
      • 1.3.3 AOF工作原理
      • 1.3.4 AOF优缺点
    • 1.4 Redis持久化方式——RDB+AOF
  • 2. Redis主从复制(Replication)
    • 2.1 什么是主从复制?为什么要主从复制?
    • 2.2 主从复制配置
    • 2.3 主从复制过程
    • 2.4 主从复制的其他说明
  • 3. Redis哨兵(Sentinel)
    • 3.1 什么是哨兵
    • 3.2 哨兵集群配置和启动
    • 3.3 哨兵选举流程
    • 3.4 哨兵集群的优缺点
  • 4. 集群(Cluster)
    • 4.1 什么是集群
    • 4.2 集群算法——分片、槽位slot
    • 4.3 其他说明
  • 5.Redis单线程与多线程
    • 5.1 Redis是单线程还是多线程
    • 5.2 Redis为什么快
    • 5.3 主线程和IO多线程的协作流程
  • 6.布隆过滤器(BloomFilter)
    • 6.1 什么是布隆过滤器
    • 6.2 布隆过滤器原理
    • 6.3 优缺点和使用场景
  • 7. 缓存雪崩、穿透、击穿
    • 7.1 缓存雪崩
    • 7.2 缓存穿透
    • 7.3 缓存击穿

1.Redis持久化

1.1 什么是Redis持久化?为什么需要持久化?

什么是Redis持久化:将内存中的数据写到磁盘中
为什么Redis需要持久化:Redis缓存是基于内存的,当服务器宕机或发生意外的时候,数据可能会丢失,所以需要将内存中的数据以一定的方式存储到磁盘中,方便数据恢复

1.2 Redis持久化方式——RDB(Redis DataBase)

1.2.1 什么是RDB?

在一定的间隔时间内将内存中的数据写入到磁盘中,专业术语称之为snapshots(快照)。类似照相机每间隔一定时间拍摄一张照片。RDB是Redis默认的持久化方式。在redis.conf中可以找到关于间隔时间的说明:见1.2.3中自动触发部分。

1.2.2 备份文件位置

可以在Redis.conf文件中找到下列配置,dbfilename是备份文件名,dir是保存备份文件的文件夹。可以根据需求进行修改。
在这里插入图片描述
在这里插入图片描述

1.2.3 触发RDB的方式

1.2.3.1 自动触发

在Redis.conf中可以找到相关的配置说明。当达到条件的时候fork出子进程来进行备份,类似手动触发的bgsave

# Unless specified otherwise, by default Redis will save the DB:
# After 3600 seconds (an hour) if at least 1 change was performed 
# After 300 seconds (5 minutes) if at least 100 changes were performed
# After 60 seconds if at least 10000 changes were performed

save 3600 1 300 100 60 10000
1.2.3.2 手动触发

例如某时某刻向Redis中写入了某数据,需要立即保存到磁盘,就可以手动触发保存命令。保存命令分为SAVE和BGSAVE,区别如下:

  • save :同步生成快照,会造成Redis阻塞,一般不建议使用。
  • bgsave:异步生成快照。会fork出子进程来执行持久化,主进程可以继续执行任务。
redis> save
OK

redis> bgsave
Background saving started
1.2.3.3 其他触发方式
  1. 执行shutdown 自动触发
  2. 主从复制时master 自定触发

1.2.4 RDB优缺点

  1. 优点:相比于AOF 更适合大规模数据更快的恢复。因为所有的数据都备份在磁盘,而AOF只是保存了执行的命令,恢复数据的时候要耗时加载。
  2. 缺点:(1)可能造成数据丢失:RDB是一定条件下才触发保存,当服务器意外宕机并且最近的一次数据并没有达到触发条件就会丢失最近的数据。 (2)fork子进程备份可能会耗时造成卡顿:虽然备份是fork子进程进行的,但是主进程fork子进程的时候会暂时阻塞,当要备份的数据很大的时候,fork可能会很耗时,造成卡顿。

1.3 Redis持久化方式——AOF(Append Only File)

1.3.1 什么是AOF

将服务器的的所有写操作记录进日志,数据恢复时根据所有写操作命令重建数据。AOF默认关闭,如果需要开启,可以在Redis.conf中开启:将appendonly 设置为yes

1.3.2 备份的位置(Redis7)

备份的文件夹名称配置如下:
在这里插入图片描述
在这里插入图片描述
备份的文件名称配置如下:
在这里插入图片描述
即:有关AOF的所有备份文件都会保存在appendonlydir文件夹中,当配置保存文件的前缀是appendonly.aof时,会生成3种文件:base文件,increase文件,mainfest文件(跟踪管理这些文件。)

1.3.3 AOF工作原理

AOF工作流程如下:
在这里插入图片描述
缓冲区写回策略:AOF缓冲区命令写到磁盘的方式有3种

  • always:同步写回,有一个写一个。
  • everysec(默认):每一秒将缓冲区写一次到磁盘。
  • no:操作系统自己调动。
    在这里插入图片描述
    AOF重写机制:随着AOF命令写的越来越多,导致AOF文件会变得越来越大,在一定条件下需要重写,简而言之对AOF文件瘦身
    在这里插入图片描述
    当当前文件大于64mb,并且是上一次文件大小的1倍时触发重写。
    注意:比较大小是用百分比表示的

1.3.4 AOF优缺点

  • 优点:相比于RDB,更不容易丢失数据,因为每个写操作都存入磁盘了。
  • 缺点:(1)相同数据集AOF文件大小大于RDB,恢复速度慢。(2)运行效率低于RDB(可能是同步策略导致效率低,因为每秒钟需要同步一次。)

1.4 Redis持久化方式——RDB+AOF

Redis支持RDB和AOF共同持久化,开启方式如下:

aof-use-rdb-preamble yes
  • 开启混合持化后:先使用RDB进行快照存储,然后使用AOF持久化记录所有的写操作,当重写策略满足或手动触发重写的时候,将最新的数据存储为新的RDB记录。这样的话,重启服务的时候会从RDB和AOF两部分恢复数据,既保证了数据完整性,又提高了恢复数据的性能。简单来说:混合持久化方式产生的文件一部分是RDB格式,一部分是AOF格式

注:当不开启AOF时,只产生RDB备份,开启AOF时会产生RDB和AOF文件,混合持化时,产生的是AOF文件,但是其内容是部分RDB+部分AOF文件。二者共存的时候只加载AOF,因为AOF文件保存的更完整。
在这里插入图片描述

  • RDB VS AOF
    在这里插入图片描述

2. Redis主从复制(Replication)

2.1 什么是主从复制?为什么要主从复制?

  • 主从复制:有多台服务器,分为master和slave服务器,一台master服务器可以挂载多台slave服务器,在master服务器中进行写操作,slave服务器进行读操作,减轻单台服务器带来的读写压力。当数据写入到master服务器中的时候,slave服务器同步master服务器数据的过程称之为主从复制
  • 为什么要主从复制:(1)读写分离 (2)容灾恢复 (3)数据备份 (4)扩容支持高并发
    在这里插入图片描述

2.2 主从复制配置

info replication 查看节点之间的主从关系
replicaof masterip masterport 一般在配置文件中配置要连接的mater信息,也可以在命令行配置。配置文件中配置后重启后依然生效
slaveof masterip masterport 命令行配置要连接的master信息
slaveof no one 转为master不再挂载于任何master 

假设3台主机, 1 master with 2 slaves。在master中写入了数据,在slaves中可以直接读写
在这里插入图片描述

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

2.3 主从复制过程

(1)首次连接全量复制

  • 当slave连接master的时候会发送sync命令。
  • master接收到sync后暂停当前所有的写操作,并将写操作缓存起来,并生成RDB快照
  • master将RDB快照发送给slave,slave收到快照后,清空自己的数据库,将接受到的数据写入自己的内存。
  • master将刚才缓存的写操作发给slave,slave根据操作载入缓存。

(2)后续增量复制
master每执行一个写命令就会向slave服务器发送相同的写命令,slave服务器接收并执行收到的写命令。

(3)断点续传
master在内存缓冲区中给每个slave服务器都维护了一份同步备份日志backlog,同时master 和 slave都维护了一个复制偏移量(replication offset)和 master线程ID(master run id),每个slave服务器在跟master服务器进行同步时都会携带master run id 和 最后一次同步的复制偏移量offset,通过offset可以知道主从之间的数据不一致的情况。当连接断开时,slave服务器会重新连接上master服务器,然后请求继续复制。假如主从服务器的两个master run id相同,并且指定的偏移量offset在同步备份日志中还有效,复制就会从上次中断的点开始继续。

2.4 主从复制的其他说明

  • slave只能读而不能写。
  • master宕机后,slave只能等待而不能上位
  • master 宕机后重启后仍然是master
  • 缺点:master宕机后没有slave上位,可能造成生产事故。

3. Redis哨兵(Sentinel)

3.1 什么是哨兵

俗称“无人值守运维”,当master宕机后,哨兵从slave中自动选举出新的master,避免master宕机后造成生产事故。
哨兵一般是集群,至少得3个哨兵,因为当master宕机后哨兵得投票选举出新的master。
哨兵一般只需要监视master,当master宕机后会选举出新master。当slave宕机后会通知哪个slave宕机了,需要手动恢复。
在这里插入图片描述

  • 哨兵的作用
    在这里插入图片描述

3.2 哨兵集群配置和启动

假设有服务器A B C ,可以在同一台服务器上或者不同的服务器上对sentinel.conf进行配置,
服务器可以是新的D服务器或者A B C服务器之一。
案例中设置3个哨兵,选择在3台服务器中分别配置sentinel.conf来监视master——192.168.178.128。(剩余的2台服务器ip分别是129、130)

  • 在sentinel.conf中进行相关配置
daemonize yes
protected-mode no

#sentinel monitor <master-name> <ip> <redis-port> <quorum>
#master-name 自己起 
#quorm 集群中至少有quorm个哨兵认为master宕机了才客观认为master宕机了
sentinel monitor mymaster 192.168.178.128 6379 2

#sentinel auth-pass <master-name> <password> 要监视的master 名称 和 密码
sentinel auth-pass mymaster 123456
  • 启动哨兵sentinel
redis-sentinel sentinel.conf --sentinel

因为哨兵配置在3台服务器中,所以需要再3台服务器中分别启动。

  • 模拟master宕机
    手动shutdown master服务器 之前 master和slaves info replication 如下:可以看到2台slave服务器都挂载在128的master服务器下,可以通过ip和replid看出来。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    手动shutdown master服务器 之后,并在 稍后 重启之前的master,发现: 哨兵选举出新的master(129服务器),并且原来的master重启后变成了slave。
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.3 哨兵选举流程

  • 先确定master是否客观下线
    主观下线:即单个sentinel主观认为某个服务下线(有可能是接收不到订阅,之间的网络不通等等原因)。衡量指标是服务器在[sentinel down-after-milliseconds]给定的毫秒数之内没有回应PING命令或者返回一个错误消息。
#sentinel.conf
# default 30s
sentinel down-after-milliseconds <master-name> <milliseconds>

主观下线:单个哨兵得主观下线可能存在误判,例如只是网络不通畅就造成了ping不通。所以需要至少个哨兵认为master下线了才能认为master客观下线了。

#sentinel.conf
sentinel monitor <master-name> <ip> <redis-port> <quorum>
  • 各个哨兵选举领导者哨兵(Raft算法)
    在这里插入图片描述

  • 领导者哨兵进行故障转移
    通知调用的客户端master发生了变化
    通知其余的原slave节点,去复制Sentinel选举出来的新的master节点
    即使原来的master重启了,也沦为slave

3.4 哨兵集群的优缺点

  • 优点:对节点进行监控,来完成自动的故障发现与转移
  • 缺点:(1)在主从切换的瞬间存在访问瞬断的情况,等待时间比较长,客户端无法访问。(2)只有一个主节点对外提供服务,没法支持很高的并发。

4. 集群(Cluster)

4.1 什么是集群

简单来说,由多台服务器组成的集合。其中由多台master和多台slave,一台master可以挂载多台slave。客户端只需要连接其中一个节点服务器即可,实现了高并发和高可用。(相比于单纯的主从复制和哨兵模式,集群并发量更高,并且容灾性更好)
在这里插入图片描述

在这里插入图片描述

4.2 集群算法——分片、槽位slot

分片:即某台服务器
槽位:存在于某台服务器上的存储空间

集群算法:当要读取或者写入某个key的时候,将其经过CRC16(循环冗余校验码 16即校验结果占16bit)哈希函数的映射后,再与16384(2的14次方)取模后,得到0-16383之间的值。一般情况下,多个分片均分16384个槽位。则将key对应到某个分片下对应的槽位中。
在这里插入图片描述

4.3 其他说明

  • 哈希冲突:不难理解,只要key的确定的,得到的哈希映射结果是固定的,就会分配到固定的分片固定的槽位。不同的key也可能被分配到相同的分片下的相同槽位,这就属于哈希冲突,这是无法避免的,一种解决方案是:创建一个链表结构来存储多个键值对。
  • 集群方便扩容和缩容:当扩容的时候,分片增加,重新分配槽位。比如扩容前有3个分片,槽位分别是0-5460、5461-10922、10923-16383,扩容后有4个分片,槽位分别是0-4095、4096-8191、8192-12287、12288-16383。扩容后会根据新的槽位分配迁移部分数据。也就是1的部分迁移到2,2的部分迁移到3…3的部分迁移到4。这并不影响key的查找和写入,因为具体的key映射结果是固定的,区别只是存储在那个分片。
  • 集群有多个master,每个master有多个slave。当某个master宕机后,内部的故障转移机制会选举出新的master,并不会重新分配槽位。
  • 槽位数是16384的原因:(1)正常的心跳包会携带一个节点的完整配置,它会以幂等的方式更新旧的配置,这意味着心跳包会附带当前节点的负责的哈希槽的信息。假设哈希槽采用 16384 ,则占空间 2kb(16384/8)。假设哈希槽采用 65536, 则占空间 8k(65536/8),这是令人难以接受的内存占用。(2)Redis Cluster 不太可能扩展到超过 1000 个主节点。
    也就是说,65536 个固然可以确保每个主节点有足够的哈希槽,但其占用的空间太大。而且,Redis Cluster 的主节点通常不会扩展太多,16384 个哈希槽完全足够用。
  • 集群在扩容和缩容期间如何保证提供服务:Redis Cluster 提供了重定向机制,两种不同的类型: (1)ASK 重定向 :可以看做是临时重定向,后续查询仍然发送到旧节点。(2) MOVED 重定向 :可以看做是永久重定向,后续查询发送到新节点。

5.Redis单线程与多线程

5.1 Redis是单线程还是多线程

这个问题不能简单的一概而论需要分Redis版本和操作类型来讨论:
Redis6之前:都是单线程,对数据的读写和IO多路复用都是单线程。
Redis6之后:引入了IO多线程(默认关闭)。之前是单线程IO多路复用同时处理多个客户端的请求。后来请过分析发现限制Redis性能的原因有:CPU、内存、IO。其中前两者一般管够,所以瓶颈就在IO,因此在Redis6引入了IO多线程,叠加多路复用,简直是快上加快。但是对数据的读写都是单线程,因此不会涉及到线程不安全的问题,也不会涉及到加锁的问题。

5.2 Redis为什么快

  • 基于内存操作:运算相比于在磁盘速度更快。
  • 高效数据结构:例如哈希结构对查找和插入很友好,时间复杂度只有O(1)。
  • 单线程:避免了多线程切换上下文和资源竞争激烈。
  • IO多路复用:多路复用能同时监听处理多个客户端的请求,尤其引入多线程IO后快上加快

5.3 主线程和IO多线程的协作流程

在这里插入图片描述

6.布隆过滤器(BloomFilter)

6.1 什么是布隆过滤器

布隆过滤器由初始值为0的bit数组和多个哈希函数构成,一般用于查询某个key是否存在于集合中。

6.2 布隆过滤器原理

  • 添加key
    初始化bit数组为0,将要存储的key经过多个哈希函数映射,对数组长度取模得到数组下标,多个哈希函数得到多个函数下标,将这些下标置1即完成了添加。
    在这里插入图片描述

  • 查询key
    注意:查询的前提是数据已经存在了bit数组中了。
    将要查询的key经过多个哈希函数的映射取模后得到下标,当下标处有0的时候,肯定不存在。当下标全是1的时候,可能存在误判
    **误判原因:哈希冲突。**不同的key经过哈希映射取模后可能得到的是同样的下标。例如bit数组中存储的是康师傅,但是要查询的是康帅傅,二者经过哈希函数映射和取模后下标一样,这时就出现了误判。

6.3 优缺点和使用场景

  • 优点:高效查询和插入。
  • 缺点:不能删除,因为哈希冲突会存在误判。
  • 应用场景:缓存穿透。垃圾邮件识别等

7. 缓存雪崩、穿透、击穿

7.1 缓存雪崩

  • 什么是缓存雪崩
    缓存雪崩一方面指服务器宕机,另一方面指在短时间内大量的缓存过期,大量请求短时间内落到数据库上,犹如雪崩。
  • 如何解决或避免
    (1)集群缓存:cluster或者主从复制+哨兵
    (2)限流:对客户端的访问限制
    (3)多级缓存:本地缓存+redis缓存
    (4)设置缓存永不过期

7.2 缓存穿透

  • 什么是缓存穿透
    redis缓存中和数据库中都没有数据,大量的请求不断的打到数据库上造成压力。
  • 如何解决或避免
    (1)缓存无效的key:如果缓存和数据库都查不到某个 key 的数据就写一个到 Redis 中去并设置过期时间
    (2)布隆过滤器
    在这里插入图片描述

7.3 缓存击穿

  • 什么是缓存击穿
    大量热key过期,此时缓存并不存在但是数据库中存在,大量的请求会落到数据库上。
  • 如何解决或避免
    (1)对热key失效时间差异化。比如秒杀场景下设置数据过期时间晚于秒杀结束时间。
    (2)加锁策略:对多个用户请求同一个key,第一个用户请求后加锁,防止其他用户再请求。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1535051.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(Ubuntu中调用相机花屏)Astra plus深度相机--rgb彩色图像花屏解决方法之一

在调试深度相机的过程中只能能调出深度图像和红外图像 在rviz的image的topic中选择彩色图像的话题不显示图像 1、查看相机的usb序列号 lsusb如上图所示&#xff0c;此相机的USB序列号是2bc5:050f,2bc5:060f 其中050f是显示彩色图像的 在这里可通过拔插相机来确定序列号是哪几…

经典Bug永流传---每周一“虫”(四十五)

如果有人错过机会&#xff0c;多半不是机会没来&#xff0c;而是因为机会过来时&#xff0c;没有一伸手抓住它。 大写W惹的祸 前提&#xff1a; A账号已登录 步骤&#xff1a; 打开某商品链接&#xff0c;然后在商品的评论区任意一条评论&#xff0c;点击回复&#xff0c;回…

0基础学习VR全景平台篇第146篇:为什么需要3D元宇宙编辑器?

一.什么是3D元宇宙编辑器&#xff1f; 3D元宇宙编辑器是全新3DVR交互渲染创作工具&#xff0c;集3D建模、虚拟展厅、AI数字人等能力&#xff0c;渲染和虚拟现实技术于一身的生产力工具。 具有跨平台和随时随地编辑等特点&#xff0c;可广泛应用于展会、展厅、博物馆、可视化园…

Unity 粒子在UI中使用时需要注意的地方

最近项目中要在UI中挂载粒子特效,美术给过来的粒子直接放到UI中会有一些问题,查询一些资料后,总结了一下 一: 粒子的大小发生变化,与在预制件编辑中设计的大小不同 在预制件编辑模式下,大小正常 实际使用的时候特别大或者特别小 经过检查,发现预制件编辑模式下,默认画布的Rend…

[Semi-笔记] 2023_TIP

目录 概要一&#xff1a;Conservative-Progressive Collaborative Learning&#xff08;保守渐进式协作学习&#xff09;挑战&#xff1a;解决&#xff1a; 二&#xff1a;Pseudo Label Determination for Disagreement&#xff08;伪标签分歧判定&#xff09;挑战&#xff1a;…

基于Spring Boot+Vue的车辆管理系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

python共享单车信息系统的设计与实现flask-django-php-nodejs

课题主要分为二大模块&#xff1a;即管理员模块和用户模块&#xff0c;主要功能包括&#xff1a;用户、区域、共享单车、单车租赁、租赁归还、报修信息、检修信息等&#xff1b; 语言&#xff1a;Python 框架&#xff1a;django/flask 软件版本&#xff1a;python3.7.7 数据库…

【MySQL】8. 基本查询(update/delete/聚合/分组)

表的删改 3. Update 语法&#xff1a; UPDATE table_name SET column expr [, column expr ...] [WHERE ...] [ORDER BY ...] [LIMIT ...]对查询到的结果进行列值更新 案例&#xff1a; 3.1 将孙悟空同学的数学成绩变更为 80 分 -- 更新值为具体值 -- 查看原数据 SELECT…

由浅到深认识Java语言(9):Eclipse IDE简介

该文章Github地址&#xff1a;https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板&#xff08;Github仓库地址&#xff1a;https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址&#xff1a;https://blog.c…

【理解机器学习算法】之Clustering算法(DBSCAN)

DBSCAN&#xff08;基于密度的空间聚类应用噪声&#xff09;是数据挖掘和机器学习中一个流行的聚类算法。与K-Means这样的划分方法不同&#xff0c;DBSCAN特别擅长于识别数据集中各种形状和大小的聚类&#xff0c;包括存在噪声和离群点的情况。 以下是DBSCAN工作原理的概述&am…

uinapp开发-PHP语言-后端安装说明-适用于圈子-陪玩-交友-校园-团购-外卖-分销等多系统-APP小程序H5多端皆有!

后端安装说明 全新安装客户&#xff0c;按此安装调试步骤&#xff0c;请按顺序&#xff1a; ** 后台安装步骤及说明 ** 1、在服务器里安装宝塔。下载www.bt.cn。 宝塔安装完毕后&#xff0c;安装环境&#xff0c;Nginx或者Apache 请选择PHP7.3 数据库mysql5.6。 NGINX 1.22.1轻…

The plain HTTP request was sent to HTTPS port

异常信息 原因 错误信息 “The plain HTTP request was sent to HTTPS port” 表明客户端尝试使用未加密的HTTP协议发送请求到一个配置为使用加密的HTTPS协议的端口。 解决方案 要解决这个问题&#xff0c;需要确保使用正确的协议和端口号进行请求。应该使用的HTTPS前缀。例如…

vue基础——java程序员版(vue路由)

1、引入路由 在控制台执行vue ui&#xff0c;在插件市场里可以找到vue-router并导入。 ​ 一般情况下&#xff0c;vue会自动在main,js中引入vue-router&#xff0c;如下&#xff1a; import Vue from vue import App from ./App.vue import ./plugins/element.js import rou…

python研究生志愿填报辅助系统flask-django-php-nodejs

二十一世纪我们的社会进入了信息时代&#xff0c;信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

归并算法详细解析

归并排序 1945年&#xff0c;约翰冯诺依曼&#xff08;John von Neumann&#xff09;发明了归并排序&#xff0c;这是典型的分治算法的应用。归并排序&#xff08;Merge sort&#xff09;是建立在归并操作上的一种有效的排序算法&#xff0c;该算法是采用分治法&#xff08;Di…

二、Web3 学习(区块链)

区块链基础知识 一、基础知识1. 区块链可以做什么&#xff1f;2. 区块链的三个特点 二、区块链的类型概括1. PoW2. PoS3. 私有链和联盟链 三、智能合约1. 什么是智能合约2. 如何使用智能合约 四、困境1. 三难选择的基本要素2. 这真的是一个三难选择吗? 五、比特币1. 什么是比特…

【PyCaret】使用PyCaret创建机器学习Pipeline进行多分类任务

发现一个好东西&#xff0c;PyCaret机器学习Pipeline&#xff0c;记录一下用其进行多分类任务的使用方法。 1、简介 PyCaret是一个开源的、不用写很多代码的Python机器学习库&#xff0c;可以自动化机器学习工作流程&#xff0c;是一个端到端的机器学习和模型管理工具&#xff…

WPS 按数值大小显示渐变颜色

选中数据 条件格式 > 色阶 > 其他规则 新建格式规则 基于各自值设置所有单元格的格式三色刻度中间值选择 数字、0、白色

新能源汽车充电桩站点烟火AI识别检测算法应用方案

新能源汽车作为现代科技与环保理念的完美结合&#xff0c;其普及和应用本应带给人们更加便捷和绿色的出行体验。然而&#xff0c;近年来新能源汽车充电火灾事故的频发&#xff0c;无疑给这一领域投下了巨大的阴影。这不禁让人深思&#xff0c;为何这一先进的交通工具在充电过程…

机器学习——决策树(四)后剪枝

观前提示&#xff1a;这是本人决策树相关的第四篇博文&#xff0c;前3篇的内容如下&#xff1a; 1、建造训练集的决策树【完成结点类编写和建树过程】 2、用验证集评估模型、选出泛化较好的数据划分方式训练模型 3、预剪枝 读者可根据需要从上方《机器学习》专栏中查阅对应…