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

Redis 学习笔记(2)

目录

  • 1 Redis的持久化
    • 1.1 RDB持久化方案
    • 1.2 AOF持久化方案
  • 2 Redis架构
    • 2.1 主从复制架构
    • 2.2 哨兵集群设计
    • 2.3 哨兵集群设计
  • 3 Redis事务机制
  • 4 Redis过期策略与内存淘汰机制
    • 4.1 过期策略
    • 4.2 内存淘汰机制
  • 5 Redis高频面试题
    • 4.1 缓存穿透
    • 4.2 缓存击穿
    • 4.3 缓存雪崩

1 Redis的持久化


由于 redis 是一个内存数据库,所有的数据都是保存在内存当中的,内存当中的数据极易丢失,所以 redis 的数据持久化就显得尤为重要,在redis当中,提供了两种数据持久化的方式,分别为RDB以及AOF,且Redis默认开启的数据持久化方式为RDB方式。

1.1 RDB持久化方案


RDB方案是Redis默认的持久化方案。

  • 按照一定的时间内,如果Redis内存中的数据产生了一定次数的更新,就将整个Redis内存中的所有数据拍摄一个全量快照文件存储在硬盘上
  • 新的快照会覆盖老的快照文件,快照是全量快照,包含了内存中所有的内容,基本与内存一致。
  • 如果Redis故障重启,从硬盘的快照文件进行恢复。

在这里插入图片描述

RDB快照存储于Redis目录下datas文件夹下dump.rdb

触发条件

  • 手动触发:当执行某些命令时,会自动拍摄快照【一般不用】
    • save:手动触发拍摄RDB快照的,将内存的所有数据拍摄最新的快照
      • 前端运行
      • 阻塞所有的客户端请求,等待快照拍摄完成后,再继续处理客户端请求
      • 特点:快照与内存是一致的,数据不会丢失,用户的请求会被阻塞
    • bgsave:手动触发拍摄RDB快照的,将内存的所有数据拍摄最新的快照
      • 后台运行
      • 主进程会fork一个子进程负责拍摄快照,客户端可以正常请求,不会被阻塞
      • 特点:用户请求继续执行,用户的新增的更新数据不在快照中
    • shutdown:执行关闭服务端命令
    • flushall:清空,没有意义
  • 自动触发:按照一定的时间内发生的更新的次数,拍摄快照
    • 配置文件中有对应的配置,决定什么时候做快照
#Redis可以设置多组rdb条件,默认设置了三组,这三组共同交叉作用,满足任何一个都会拍摄快照
save 900 1
save 300 10
save 60 10000

为什么默认设置3组?如果只有一组策略,面向不同的写的场景,会导致数据丢失。针对不同读写速度,设置不同策略,进行交叉保存快照,满足各种情况下数据的保存策略。

总结:

  • 优点
    • rdb方式实现的是全量快照,快照文件中的数据与内存中的数据是一致的
    • 快照是二进制文件,生成快照加载快照都比较快,体积更小
    • Fork进程实现,性能更好
    • 总结:更快、更小、性能更好
  • 缺点
    • 存在一定概率导致部分数据丢失
  • 应用:希望有一个高性能的读写,不影响业务,允许一部分的数据存在一定概率的丢失【做缓存】,大规模的数据备份和恢复

1.2 AOF持久化方案


RDB存在一定概率的数据丢失,如何解决?

AOF方案

  • 按照一定的规则,将内存数据的操作日志追加写入一个文件中;
  • 当Redis发生故障,重启,从文件中进行读取所有的操作日志,恢复内存中的数据;
  • 重新对Redis进行执行,用于恢复内存中的数据。

在这里插入图片描述

追加的规则

  • appendfsync always
    • 每更新一条数据就同步将这个更新操作追加到文件中
    • 优点:数据会相对安全,几乎不会出现数据丢失的情况
    • 缺点:频繁的进行数据的追加,增大磁盘的IO,导致性能较差
  • appendfsync everysec(常用)
    • 每秒将一秒内Redis内存中数据的操作异步追加写入文件
    • 优点:在安全性和性能之间做了权衡,性能要比always高
    • 缺点:有数据丢失风险 ,但最多丢失1秒
  • appendfsync no
    • 交给操作系统来做,不由Redis控制
    • 肯定不用的

