Redis面试
1.说说什么事redis
Redis是一种基于键值对的NoSql数据库。
 Redis中的value支持string(字符串)、hahs(哈希)、list、set、zset(有序集合)、bitmaps(位图),HyperLoglog等数据结构
2.redis可以用来干啥

3.Redis的5中数据结构
- String类型:主要使用场景 缓存功能、计数、共享session、限速
- hash类型是指键值本身又是一个键值对 ,使用场景:缓存用户信息,缓存对象
- list用来存储多个有序的字符串,可以充当栈和队列的角色,适用场景消息队列、文章队列
- set保存多个字符串元素,不允许有重复的元素,是无序的。场景标签、共同关注
- sorted set有序集合可以进行排序,和使用索引下标的不同,它可以给每个元素设置一个权重(score)作为排序的依据。使用场景用户点赞统计、用户排序
- bit可以用作签到
4.Redis为什么那么快
单机的Redis可以支撑每秒10几万的并发
- 完全基于内存操作
- 使用单线程操作,避免了线程的切换和竞态产生的消耗
- 基于非阻塞的IO多路复用机制
- C语言的实现,优化过的数据结构,基于几种数据结构,redis做了大量的优化,性能极高
5.Redis6.0使用多线程是怎么回事
Redis6.0的多线程是用多线程来处理数据的读写和协议解析,但是Redis执行命令还是单线程的。这样做的目的是因为Redis的性能瓶颈是在IO上而非CPU,使用多线程能提升IO读写的效率,从而提高整体的Redis 性能
6.Redis的持久化方案
redis持久化分为RDB和AOF两种
- RDB持久化:是把当前的进程数据生成快照保存到硬盘的过程,触发RDB可以分为手动和自动。手动触发分别对应的是save和bgsave命令

- save命令:阻塞当前redis服务器,知道RDB过程结束,对应内存较大的实例会阻塞过长的时间,线上环境不建议使用。
- bgsave命令:Redis进程执行fork操作创建子进程,RDB持久化由子进程负责,完成后自动结束,阻塞只发生在fork阶段,一般时间很短。
以下场景触发自动保存:
- 使用save相关配置,如save m n表示m秒内触发n次修改,自动触发bgsave。
- 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点
- 执行debug,reload命令重新加载redis时候,也会自动触发save操作
- 默认情况执行shutdown命令时候,如果没有开启AOF持久化功能则自动执行bgsave命令。
AOF
 AOF持久化:以独立日志的方式记录每次写命令,重启时候在重新执行AOF文件中的命令以达到恢复数据的目的。AOF主要作用是解决数据持久化的实时性,目前是redis持久化主流方式
 AOF工作流程如下:命令写入、文件同步、文件重写、重启加载
 流程如下:
- 所以写入命令会追加到aof_buf(缓冲器中)。
- AOF缓冲区根据对应的策略向硬盘做同步操作
- 随着AOF文件越来越大,需要定期对AOF文件进行重写,达到压缩目的。
- 当Redis重启的时候,可以加载AOF文件进行数据恢复
7.RDB和AOF优缺点
RDB优点
 优点|1.只有一个紧凑的二进制文件dump.rdb,非常时候全量复制,备份的场景
 2. 容灾性好。可以把RDB文件拷贝到远程机器中或者文件系统,用于容灾恢复
 3. 恢复速度快,RDB数据恢复速度远远快于Aof的方式。
RDB缺点|
 1.实时性低,RDB是每隔一段时间持久化,没法做到实时持久化,如果在这间隔时间发生故障,数据会丢失。
 2.存在兼容问题,redis多个版本进化,存在低版本不能兼容新版本的问题。
AOF的优点
- 实时性好,aof可以通过配置appendsync属性,有always每进行一次命令操作就会记录到aof文件中。
- 通过append模式写文件,即使中途服务器宕机,也可以通过redis-check-aof工具解决数据一致性问题
AOF缺点
 1.AOF的文件比RDb大,恢复速度慢
 2.数据集大的时候,比RDB启动效率低。
8.RDB和AOF如何选择
- 一般来说如果想要达到媲美数据库的安全性,应该同时启用两种持久化方式。在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为这种情况下AOF保存的文件数据集要比RDB文件保存的数据集要完整。
- 如果可以接收数分钟的以内的数据丢失,那么可以只用RDB持久
- 很多用户只使用AOF持久化,但不推荐这种,因为定时生成RDB快照非常便于进行数据备份,并且RDB恢复数据速度也比AOF更加快速,此外,使用RDb还可以避免AOF的程序bug(老的不兼容新版本)
- 如果只需要数据在服务器进行运行,也可以不使用任何的持久化方式。
9.Redis数据恢复
当redis发生了故障,可以从rdb或者Aof中恢复数据,恢复过程就是把RDB或者AOF文件拷贝到Redis的数据目录下,如果使用AOF恢复,配置文件开启AOF,然后启动redis-server就可
 
