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

Redis复习总结

之前写的博客太杂,最近想把Redis的知识点再系统的过一遍,带着自己的理解使用简短的话把一些问题总结一下,尤其是开发中和面试中的高频问题,基础知识点参考–>Redis入门、Spring Cache,这篇不再赘述。

目录

  • 基础
    • 简介;与Memcached的区别;为什么作为mysql缓存?
    • 如何保证Redis中都是热点数据 ?
    • 线程模型?为什么单线程还那么快?I/O多路复用(epoll)?
    • 除了做缓存还能拿来做什么?
    • Redis是AP还是CP的?
    • Redis的最佳实践
  • 数据结构
    • 9种数据类型及适用场景
    • 底层数据结构
  • 事务
    • 如何实现redis原子性;除了lua还有办法么?
    • 为什么Lua能保证原子性?执行失败会怎么样?
  • 持久化
    • 数据如何不丢失(RDB、AOF)
    • Big Key相关
  • 过期删除与内存淘汰
    • 过期删除(过期key)
    • 内存淘汰(数据淘汰、内存过大)
  • 缓存
    • 缓存雪崩、击穿、穿透;布隆过滤器
    • 常见的缓存更新策略
    • mysql的数据如何与redis同步(双写一致性);如何强一致?
  • 怎么保证Redis的高并发高可用(三种集群方案)
    • 主从同步(主从复制)
    • 哨兵模式;集群脑裂怎么办?
    • 分片集群
  • 实战
    • 分布式锁相关
    • 热Key相关
    • 实现延迟队列

基础

简介;与Memcached的区别;为什么作为mysql缓存?

什么是redis?

Redis 是一种基于内存的数据库,读写速度极快,常用于缓存、消息队列、分布式锁等场景。Redis 提供多种数据类型支持不同业务需求。其操作具有原子性,由单线程执行,无并发竞争问题。

此外,Redis 还支持事务、持久化、Lua 脚本、多种集群模式(主从复制、哨兵、切片集群)、发布/订阅模式,以及内存淘汰和过期删除机制。


redis与与Memcached的区别

很多人选择 Redis 作为缓存,而不是 Memcached,即使 Memcached 也是基于内存的数据库。要解答这个问题,需要了解两者的区别和共同点。

共同点:1、都是基于内存的数据库,主要用作缓存;2、都有过期策略;3、性能非常高。

区别:
数据类型:Redis 支持丰富的数据类型(String、Hash、List、Set、ZSet),而 Memcached 只支持简单的 key-value 数据类型。
持久化:Redis 支持将内存数据持久化到磁盘,重启可恢复;Memcached 不支持持久化,数据存于内存中,重启或故障后数据丢失。
集群:Redis 原生支持集群模式;Memcached 没有原生集群模式,依赖于客户端实现分片写入。
功能:Redis 支持发布订阅模型、Lua脚本、事务等高级功能;Memcached 不支持这些功能。


为什么作为mysq缓存

Redis 作为 MySQL 缓存的优势主要在于「高性能」和「高并发」。

高性能:用户首次访问 MySQL 数据时会比较慢,因为需要从硬盘读取。将数据缓存在 Redis 中,这样后续访问可以直接从内存获取,速度极快。当 MySQL 数据发生变化时,需同步更新 Redis 缓存,这涉及双写一致性问题。

高并发:Redis 的 QPS 是 MySQL 的 10 倍以上。Redis 单机 QPS 能轻松突破 10万,而 MySQL 单机 QPS 很难达到 1万。因此,使用 Redis 能大幅提升请求承受能力,把部分数据缓存到 Redis 可以减少对 MySQL 的直接访问。



如何保证Redis中都是热点数据 ?

如何保证Redis中的数据都是热点数据 ?