总结

  • 优点:安全性和性能做了折中方案,提供了灵活的机制,如果性能要求不高,安全性可以达到最高
  • 缺点
    • 这个文件是普通文本文件,相比于二进制文件来说,每次追加和加载比较慢
    • 数据的变化以追加的方式写入AOF文件
      • 问题:文件会不断变大,文件中会包含不必要的操作【过期的数据】
      • 解决:模拟类似于RDB做全量的方式,定期生成一次全量的AOF文件
  • 应用:数据持久化安全方案,理论上绝对性保证数据的安全

持久化方案:两种方案怎么选?

  • 两种方案都可以用:默认不配置AOF,使用的RDB
  • 问题:两种都用,重启Redis加载的是谁的数据?
    • 加载AOF

2 Redis架构


  • Redis的服务只有单台机器
  • 问题1:单点故障问题,如果Redis服务故障,整个Redis服务将不可用
    • 单点故障问题
  • 问题2:单台机器的内存比较小,数据存储的容量不足,会导致redis无法满足需求
    • 单机资源不足问题
  • 解决方案:分布式

2.1 主从复制架构


在这里插入图片描述

分布式主从架构

  • Master:主节点
    • 负责对外提供数据的读写
  • Slave:从节点
    • 负责对外提供的请求
    • 负责与主节点同步数据

特点:主从节点上的数据都是一致的,连接任何一个节点实现读,默认写操作只能连接主节点

优缺点:

  • 优点:实现了读写分离,分摊了读写的压力负载,如果一台Redis的Slave故障,其他的Redis服务节点照常对外提供服务
    • 解决了Redis单点故障问题
  • 缺点:如果Master故障,整个集群不能对外提供写的操作,Master没有HA机制
    • 带来了Master单点故障问题

2.2 哨兵集群设计


主从复制集群的Master存在单点故障问题,怎么解决?

  • 类似于ZK的设计
    • 每台节点存储的数据都是一样的
    • 如果Leader故障,允许Follower选举成为Leader

哨兵设计

  • 思想:基于主从复制模式之上封装了哨兵模式,如果Master出现故障,让Slave选举成为新的Master

  • 实现哨兵进程 实现

    • 必须能发现Master的故障
    • 必须负责重新选举新的Master

在这里插入图片描述

Redis主从架构

  • 哨兵进程
    • 每个哨兵负责监听所有Redis节点和其他哨兵
    • 为什么要监听所有Redis的节点:发现所有节点是否会出现故障
      • 如果Master出现故障,会进行投票选择一个Slave来成为新的Master
    • 为什么要监听别的哨兵:如果哨兵故障,不能让这个哨兵参与投票选举等

哨兵功能

  • 集群监控:监控节点状态
  • 消息通知:汇报节点状态
  • 故障转移:实现Master重新选举
  • 配置中心:实现配置同步

流程

  • step1:如果Master突然故障,有一个哨兵会发现这个问题,这个哨兵会立即通告给所有哨兵
    • 主观性故障【sdown】
  • step2:当有一定的个数的哨兵都通告Master故障了,整体认为Master故障了
    • 客观性故障【odown】
  • step3:所有哨兵根据每台Slave通信的健康状况以及Slave权重选举一个新的Master
  • step4:将其他所有的Slave的配置文件中的Master切换为当前最新的Master

2.3 哨兵集群设计


Redis哨兵集群中的存储容量只有单台机器,如何解决大量数据使用Redis存储问题?

分片集群模式:解决了单点故障和单机资源不足的问题。

  • 将多个Redis小集群从逻辑上合并为一个大集群,每个小集群分摊一部分槽位,对每一条Redis的数据进行槽位计算,这条数据属于哪个槽位,就存储对应槽位的小集群中

分片的规则:根据Key进行槽位运算:CRC16【K】 & 16383 = 0 ~ 16383

在这里插入图片描述

在这里插入图片描述

3 Redis事务机制


事务定义:事务是数据库操作的最小工作单元,包含原子性、一致性、隔离性、持久性

Redis事务:Redis一般不用事务

  • Redis本身是单线程的,所以本身没有事务等概念

  • Redis 支持事务的本质是一组命令的集合事务支持一次执行多个命令,串行执行每个命令。将一组需要一起执行的命令放在multiexec之间

  • 一旦Redis开启了事务,将所有命令放入一个队列中,提交事务时,对整个队列中的命令进行执行

  • redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令

  • 没有隔离性:批量的事务命令执行前在缓存队列中,没有事务交叉,不存在脏读幻读等问题

  • 不能保证原子性:单条命令是原子性执行的,但事务不保证原子性,且没有回滚机制,事务中任意命令执行失败,其余的命令仍会被执行。

  • 过程

    • 开启事务
    • 提交命令
    • 执行事务
  • 命令

    • multi:开启事务
    • exec:执行事务
    • discard:取消事务