Redis启动加载流程:
- 判断是否开启AOF,开启AOF且存在文件,加载AOF
- AOF关闭或者不存AOF文件在时候,加载RDB文件
- 加载AOF/RDB文件启动后,Redis启动成功
- AOF/RDB文件启动失败存在错误时候,打印错误信息。
10.Redis4.0的混合持久化了解吗
重启Redis我们很少使用Rbd来恢复内存状态,因为会丢失大量的使用数据,我们通常使用AOF日志重做,但是重放AOF日志性能能相对RDB来说慢很多,这样在Redis实例很大的情况下,启动需要花费很长时间。
 Redis4.0为了解决这个问题带来一个新的持久化选项------混合持久化。将rdb文件的内容和增量的AOF日志文件存在一起,这里的AOF日志不再是全量日志,而是自持久化开始到持久化结束这段时间发生的增量AOF日志,通常这部分AOF日志很小。于是在Redis重启时候,可以先加载rdb的内容,然后在重放增量AOF日志就可以完全替代之前AOF全量文件重放,重启效率因此大幅度提升。

11.高可用
Redis保证高可用主要有三种方式主从、哨兵、集群
12.Redis主从复制了解吗

 主从复制,是指将一台Redis 服务器的数据,复制到其他的Redis 服务器。前者称为主节点(master),后者称为从节
 点(slave)。且数据的复制是 单向 的,只能由主节点到从节点。Redis 主从复制支持主从同步 和 从从同步两种,后
 者是Redis后续版本新增的功能,以减轻主节点的同步负担
主从复制的作用
- 数据冗余:主从复制实现了数据的热备份,是持久化的一种
- 故障恢复:当主节点出现问题时候,可以由从节点提供服务,实现快速的故障恢复
- 负责均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,从节点提供读服务,分担服务器负载。尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis 服务器的并发量。
- 高可用基石:还是哨兵和集群实现的基础
13.Redis有几种常见的拓扑结构
- 一主一从:一主一从结构是最简单的复制拓扑结构,用于主节点出现宕机时从节点提供故障转移支持
- 一主多从:一主多从结构(又称为星形拓扑结构)使得应用端可以利用多个从节点实现读写分离(见图6-5)。对于读占比较大的场景,可以把读命令发送到从节点来分担主节点压力
- 树状主从:树状主从结构(又称为树状拓扑结构)使得从节点不但可以复制主节点数据,同时可以作为其他从节点的主节点继续向下层复制。通过引入复制中间层,可以有效降低主节点负载和需要传送给从节点的数据量
  
14.Redis主从复制原理
1 保存主节点信息ip和端口
 2. 主从建立连接:从节点发现新的主节点后,会尝试和主节点建立网络连接
 3. 发送ping命令:连接建立成功后从节点发送ping请求进行首次通信,主要是检测主从之间网络套接字是否可用、主节点当前是
 否可接受处理命令。
 4.权限验证:如果主节点要求密码验证,从节点必须正确的密码才能通过
 5.同步数据集,主从连接正常通信后,主节点会把持有的数据全部发送给从节点
 6.命令持续复制,接下来主节点会持续的将写命令发送给从节点,保证主从数据一致。
 
15.说说主从数据同步的方式
Redis在2.8以上的版本使用psync命令完成主从数据同步,同步过程分为全量复制和部分复制
 全量复制:一般用于初次复制场景,,当数据量较大时,会对主从节点和网络造成很大的开销
1.发送psync命令进行数据同步,由于是第一次进行复制,从节点没有复制偏移量和主节点的运行ID,所以发送
 psync-1。
- 主节点根据psync-1解析出当前为全量复制,回复+FULLRESYNC响应。
- 从节点接收主节点的响应数据保存运行ID和偏移量offset
- 主节点执行bgsave保存RDB文件到本地
- 主节点发送RDB文件给从节点,从节点把接收的RDB文件保存在本地并直接作为从节点的数据文件
- 对于从节点开始接收RDB快照到接收完成期间,主节点仍然响应读写命令,因此主节点会把这期间写命令数
 据保存在复制客户端缓冲区内,当从节点加载完RDB文件后,主节点再把缓冲区内的数据发送给从节点,保
 证主从之间数据一致性。