1.一般redis会给key设置过期时间,可以设置在过期之前如果被访问了,就给key加上过期时间,类似看门狗(redission)机制的思想,具体加多少可以根据实际业务场景来决定,这样的话访问的次数越多,过期时间就会越长,留在redis里的自然就是热点数据(过期key是怎么删除的下面有介绍

如果定期删除漏掉了很多过期key没有及时查询也没有走惰性删除,就会走内存淘汰机制了。

2.可以使用 allkeys-lru (挑选最近最少使用的数据淘汰)淘汰策略(下面内存淘汰有介绍),核心思想是“如果数据过去被访问多次,那么将来被访问的频率也更高”,那留下来的都是经常访问的热点数据。不使用 LRU 算法的原因是,其无法解决缓存污染问题,大量一次性读取数据会长时间占用内存。

3.对于一些可以预测的热点数据,比如秒杀库存、热门产品等,这些访问量比较大的就可以预先加载到redis里。

4.定期监控redis的使用情况,比如说命中率或者内存使用情况,然后根据实际情况去调整和配置淘汰策略,确保数据有效管理和内存高效利用



线程模型?为什么单线程还那么快?I/O多路复用(epoll)?

Redis的网络(线程)模型是怎样的?

Redis 6.0之前,使用的是单Reactor单线程模式。核心在于所有操作都在单个进程中完成,避免了进程间通信和多进程竞争的复杂性,因此实现相对简单。

单Reactor单线程模式存在两个主要缺点:

1.无法充分利用多核CPU性能:因为只有一个线程在执行,CPU的多核优势无法得到充分发挥。
2.处理延迟问题:当一个Handler对象正在处理业务时,其他连接的事件无法得到及时处理。如果某个任务耗时较长,会导致整体响应时间延迟。
因此,单Reactor单线程模式不适用于CPU密集型的场景,只适合业务处理非常快速的场景。Redis主要通过C语言实现,在6.0之前因为操作主要在内存中完成,处理速度很快,所以性能瓶颈不在CPU上。随着网络硬件性能的提升,网络I/O处理有时会成为瓶颈。

Redis 6.0之后,Redis引入了多线程模式。通过多线程处理网络I/O,可以提高并行度和网络处理性能。然而,Redis在命令执行上仍然采用单线程模式,也就不会存在线程安全问题。这种设计在增强网络I/O处理性能的同时,保持了命令执行的一致性和简洁性,使得Redis依然能够高效地运行。

总结:Redis的网络模型在6.0版本之前是单Reactor单线程模式,在6.0版本后改为多线程处理网络I/O,但命令执行仍用单线程。

Redis 6.0之前实际上并不是单线程的。只是主要工作(网络I/O和命令执行)一直使用单线程模型,其实启动时,Redis 会启动后台线程(BIO)以处理耗时任务:
在Redis 2.6版本,启动了2个后台线程,分别处理文件关闭和AOF刷盘任务,例如,命令 unlink key、flushdb async、flushall async 会交给后台线程处理,避免主线程卡顿。因此,删除大key时应使用 unlink 而非 del 命令,以免阻塞主线程。
在Redis 4.0版本后,新增一个用于异步释放内存的线程,即lazyfree线程。
Redis为「关闭文件、AOF刷盘、释放内存」等任务创建单独线程,因为这些操作耗时较长,如果在主线程处理会导致阻塞,影响后续请求的处理。后台线程相当于一个消费者,不停轮询任务队列,任务完成就执行相应操作。


Redis是单线程的,但是为什么还那么快?

Redis 实际上并不是单线程的。只是主要工作(网络I/O和命令执行)一直使用单线程模型,但在Redis 6.0版本后,引入了多I/O线程来处理网络请求,是因为随着硬件性能提升,Redis的瓶颈有时出现在网络I/O处理上。
其实启动时,Redis 会启动后台线程(BIO)以处理耗时任务:
在Redis 2.6版本,启动了2个后台线程,分别处理文件关闭和AOF刷盘任务,例如,命令 unlink key、flushdb async、flushall async 会交给后台线程处理,避免主线程卡顿。因此,删除大key时应使用 unlink 而非 del 命令,以免阻塞主线程。
在Redis 4.0版本后,新增一个用于异步释放内存的线程,即lazyfree线程。
Redis为「关闭文件、AOF刷盘、释放内存」等任务创建单独线程,因为这些操作耗时较长,如果在主线程处理会导致阻塞,影响后续请求的处理。后台线程相当于一个消费者,不停轮询任务队列,任务完成就执行相应操作。

Redis 之所以采用单线程模型,并且能够保持极高的性能,主要有以下几个原因:

  • 内存操作和高效数据结构:Redis 的大部分操作都在内存中完成,速度极快,;采用了高效的数据结构,进一步提升了操作效率;瓶颈通常在于机器的内存或网络带宽,而非 CPU。因此,使用单线程并不会遇到性能瓶颈。
  • 避免多线程开销:单线程模型避免了多线程之间的资源竞争,省去了线程切换带来的时间开销。任务执行也是单线程的,也不存在线程安全问题。这样也消除了死锁等多线程编程中的潜在问题,提高了系统的稳定性和性能。
  • I/O 多路复用机制:Redis 采用 I/O 多路复用机制来处理大量的客户端 Socket 请求。I/O 多路复用是一种允许一个线程处理多个 IO 流的技术,常见的实现方式包括select和epoll。例如:bgsave 和 bgrewriteaof 都是在后台执行操作,不影响主线程的正常使用,不会产生阻塞

解释一下I/O多路复用模型?

I/O多路复用是指利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。目前的I/O多路复用都是采用的epoll模式实现,它会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能。
其中Redis的网络模型就是使用I/O多路复用结合事件的处理器来应对多个Socket请求,比如,提供了连接应答处理器、命令回复处理器,命令请求处理器;
在Redis6.0之后,为了提升更好的性能,在命令回复处理器使用了多线程来处理回复事件,在命令请求处理器中,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程

最基础的 TCP Socket 编程使用阻塞 I/O 模型,只能一对一通信。为支持多客户端,传统方法是使用多进程/线程模型,每个客户端连接分配一个进程/线程。当请求过多时,调度和内存开销巨大,成为瓶颈。
I/O 多路复用解决上述问题,有三种 API:select、poll、epoll。
select 和 poll:
1.本质没有区别,都是使用线性结构存储进程关注的 Socket 集合。只不过poll 不再使用 BitsMap 存储关注的文件描述符,而是改用动态数组并以链表形式组织。这打破了 select 的文件描述符个数限制,但仍受系统文件描述符限制。
2.需要将关注的 Socket 集合通过系统调用从用户态拷贝到内核态,由内核检测事件。
3.当事件生成,内核要遍历集合集才能找到对应 Socket 并设置状态为可读/可写,再拷贝回用户态,用户态继续遍历处理。
3.缺陷在于客户端多时,遍历和拷贝开销大,难以应对 C10K 问题(C 是 Client 单词首字母缩写,C10K 就是单机同时处理 1 万个请求的问题。)


epoll:
使用红黑树管理待检测 Socket,增删改 O(logn),这能减少内核和用户空间的大量数据拷贝和内存分配。
事件驱动机制,内核通过链表记录就绪事件,仅传递有事件发生的 Socket 集合,提高效率。
支持边缘触发和水平触发,边缘触发效率更高,而 select/poll 仅支持水平触发。

什么是边缘触发、水平触发?
Epoll 支持两种事件触发模式:边缘触发(ET,Edge-triggered)和水平触发(LT,Level-triggered)。虽然这两个词听上去有些抽象,但其实很容易理解。
边缘触发(ET):当监控的 Socket 有可读事件时,服务器只会从 epoll_wait 中苏醒一次,无论你是否调用 read 函数读取数据。因此,你需要保证每次都尽可能读完所有数据。
水平触发(LT):当监控的 Socket 有可读事件时,服务器会不断从 epoll_wait 中苏醒,直到内核缓冲区的数据被读完,以确保你知道还有数据需要处理。
类比
边缘触发:想象你的快递到了一个快递箱,快递箱只能发一次短信通知,即使你没有去取,它也不会再提醒你。即只要数据未读完,就会持续通知。
水平触发:快递箱会不停地发短信,直到你把快递取走为止。即只在事件第一次发生时通知一次,之后不会再重复通知。


用水平触发时,当内核通知文件描述符可读写后,你可以检测它的状态,并决定是否继续操作,没有必要一次性读写完数据。而用边缘触发时,事件只会通知一次,所以你必须尽可能多地读写数据,否则可能错过处理机会。
边缘触发一般和非阻塞 I/O搭配使用。因为如果你使用边缘触发模式,当 I/O 事件发生时系统只会通知你一次,我们不知道具体能读写多少数据。因此,在收到通知后要尽可能多地读写数据,以免错失机会。这通常需要对文件描述符进行循环读写操作。如果文件描述符是阻塞的,当没有数据可读写时,进程会卡在读写操作上,程序就无法继续运行。因此,边缘触发模式通常与非阻塞 I/O 结合使用,这样程序可以一直尝试读写操作,直到系统调用(例如 read 和 write)因为没有数据而返回 EAGAIN 或 EWOULDBLOCK 错误。


一般来说,边缘触发效率更高,因为它减少了 epoll_wait 的调用次数,从而减少了系统调用的开销。传统的 select/poll 只有水平触发模式,而 epoll 默认是水平触发,但可以设置为边缘触发。



除了做缓存还能拿来做什么?

Redis 是非关系型的基于内存存储的键值对数据库,它的主要作用就是用来缓存数据,来提高系统的性能;同时 Redis中,还提供了多种数据类型(比如:String / Hash / List / Set / ZSet / Geo / BitMap等),正是基于这些丰富的数据类型和它的单线程等特性,也赋予了 Redis 除缓存数据外的多种能力。

1.分布式锁。我们可以使用 Redis 自带的 SETNX 命令来实现分布式锁,当然,生产场景中我们还是更推荐使用 Redisson 框架来帮我们实现分布式锁的功能。
2.分布式ID。利用 Redis 原子性的自增命令,可以考虑作为应用程序的分布式ID来使用。如果获取分布式ID 比较频繁,我们可以每次请求设置一个合适的步长,比如 2000(一次取2000个连续的ID),然后缓存在本地。
3. 分布式Session。我们可以使用Redis 中提供的 String 数据类型或者 Hash 数据类型来保存 Session 数据,从而实现分布式环境下 Session 会话的同步。
4. 分布式限流。比如我们可以基于 Redis 的 SETNX命令可以实现计数器算法限流;基于 Redis 的 ZSet 数据结构可以实现滑动窗口算法限流;基于 Redis 的 List 数据结构可以实现令牌桶算法限流;当然,我们还可以基于Redis +Lua 脚本的方式实现分布式限流。限流算法简介。
5. 消息队列。如果是中小型项目,业务量不是很大,对于数据丢失不敏感,且项目中已经使用了中间件 Redis,同时又需要消息中间件功能的情况下,可以考虑使用 Redis 的Stream 来实现消息队列的功能。但是如果并发量很高,资源又足够支持的情况下,还是强烈建议使用更专业的消息中间件,比如 RocketMQ、Kafka 等。
6. 抽奖。Redis 中提供的 Set 数据类型,可以很轻松的实现模拟抽奖的功能。存储某活动中中奖的用户名 ,Set 类型因为有去重功能,可以保证同一个用户不会中奖两次。
7. 地理位置应用。Redis 中提供的GEO 数据类型,可以很轻松的实现附近的人等查询功能。
8. 海量数据统计。Redis 中提供的 BitMap 的数据类型,可以用来很方便的做海量数据的统计。还记得腾讯三面中被问到的那道经典的面试题吗:限制1个G的内存,40亿的QQ号如何实现快速去重!这道面试题就可以使用 BitMap 来解決!
9.排行榜。Redis 中提供的 ZSet 数据类型,可以很轻松的实现排行榜等查询功能,比如经典的 TOP 10问题。
10. 关注模型。Redis 中提供的 Set 数据类型,可以很轻松的实现共同关注、我关注的人也关注他、我可能认识的人等关注模型的查询功能。(Set 类型支持交集运算,set的查找也是O(1),所以效率高,总的时间复杂度会更接近于O(min(M, N)), 而不是O(MN))。



Redis是AP还是CP的?

CAP 理论是针对分布式环境而言的,其中C代表一致性(Consistency)࿰

相关文章:

Redis复习总结

之前写的博客太杂,最近想把Redis的知识点再系统的过一遍,带着自己的理解使用简短的话把一些问题总结一下,尤其是开发中和面试中的高频问题,基础知识点参考–>Redis入门、Spring Cache,这篇不再赘述。 目录 基础简介;与Memcached的区别;为什么作为mysql缓存?如何保证R…...

基于JSP的医院挂号系统

你好,我是专注于医疗信息系统的计算机专业毕业生。如果您对医院挂号系统感兴趣或有相关需求,欢迎随时联系我。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:MyEclipse 系统展示 首页 管理员功能模…...

Chainlit快速实现AI对话应用1 分钟内实现聊天数据的持久化保存

概述 默认情况下,Chainlit 应用不会保留其生成的聊天和元素。即网页一刷新,所有的聊天记录,页面上的所有聊天记录都会消失。但是,存储和利用这些数据的能力可能是您的项目或组织的重要组成部分。 一旦启用,数据持久性…...

STM32DMA数据传输

我估计大多数人学这么久连听说都没听说过DMA,更不用提知道它是干嘛的。其实DMA的本质就是一个数据的搬运工。平常的时候当我们没有配置的时候,一直都是CPU在搬运数据,但是这个活又累又没有技术含量,所以DMA的重要性还是有的。 目…...

Python学习笔记50:游戏篇之外星人入侵(十一)

前言 本篇文章接着之前的内容,继续对游戏功能进行优化,主要是优化游戏状态以及对应的处理。 状态 一个游戏包含多种状态,这个状态是一个可以很复杂也可以很简单的内容。条件所限,我们这个游戏的状态就比较简单: 未…...

vue3踩坑问题记录

//vue3element-plus //1、placeholder换行显示 const startTxt ref() const contentText ref<any>() startTxt.value "请描述问题内容、例如&#xff1a;" historyData.prompt.forEach((el:any)>{contentText.value \n${el.question}}) <ElInputv-mo…...

Python 爬虫实战:Scrapy 框架详解与应用

&#x1f6e0;️ Scrapy 框架基本使用 Scrapy 是一个强大的 Python 爬虫框架&#xff0c;提供了用于提取和处理网页数据的功能。以下是 Scrapy 的基本使用步骤&#xff1a; 安装 Scrapy pip install scrapy创建 Scrapy 项目 scrapy startproject myproject这将生成一个基础…...

60 函数参数——关键参数

关键参数主要指调用函数时的参数传递方式&#xff0c;与函数定义无关。 通过关键参数可以按参数名字传递值&#xff0c;明确指定哪个值传递给哪个参数&#xff0c;实参顺序可以和形参顺序不一致&#xff0c;但不影响参数值的传递结果&#xff0c;避免了用户需要牢记参数位置和…...

wps 最新 2019 专业版 下载安装教程,解锁全部功能,免费领取

文章目录 前言软件介绍软件下载安装步骤激活步骤小福利&#xff08;安卓APP&#xff09;软件介绍软件下载安装步骤 前言 本篇文章主要针对WPS2019专业版的安装下载进行详细讲解&#xff0c;软件已激活&#xff0c;可放心使用&#xff1b;并且可以进行账号登录&#xff0c;进行…...

前端(三):Ajax

一、Ajax Asynchronous JavaScript And XML&#xff0c;简称Ajax&#xff0c;是异步的JavaScript和XML。 作用&#xff1a;数据交换&#xff0c;通过Ajax可以给服务器发送请求&#xff0c;并获取服务器响应的数据。异步交互&#xff1a;可以在不重新加载整个页面的情况下&…...

启动 /使用/关闭 Redis 服务器

1. Linux 启动 Linux 系统启动 Redis 有两种方法&#xff0c;分别是前台启动&#xff0c;后台启动&#xff0c;两者各有差异&#xff1b; &#xff08;1&#xff09;前台启动 首先&#xff0c;需要进入 bin 路径(安装路径不同输入的命令也不同); 个人的命令&#xff08;一般…...

Linux系统中的高级SELinux安全策略定制技术

随着信息技术的发展&#xff0c;计算机系统的安全性变得越来越重要。在开源世界中&#xff0c;Linux作为一种广泛应用的操作系统&#xff0c;其安全性一直备受关注。其中&#xff0c;SELinux&#xff08;Security-Enhanced Linux&#xff09;作为Linux系统中的一个安全模块&…...

使用 Ansible Blocks 进行错误处理

注&#xff1a;机翻&#xff0c;未校。 How to Use Ansible Blocks Make your Playbooks more readable and maintainable using Blocks feature in Ansible. 使用 Ansible 中的块功能使 Playbook 更具可读性和可维护性。 Jul 15, 2024 — LHB Community How to Use Ansible…...

java中的静态变量和实例变量的区别

java中的静态变量和实例变量的区别 在Java中&#xff0c;静态变量&#xff08;也称为类变量&#xff09;和实例变量是两种不同类型的变量&#xff0c;它们在多个方面存在显著的区别。以下是它们之间的一些主要区别&#xff1a; 存储位置 静态变量&#xff1a;存储在方法区&am…...

【Effecutive C++】条款02 尽量以const, enum, inline替换 #define

Prefer consts, enums, and inline to #define. 这个条款或许改为“宁可以编译器替换预处理器”比较好&#xff0c;因为或许#define不被视为语言的一部分。那正是它的问题所在。当你做出这样的事情&#xff1a; #define ASPECT_RATIO 1.653记号名称ASPECT_RATIO也许从未被编译…...

leetcode-226. 翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1]…...