测试

  • 正常使用

    set user1 hadoop1
    set user2 hadoop2
    get user1
    get user2
    multi
    set user1 hadoop3
    set user2 hadoop4
    exec
    get user1
    get user2
    

都执行

  • 语法【编译】错误

    flushdb
    set user1 hadoop1
    set user2 hadoop2
    get user1
    get user2
    multi
    set user1 hadoop3
    sets user2 hadoop4
    exec
    get user1
    get user2
    

都不执行

  • 类型【运行】错误

    flushdb
    set user1 hadoop1
    set user2 hadoop2
    get user1
    get user2
    multi
    set user1 hadoop3
    lpush user2 hadoop4 # 运行错误
    exec
    get user1
    get user2
    

    user1执行,user2不执行

  • 取消事务

    flushdb
    set user1 hadoop1
    set user2 hadoop2
    get user1
    get user2
    multi
    set user1 hadoop3
    set user2 hadoop4
    discard
    get user1
    get user2
    

都不执行

总结:

  • Redis 的事务机制很弱,在事务回滚机制上,只能对基本的语法错误进行判断。
  • 事务是Redis实现在服务端的行为,用户执行multi命令时,服务器会将对应这个用户的客户端对象设置为一个特殊的状态,在这个状态下后续用户执行的命令不会被真的执行,而是被服务器缓存起来,直到用户执行exec命令为止,服务器会将这个用户对应的客户端对象中缓存的命令按照提交的顺序依次执行。

4 Redis过期策略与内存淘汰机制


Redis使用的是内存,内存如果满了,怎么解决?

4.1 过期策略


设计思想:避免内存满,指定Key的存活时间,到达存活时间以后自动删除。命令:expire/setex

  • 定时过期:指定Key的存活时间,一直监听这个存活时间,一旦达到存活时间,自动删除
    • 需要CPU一直做监听,如果Key比较多,CPU的消耗比较严重
  • 惰性过期:指定Key的存活时间,当使用这个Key的时候,判断是否过期,如果过期就删除
    • 如果某个Key设置了过期时间,但是一直没有使用,不会被发现过期了,就会导致资源浪费
  • 定期过期:每隔一段时间就检查数据是否过期,如果过期就进行删除
    • 中和的策略机制

Redis中使用了惰性过期定期过期两种策略共同作用

4.2 内存淘汰机制


设计思想:内存满了,怎么淘汰

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据, Redis 源码中的默认配置

实际项目中设置内存淘汰策略:maxmemory-policy allkeys-lru,移除最近最少使用的key。

  • 缓存使用:allkeys-lru
  • 数据库使用:volatile-lru / noeviction

5 Redis高频面试题


在应用程序和MySQL数据库中建立一个中间层:Redis缓存,通过Redis缓存可以有效减少查询数据库的时间消耗,但是引入redis又有可能出现缓存穿透缓存击穿缓存雪崩等问题。

在这里插入图片描述

4.1 缓存穿透


缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。

总的来说,查询Key,缓存和数据源都没有,频繁查询数据源。比如用一个不存在的用户 id 获取用户信息,无论论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。

解决缓存穿透的方案主要有两种:

  • 当查询不存在时,也将结果保存在缓存中。但是这可能会存在一种问题:大量没有查询结果的请求保存在缓存中,这时我们就可以将这些请求的key设置得更短一些;
  • 提前过滤掉不合法的请求,可以使用Redis中布隆过滤器

布隆过滤器可能存在误判,意思就是某个数据可能不存在,但是可能误判为存在。

在这里插入图片描述

4.2 缓存击穿


缓存击穿:key对应的数据库存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

总的来说,查询Key,缓存过期,大量并发,频繁查询数据源。

业界比较常用的做法:使用互斥锁。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db(查询数据库),而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,就是只让一个线程构建缓存,其他线程等待构建缓存的线程执行完,重新从缓存获取数据。

在请求数据库这一步进行上锁,这个时候只有一个线程可以抢到这个锁,这个线程查询到数据库再重新将数据写入缓存,其他线程再去缓存中查询。

4.3 缓存雪崩


缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。

总的来说,缓存不可用(服务器重启或缓存失效),频繁查询数据源。

与缓存击穿的区别在于这里针对很多key缓存,前者则是某一个key。缓存正常从Redis中获取,示意图如下:

在这里插入图片描述

缓存失效瞬间示意图如下:

在这里插入图片描述