- 从节点接收完主节点传送来的全部数据后会清空自身旧数据
- 从节点清空数据后开始加载RDB文件
- 从节点成功加载完RDB后,如果当前节点开启了AOF持久化功能, 它会立刻做bgrewriteaof操作,为了保证
 全量复制后AOF持久化文件立刻可用
  
 部分复制:
 部分复制主要是针对全量复制的过高开销做的一种优化措施,使用psync{runId}{offset}命令实现。当从节点
 (slave)正在复制主节点(master)时,如果出现网络闪断或者命令丢失等异常情况时,从节点会向主节点要求补
 发丢失的命令数据,如果主节点的复制积压缓冲区内存在这部分数据则直接发送给从节点,这样就可以保持主从节
 点复制的一致性。
- 当主从节点之间网络出现中断时,如果超过repl-timeout时间,主节点会认为从节点故障并中断复制连接
- 主从连接中断期间主节点依然响应命令,但因复制连接中断命令无法发送给从节点,不过主节点内部存在的复
 制积压缓冲区,依然可以保存最近一段时间的写命令数据,默认最大缓存1MB。
- 当主从节点网络恢复后,从节点会再次连上主节点
- 当主从连接恢复后,由于从节点之前保存了自身已复制的偏移量和主节点的运行ID。因此会把它们当作psync参
 数发送给主节点,要求进行部分复制操作。
- 主节点接到psync命令后首先核对参数runId是否与自身一致,如果一致,说明之前复制的是当前主节点;之后
 根据参数offset在自身复制积压缓冲区查找,如果偏移量之后的数据存在缓冲区中,则对从节点发送+CONTINUE响应,表示可以进行部分复制。
- 主节点根据偏移量把复制积压缓冲区里的数据发送给从节点,保证主从复制进入正常状态。
16.主从同步的存在哪些问题
- 一旦主节点出现故障,就需要手动将一个从节点晋升为主节点,同时需要修改应用放的主节点地址,还需要命令其他从节点去复制主节点,整个过程都需要人工干预
- 主节点的写能力收到单机限制
- 主节点的存储能力收到单机限制
第一个是Redis的高可用问题,二三是分布式问题。
17.Redis Sentinel(哨兵)了解吗
主从复制存在没有办法自动故障转移,所以需要一个方案来完成自动转移,他就是redis sentinel 哨兵机制。
 
 Redis sentinel由哨兵节点和数据节点两部分组成
- 哨兵节点:哨兵系统由一个或者多个哨兵节点组成,哨兵节点是特殊的redis节点,不存储数据,对数据进行监控。
- 数据节点:主节点和从节点都是数据节点
在复制的基础上,哨兵实现了自动化故障恢复技术
- 监控:哨兵会不断地检查主节点和从节点是否正常
- 自动故障转移:当主节点不可用的时候,哨兵会自动开始故障转移操作,他会将失效的主节点移除,其中一个从节点升级为新的主节点,并让其他从节点复制新的主节点
- 配置提供者:客户端在初始化的时候,通过连接哨兵来获得当前Redis的主节点地址
- 通知:哨兵可以将故障转移的结果发个客户端
 其中,监控和自动故障转移功能,使得哨兵可以及时发现主节点故障并完成转移。而配置提供者和通知功能,则需要在与客户端的交互中才能体现
18.Redis Sentinel(哨兵)实现原理知道吗?
哨兵模式是通过哨兵节点完成对数据节点的监控、下线、故障转移
 
 Redis sentinel通过三个定时任务完成对各个节点的监控
 1.每隔10秒,每个Sentinel节点会向主节点和从节点发送info命令获取最新的拓扑结构
 2.每隔2秒,每个Sentinel节点会向Redis数据节点发送Sentinel,hello频道上发送该Sentinel节点对主节点的判断以及当前Sentinel节点的信息。
 3.每隔1秒每个Sentinel节点会向主节点,从节点,其余Sentinel节点发送一条ping命令,做一次心跳检测,来确认这些节点是否可达
主观下线和客观下线
 主观下线就是哨兵认为某个节点有问题,客观下线就是超过一定数量的哨兵节点认为主节点有问题。
**1.主观下线:**每个Sentinel节点每隔1秒对主节点,从节点、其他Sentinel节点发送ping命令做心跳检测,当这些节点超过dow-after-minlliseconds没有进行回复,那么就对该节点判断失败,这个行为叫做主观下线。
2.客观下线:当Sentinel下线的是主节点时,该Sentinel节点会通过Sentinel-is-master-down-by-addr命令向其他Sentinel节点询问对主节点的判断,当超过《quorum》个数,Sentinel节点认为主节点确实有问题,这是该Sentinel节点会做出客观下线的决定。
- 领导者Sentinel节点选举
 Sentinel节点直接会做一个领导者选举工作,选择一个Sentinel节点作为领导者进行故障转移的工作,Redis使用Raft算法实现领导者的选举