用的到linux-tomcat端口占用排查-Day5

前言&#xff1a; 最近使用tomcat搭建了一套测试环境的应用&#xff0c;整个搭建过程也很简单&#xff0c;就是将部署包上传至服务器☞解压☞启动tomcat服务器&#xff0c;当然服务器也是成功启动了&#xff0c;但是发现前端应用报404&#xff0c;具体如下图所示。 一、现象及思…...

mqtt协议详解(0)初步认识mqtt

文章目录 1. 介绍2. 主要特性3. 架构1. 介绍 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种构建在TCP/IP协议之上的轻量级、基于发布-订阅模式的消息传输协议,适用于资源受限的设备和低带宽、高延迟或不稳定的网络环境,例如IOT。 MQTT 协议于 1…...

Java语言程序设计基础篇_编程练习题*16.7 (设置时钟的时间)

*16.7 (设置时钟的时间) 编写一个程序&#xff0c;显示一个时钟&#xff0c;并通过在三个文本域中输入小时、分钟和秒 钟来设置时钟的时间&#xff0c;如图16-38b 所示。使用程序清单14-21的ClockPane改变时钟大小使其居于面板中央 习题思路 实例化一个ClockPane(在程序清单1…...

YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切

原文:YOLOv8新版本支持实时检测Transformer(RT-DETR)、SAM分割一切 - 知乎 (zhihu.com) 一、SAM 分割任何模型 (Segment Anything Model - SAM) 是一种突破性的图像分割模型,可实现具有实时性能的快速分割。 项目地址 https://github.com/facebookresearch/segment-…...