缓存失效时的雪崩效应对底层系统的冲击非常可怕!大多数系统设计者考虑用加锁或者队列的方式保证来保证不会有大量的线程对数据库一次性进行读写,从而避免失效时大量的并发请求落到底层存储系统上。还有一个简单方案就时将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

相关文章:

Redis 学习笔记(2)

目录 1 Redis的持久化1.1 RDB持久化方案1.2 AOF持久化方案 2 Redis架构2.1 主从复制架构2.2 哨兵集群设计2.3 哨兵集群设计 3 Redis事务机制4 Redis过期策略与内存淘汰机制4.1 过期策略4.2 内存淘汰机制 5 Redis高频面试题4.1 缓存穿透4.2 缓存击穿4.3 缓存雪崩 1 Redis的持久化…...

快慢指针:删除有序数组中的重复项

题目链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 思路好想&#xff0c;代码实现不好想 class Solution {public int removeDuplicates(int[] nums) {int fast 1,slow 1;while(fast < nums.length){if(nums[fast] ! nums[fast-1]){nums[slow] nums[fast]…...

用户登录错误次数太多锁定账号

当用户登录验证码错误次数太多时&#xff0c;需要限制用户在10分钟之内不能再次登录。 限制方案&#xff1a; 1.通过Redis ZSet key可以设置为用户名&#xff0c;value可以设置为UUID&#xff0c;score设置为当前时间戳 每次用户登录时&#xff0c;通过 rangeByScore 查询对…...

tedsign vue3 web-端框架中封装一个验证码组件 以及对应node 接口逻辑说明

一个这样的组件 我直接上代码了 <template><t-loading size"small" :loading"loading" show-overlay><div class"container" click"refresh"><div v-if"svg" class"svg" v-html"svg&…...

探索Scala并发编程之巅:高效并行处理的艺术

标题&#xff1a;探索Scala并发编程之巅&#xff1a;高效并行处理的艺术 引言 在现代软件开发中&#xff0c;随着多核处理器的普及&#xff0c;编写能够充分利用硬件能力的并发程序变得至关重要。Scala&#xff0c;这门结合了面向对象和函数式编程特性的语言&#xff0c;提供…...

AudioLM: 音频生成的革命性模型

AudioLM: 音频生成的革命性模型 AudioLM是一种革命性的音频生成模型&#xff0c;它结合了深度学习和自然语言处理的先进技术&#xff0c;能够生成高质量、逼真的音频内容。本文将探讨AudioLM的基本原理、工作机制、应用场景以及对音频生成领域的影响和未来发展方向。 一、Aud…...

C++ Vector的模拟实现

vector的介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而…...

Kubernetes之Controller详解

本文尝试从Kubernetes Controller的种类、交互逻辑、最佳实践、伪代码示例及历史演进5个方面对其进行详细阐述&#xff0c;希望对您有所帮助&#xff01; 一、Kubernetes Controller种类 Kubernetes Controller Manager 是 Kubernetes 集群的核心组件之一&#xff0c;负责管理…...

openlayers性能优化——开启图层预加载、减少空白等待时间

使用切片图层时、地图拖拽会有空白图片&#xff0c;为了减少空白等待时间&#xff0c;我们可以开始图层预加载。 const map_top new Map({layers: [new TileLayer({preload:Infinity, //预加载source: new StadiaMaps({layer: "outdoors",}),}),],target: "ma…...

BlockingQueue详解(含动画演示)

目录 BlockingQueue详解0、BlockingQueue简介BlockingQueue接口中方法注释BlockingQueue的实现&#xff0c;总结计划 1、ArrayBlockingQueue简介2、ArrayBlockingQueue的继承体系3、ArrayBlockingQueue的构造方法①、 ArrayBlockingQueue(int capacity)②、ArrayBlockingQueue(…...

wordpress商用付费主题与免费主题的区别

WordPress免费主题与WordPress付费主题&#xff0c;都可以用&#xff0c;但存在非常大的差别。从直观的感受&#xff0c;简单地说就是&#xff0c;WordPress免费主题能用&#xff0c;WordPress付费主题好用。如果涉及到其它的方面&#xff0c;WordPress商用付费主题与免费主题之…...

【ARM Trace32(劳特巴赫) 使用介绍 2.7 -- bat 脚本传参数给 trace32 cmm 脚本】

请阅读【Trace32 ARM 专栏导读】 文章目录 bat 脚本传参数给 trace32脚本可变参数传入CMM 脚本接收参数运行BAT脚本bat 脚本传参数给 trace32脚本 在使用 Trace32 的过程中,如果每次都是通过GUI 界面来操作,是习惯使用命令行工作的人所不能忍受的!!!,那么能不同通过脚本…...