- 故障转移
 领导者选出的Sentinel节点负责故障转移,过程如下
  
- 在从节点列表中选出一个节点作为新的主节点,这一步是相对复杂一些的一步
- Sentinel领导者节点会对第一步选出来的从节点执行slaveof no one命令让其成为主节点
- Sentinel领导者节点会向剩余的从节点发送命令,让它们成为新主节点的从节点
- Sentinel节点集合会将原来的主节点更新为从节点,并保持着对其关注,当其恢复后命令它去复制新的主节点
19.领导者Sentinel节点选举了解吗
Redis实现Raft算法实现领导者选举
 
- 每个在线的Sentinel节点都有资格成为领导者,当它确认主节点主观 下线时候,会向其他Sentinel节点发送sentinel is-master-down-by-addr命令, 要求将自己设置为领导者
- 收到命令的Sentinel节点,如果没有同意过其他Sentinel节点的请求,那么将同意该请求,否则拒绝
- 如果该Sentinel节点发现自己的票数已经大于于max(quorum,num(sentinels)/2+1),那么将成为领导者
- 如果此过程没有选出领导者,将进入下一次选举。
20.新的主节点是怎样被挑选出来的

- 过滤:不健康(主观下线,断线)、5秒内没有回复过的、失联超过10秒的
- 选择slave-proority(从节点优先级)最高的从节点列表,如果存在则返回,不存在就继续
- 选择复制偏移量最大的从节点(复制的最完整),如果存在则返回,不存在继续
- 选择runid最小的节点。
ps:请一键三连,给个关注,我们一起进步。
相关文章:
 
Redis面试
1.说说什么事redis Redis是一种基于键值对的NoSql数据库。 Redis中的value支持string(字符串)、hahs(哈希)、list、set、zset(有序集合)、bitmaps(位图),HyperLoglog等数…...
贪吃蛇(C)
游戏背景:贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 总: 游戏设计大纲: 使⽤C语⾔在Windows环境的控制台中模拟实现经典⼩游戏贪吃蛇。 实现的基本功能: 1、贪吃蛇地图绘制。 2、蛇吃⻝物的功能 (上、下、左、右⽅向键控制蛇的动作)。 …...
 
【云原生】Docker基于Dockerfile多级构建,实现缩小镜像体积
目录 一、基于上次的nginx的Dockerfile做多级构建 二、基于上次的php的Dockerfile修改做多级构建 三、基于上次的mysql的Dockerfile修改做多级构建 基于以上三个镜像构建 四、镜像体积是不是越小越好?为什么要缩减镜像体积? 五、缩小镜像体积的方法…...
第七十一周周报
学习目标: 一、实验 二、小程序 学习时间: 2024.1.20-2024.1.26 学习产出: 一、小程序 这周花了两天根据陈勇和纪行之的代码优化了小程序的代码 二、实验 根据stylegan2仓库的redeme文件重新跑了stylegan2和diffusion-stylegan2 DV…...
绿色制造的行业标杆OEKO-TEX STeP认证
STeP是“OEKO-TEX国际环保纺织协会”推出的一个独立的第三方认证体系。STeP全称Sustainable Textile & Leather Production(可持续纺织和皮革生产),是面向纺织和皮革供应链中环保且负有社会责任的生产工厂推出的透明认证体系。 STeP认证的…...
第3章:Python 的函数和模块(基于最新版 Python3.12 编写)
文章目录 3.1 函数:编写你的代码乐曲3.1.1 什么是函数?3.1.2 如何定义函数?3.1.3 如何调用函数?3.1.4 函数的返回值3.1.5 函数的文档字符串3.1.6 默认参数值3.1.7 可变数量的参数3.1.8 局部变量和全局变量3.1.9 递归函数 3.2 模块…...
网络安全产品之认识漏洞扫描设备
文章目录 一、什么是漏洞扫描设备二、漏洞扫描设备的主要功能三、漏洞扫描设备的主要技术四、漏洞扫描设备的主要类型五、漏洞扫描设备的使用方式六、漏洞扫描设备如何与其他安全设备联动七、漏洞扫描设备的应用场景 漏洞是指在硬件、软件、协议的具体实现或系统安全策略上存在…...
 