【传输层协议】UDP和TCP协议

文章目录 UDP协议UDP特点UDP的缓冲区基于UDP的应用层协议 TCP协议6位标志位&#xff1a;确认应答机制超时重传机制连接管理机制&#xff08;握手和挥手&#xff09;服务端状态转换过程客户端状态转换过程TIME_WAIT状态CLOSE_WAIT状态 为什么是三次握手和四次挥手滑动窗口如果发…...

Java Excel复杂表头,表头合并单元格

Java Excel复杂表头&#xff0c;表头合并单元格 效果预览 一、maven依赖 <!--操作excel --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.1</version><scope>test</…...

Java整合腾讯云发送短信实战Demo

简介 在现代应用开发中&#xff0c;短信服务是非常重要的功能之一。它可以用于用户验证、通知等各种场景。本文将介绍如何使用Java整合腾讯云短信服务&#xff0c;并提供一个完整的实战示例代码。 环境准备 在开始之前&#xff0c;确保你已经完成以下准备工作&#xff1a; 注…...

电路中电阻,电容和电感作用总结

电阻作用 1&#xff0c;上拉电阻 电阻的连接一般是一端接上拉的电源&#xff08;一般与芯片信号的电压值相匹配&#xff09;&#xff0c;另一端连接芯片引脚所对应的信号大概如下图 功能&#xff1a;一、预置某些引脚的功能&#xff0c;例如复位信号拉高&#xff08;失能&…...