NavicatforMySQL11.0软件下载-NavicatMySQL11最新版下载附件详细安装步骤

我们必须承认Navicat for MySQL 支援 Unicode&#xff0c;以及本地或远程 MySQL 服务器多连线&#xff0c;使用者可浏览数据库、建立和删除数据库、编辑数据、建立或执行 SQL queries、管理使用者权限&#xff08;安全设定&#xff09;、将数据库备份/复原、汇入/汇出数据&…...

弱监督学习

弱监督学习&#xff08;Weak Supervision&#xff09;是一种利用不完全、不精确或噪声数据进行模型训练的方法。以下是一些常用的弱监督方法及其原理&#xff1a; 1. 数据增强&#xff08;Data Augmentation&#xff09; 原理&#xff1a; 数据增强是一种通过增加训练数据的多…...

代码随想录算法训练营第五十天|LeetCode1143 最长公共子序列、LeetCode1035 不相交的线、LeetCode53 最大子数组和

题1&#xff1a; 指路&#xff1a;1143. 最长公共子序列 - 力扣&#xff08;LeetCode&#xff09; 思路与代码&#xff1a; 类似于最长重复子数组&#xff0c;我们依旧定义一个二维数组dp[i][j]&#xff0c;其含义为从0到以i-1结尾的nums1数组和从0到j-1结尾的nums2数组的最…...

百日筑基第三天-SOA初步了解

百日筑基第三天-SOA初步了解 SOA&#xff08;Service-Oriented Architecture&#xff0c;面向服务的架构&#xff09;是一种软件设计原则&#xff0c;它倡导将应用程序分解为独立的服务单元&#xff0c;这些服务通过定义良好的接口相互通信&#xff0c;以实现业务功能。而RPC&…...

「2024中国数据要素产业图谱1.0版」重磅发布,景联文科技凭借高质量数据采集服务入选!

近日&#xff0c;景联文科技入选数据猿和上海大数据联盟发布的《2024中国数据要素产业图谱1.0版》数据采集服务板块。 景联文科技是专业数据服务公司&#xff0c;提供从数据采集、清洗、标注的全流程数据解决方案&#xff0c;协助人工智能企业解决整个AI链条中数据采集和数据标…...

条码二维码读取设备在医疗设备自助服务的重要性

医疗数字信息化建设的深入推进&#xff0c;医疗设备自助服务系统已成为医疗服务领域的一大趋势&#xff0c;条码二维码读取设备作为自助设备的重要组成部分&#xff0c;通过快速、准确地读取条形码二维码信息&#xff0c;不公提升了医疗服务效率&#xff0c;还为患者提供了更加…...

centos 7.8 安装sql server 2019

1.系统环境 centos 7.8 2.数据库安装文件准备 下载 SQL Server 2019 (15.x) Red Hat 存储库配置文件 sudo curl -o /etc/yum.repos.d/mssql-server.repo https://packages.microsoft.com/config/rhel/7/mssql-server-2019.repo 采用yum源进行不安装下载,这时yum 会自动检测…...

Android焦点机制结合WMS

文章前提&#xff1a; 了解WMS基本作用了解window的概念&#xff0c;phoneWindow&#xff0c;rootViewImpl了解view的事件分发 开始&#xff1a; 讲三件事情&#xff1a; window的创建&#xff0c;更新焦点的更新事件的分发 Window的创建&#xff0c;更新&#xff1a; wi…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

Python竞赛环境搭建全攻略

Python环境搭建竞赛技术文章大纲 竞赛背景与意义 竞赛的目的与价值Python在竞赛中的应用场景环境搭建对竞赛效率的影响 竞赛环境需求分析 常见竞赛类型&#xff08;算法、数据分析、机器学习等&#xff09;不同竞赛对Python版本及库的要求硬件与操作系统的兼容性问题 Pyth…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

Springboot 高校报修与互助平台小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;高校报修与互助平台小程序被用户普遍使用&#xff0c;为…...

使用VMware克隆功能快速搭建集群

自己搭建的虚拟机&#xff0c;后续不管是学习java还是大数据&#xff0c;都需要集群&#xff0c;java需要分布式的微服务&#xff0c;大数据Hadoop的计算集群&#xff0c;如果从头开始搭建虚拟机会比较费时费力&#xff0c;这里分享一下如何使用克隆功能快速搭建一个集群 先把…...