Hadoop增加新节点环境配置(自用)
完成Hadoop集群增添一个新的节点配置(文中命名为)Hadoop106,没有进行继续为该节点分配身份职能的步骤 1.在VMware中安装CentOS 7 新建虚拟机 1.⾸先我们创建⼀个新的虚拟机,也可以点⽂件-新建虚拟机。 2.选择⾃定义,…...
 
Apache Shiro 安全框架
前言 Apache Shiro 是一个强大且容易使用的Java安全矿建,执行身份验证,授权,密码和会话管理。使用Shiro的易于理解的API您可以快速轻松的获得任何应用程序直到大的项目。 一丶什么是Shiro 1.Shiro是什么 Apache Shiro是一个强大且易于使用…...
 
防火墙的NAT
目录 1. NAT 概念解析 2. 配置NAT策略: 1. NAT 概念解析 静态NAT --- 一对一 动态NAT --- 多对多 NAPT --- 一对多的NAPT --- easy ip --- 多对多的NAPT 服务器映射 源NAT --- 基于源IP地址进行转换。我们之前接过的静态NAT,动态NAT,NAPT都属…...
 
Java基础进阶03-注解和单元测试
目录 一、注解 1.概述 2.作用 3.自定义注解 (1)格式 (2)使用 (3)练习 4.元注解 (1)概述 (2)常见元注解 (3)Target &#x…...
 
Mac+Android Studio配置 Flutter环境
Fluttrer中文下载官网 Flutter下载官网 1、环境变量 .zshrc #Flutter export PUB_HOSTED_URL"https://pub.flutter-io.cn" export FLUTTER_STORAGE_BASE_URL"https://storage.flutter-io.cn" export FLUTTER_HOME/Users/leon/Flutter/flutter_3_10_4/f…...
 
架构整洁之道-设计原则
4 设计原则 通常来说,要想构建一个好的软件系统,应该从写整洁的代码开始做起。这就是SOLID设计原则所要解决的问题。 SOLID原则的主要作用就是告诉我们如何将数据和函数组织成为类,以及如何将这些类链接起来成为程序。请注意,这里…...
 
数据结构(队列)
一.什么是队列 1.队列定义 队列是一种特殊的线性表,特殊之处在于他只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。和栈一样,队列也是一种操作受限制的线性表。进行插入操作的一端称为队尾,进行删除操作的…...
 
docker容器启动后修改或添加端口 nacos容器 版本2.x需要额外开放9848、9849
1.输入docker ps -a查看需要修改的容器ID: 记录下、 docker ps -a 2.停止docker systemctl stop docker 3.进入docker 容器文件夹,找到对应容器的位置: docker的默认文件夹应该是/var/lib/docker 如果不是root用户查看的话,可能会出现权限…...
 
C语言实现归并排序算法(附带源代码)
归并排序 把数据分为两段,从两段中逐个选最小的元素移入新数据段的末尾。 可从上到下或从下到上进行。 动态效果过程演示: 归并排序(Merge Sort)是一种分治算法,它将一个数组分为两个子数组,分别对这两个…...
 
考研C语言刷题基础篇之分支循环结构基础(二)
目录 第一题分数求和 第二题:求10 个整数中最大值 第三题:在屏幕上输出9*9乘法口诀表 第四题:写一个代码:打印100~200之间的素数 第五题:求斐波那契数的第N个数 斐波那契数的概念:前两个数相加等于第三…...
 
Scala基础知识
scala 1、scala简介  scala是运行在JVM上的多范式编程语言,同时支持面向对象和面向函数式编程。 2、scala解释器 要启动scala解释器,只需要以下几步: 按住windows键 r输入scala即可 在scala命令提示窗口中执行:quit,即可退…...
 
数学建模-------误差来源以及误差分析
绝对误差:精确值-近似值; 举个例子:从A到B,应该有73千米,但是我们近似成了70千米;从C到D,应该是1373千米,我们近似成了1370千米,如果使用绝对误差,结果都是3…...
Arduino和MPLAB X 开发STM32F103和PIC16F15376
要点: 使用Arduino开发STM32F103(Blue Pill),MPLAB X 开发PIC16F15376(Curiosity Nano)C/C嵌入式开发ESP32(Arduino、ESP-IDF)和STM32实时操作系统FreeRTOS STM32使用FreeRTOS示例 在使用 FreeRTOS 时&a…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
 
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
 
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
 
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
React---day11
14.4 react-redux第三方库 提供connect、thunk之类的函数 以获取一个banner数据为例子 store: 我们在使用异步的时候理应是要使用中间件的,但是configureStore 已经自动集成了 redux-thunk,注意action里面要返回函数 import { configureS…...
 
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
 
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
 
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
 
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