OrangePi AIpro学习1 —— 烧写和ssh系统

目录 一、下载烧写工具和系统 二、烧写和启动 2.1 烧写和启动 2.2 烧写失败后的问题解决 三、串口连接到主机 3.1 串口连接到主机 四、网络连接到主机 4.1 修改香橙派IP地址 4.2 win11配置以太网静态ip 4.4 主机和香橙派直连 4.5 主机和香橙派连接到同一个路由器 五…...

Gather 全球化进程迅速 多重利好推动未来发展

在过去的几周里&#xff0c;Gather的全球化发展十分迅速&#xff0c;并取得了一系列重要成绩&#xff0c;这些成绩进一步巩固了Gather在区块链和去中心化通信领域的地位&#xff0c;并为未来的发展注入了强劲的动力。 $GAT代币成功进驻多家顶级交易所 7月19日&#xff0c;Gath…...

面试经典 222. 完全二叉树的节点个数

二叉树我最近刷的特别多&#xff0c;差不多快刷完了&#xff0c;但是有一种题型差点给我忽略了&#xff0c;那就是完全二叉树&#xff0c;这也是一个很重要的题型&#xff0c;今天刚好有一道题目可以来复习一下完全二叉树的特性 题目链接如下&#xff1a;https://leetcode.cn/…...

【css】3d柱状图-vue组件版

创建一个响应式圆柱形进度条组件 在现代网页设计中&#xff0c;圆柱形进度条是一种非常流行的视觉元素&#xff0c;用于展示数据的进度或状态。本文将介绍如何使用Vue.js和LESS创建一个响应式的圆柱形进度条组件。 组件结构 我们的组件由两部分组成&#xff1a;一个圆柱形的…...

《计算机组成原理》(第3版)第3章 系统总线 复习笔记

第3章 系统总线 一、总线的基本概念 总线是连接多个部件的信息传输线&#xff0c;是各部件共享的传输介质&#xff0c;如图3-1所示。 图3-1 面向CPU的双总线结构框图 倘若将CPU、主存和I/O设备都挂到一组总线上&#xff0c;便形成单总线结构的计算机&#xff0c;如图3-2所示…...

【网络安全】https协议的加密方案避免中间人攻击(MITM攻击)导致的数据泄露风险

目录 引言 概念准备 中间人 加密 数据摘要 && 数据指纹 数字签名 密钥加密 中间人攻击 CA证书 https加密的解决方案 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 引言 http在应用层协议中是明文传输协议&#xff0c;它是通信双方传输数据时的一种约定。【…...