03 Redis之命令(基本命令+Key命令+String型Value命令与应用场景)

Redis 根据命令所操作对象的不同,可以分为三大类:对 Redis 进行基础性操作的命令,对 Key 的操作命令,对 Value 的操作命令。


3.1 Redis 基本命令

一些可选项对大小写敏感, 所以应尽量将redis的所有命令大写输入

首先通过 redis-cli 命令进入到 Redis 命令行客户端,然后再运行下面的命令。

3.1.1 心跳命令 ping

键入 ping 命令,会看到 PONG 响应,则说明该客户端与 Redis 的连接是正常的。该命令亦称为心跳命令。
在这里插入图片描述

3.1.2 读写键值命令 set/get

set key value 会将指定 key-value 写入到 DB。get key 则会读取指定 key 的 value 值。

关于更多 set 与 get 命令格式,后面会详细学习。

3.1.3 切换数据库 select

默认使用的是 0 号 DB,可以通过 select db 索引来切换 DB。例如,如下命令会切换到DB3

select 3

3.1.4 查看 key 数量 dbsize

在这里插入图片描述

3.1.5 删库跑路

flushdb删除当前库所有数据
flushall删除所有库的所有的信息

3.1.6 退出redis自带命令行客户端

exit / quit


3.2 Key操作命令

Redis 中存储的数据整体是一个 Map,其 key 为 String 类型,而 value 则可以是 String、 Hash 表、List、Set 等类型。

3.2.1 Keys

 格式:KEYS pattern
 功能:查找所有符合给定模式 pattern 的 key,pattern 为正则表达式。
 说明:KEYS 的速度非常快,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。所以生产环境中一般不使用该命令,而使用 scan 命令代替。

keys * 返回数据库中所有键

3.2.2 exists

 格式:EXISTS key
 功能:检查给定 key 是否存在。
 说明:若 key 存在,返回 1 ,否则返回 0 。

3.2.3 del

 格式:DEL key [key …]
 功能:删除给定的一个或多个 key 。不存在的 key 会被忽略。
 说明:返回被删除 key 的数量。

3.2.4 rename

 格式:RENAME key newkey
 功能:将 key 改名为 newkey。
 说明:当 key 和 newkey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时, RENAME 命令将覆盖旧值。改名成功时提示 OK ,失败时候返回一个错误。

3.2.5 move

 格式:MOVE key db
 功能:将当前数据库的 key 移动到给定的数据库 db 当中。
 说明:如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。移动成功返回 1 ,失败则返回 0 。

3.2.6 type

 格式:TYPE key
 功能:返回 key 所储存的值的类型。
 说明:返回值有以下六种 none (key 不存在)

  • string (字符串)
  • list (列表)
  • set (集合)
  • zset (有序集)
  • hash (哈希表)

3.2.7 expire 与 pexpire

 格式:EXPIRE key seconds
 功能:为给定 key 设置生存时间。当 key 过期时(生存时间为 0),它会被自动删除。 expire 的时间单位为秒,pexpire 的时间单位为毫秒。在 Redis 中,带有生存时间的 key被称为“易失的”(volatile)。
 说明:生存时间设置成功返回 1。若 key 不存在时返回 0 。rename 操作不会改变 key的生存时间。

3.2.8 ttl 与 pttl

 格式:TTL key
 功能:TTL, time to live,返回给定 key 的剩余生存时间。
 说明:其返回值存在三种可能:
 当 key 不存在时,返回 -2 。
 当 key 存在但没有设置剩余生存时间时,返回 -1 。
 否则,返回 key 的剩余生存时间。ttl 命令返回的时间单位为秒,而 pttl 命令返回的时间单位为毫秒。

3.2.9 persist

 格式:PERSIST key
 功能:去除给定 key 的生存时间,将这个 key 从“易失的”转换成“持久的”。
 说明:当生存时间移除成功时,返回 1;若 key 不存在或 key 没有设置生存时间,则返回 0。

3.2.10 randomkey (给数据库判空)

 格式:RANDOMKEY
 功能:从当前数据库中随机返回(不删除)一个 key。
 说明:当数据库不为空时,返回一个 key。当数据库为空时,返回 nil。

3.2.11 scan

 格式:SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
 功能:用于迭代数据库中的数据库键。其各个选项的意义为:
 cursor:本次迭代开始的游标。
 pattern :本次迭代要匹配的 key 的模式。
 count :本次迭代要从数据集里返回多少元素,默认值为 10 。
 type:本次迭代要返回的 value 的类型,默认为所有类型。

 相关命令:另外还有 3 个 scan 命令用于对三种类型的 value 进行遍历。
 hscan:属于 Hash 型 Value 操作命令集合,用于遍历当前 db 中指定 Hash 表的所有 field-value 对。
 sscan:属于 Set 型 Value 操作命令集合,用于遍历当前 db 中指定 set 集合的所有元素
 zscan:属于 ZSet 型 Value 操作命令集合,用于遍历当前 db 中指定有序集合的所有元素(数值与元素值)
SSCAN 命令、 HSCAN 命令和 ZSCAN 命令的第一个参数总是一个存储集合的键名。而 SCAN 命令则不需要在第一个参数提供任何数据库键 —— 因为它遍历的是当前数据库中的所包含的键。

3.2.11.1 SCAN命令基本过程

SCAN 命令是一个基于游标 cursor (指示开始位置)的迭代器:SCAN 命令每次被调用之后,都会向用户返回返回一个包含两个元素的数组, 第一个元素是用于进行下一次迭代的新游标, 而第二个元素则是一个数组, 这个数组中包含了所有被迭代的元素。用户在下次迭代时需要使用这个新游标作为 SCAN 命令的游标参数,以此来延续之前的迭代过程。当SCAN 命令的游标参数被设置为 0 时,服务器将开始一次新的迭代。如果新游标返回 0 表示迭代已结束。

3.2.11.2 SCAN命令有效性

SCAN 命令仅仅使用游标来记录遍历状态, 所以这些命令带有以下缺点:

  • 同一个元素可能会被返回多次。 处理重复元素的工作交由应用程序负责, 比如说, 可以考虑将遍历返回的元素,只用于可以安全地重复执行多次的操作上。
  • 如果一个元素是在遍历过程中被添加到数据集的, 又或者是在遍历过程中从数据集中被删除的, 那么这个元素可能会被返回, 也可能不会, 这是不确定的。
3.2.11.3 SCAN命令每次执行返回的元素数量

SCAN 命令族并不保证每次执行都返回某个给定数量的元素。增量式命令甚至可能会返回零个元素, 但只要命令返回的游标不是 0 , 应用程序就不应该将遍历视作结束。

不过命令返回的元素数量总是符合一定规则的, 在实际中:对于一个大数据集来说, 增量式遍历命令每次最多可能会返回数十个元素;而对于一个足够小的数据集来说, 小集合键、小哈希键和小有序集合键, 那么增量遍历命令将在一次调用中返回数据集中的所有元素。

3.2.11.4 COUNT 选项
  • COUNT 选项的作用就是让用户告知遍历命令, 在每次遍历中应该从数据集里返回多少元素

  • 这个选项只是对增量式遍历命令的一种提示, 有些时候这种提示会失效。

  • Redis 会自动调整每次的遍历数目。由于 scan 命令每次执行都只会返回少量元素,所以该命令可以用于生产环境,而不会出现像 KEYS 命令带来的服务器阻塞问题。

  • 增量式迭代命令所使用的算法只保证在数据集的大小有界的情况下迭代才会停止,能否结束一个迭代取决于用户执行迭代的速度是否比数据集增长的速度更快。

  • 重要: 并非每次遍历都要使用相同的 COUNT 值。用户可以在每次遍历中按自己的需要随意改变 COUNT 值, 只要记得将上次遍历返回的游标用到下次遍历里面就可以了。

3.2.11.5 MATCH选项

对元素的模式匹配工作是在命令从数据集中取出元素之后, 向客户端返回元素之前的这段时间内进行的, 所以如果被遍历的数据集太大, 而且数据集中又只有少量元素和模式相匹配, 那么遍历命令或许会在多次执行中都不返回任何元素。

对此,我们可以设置一个很大count, 强制返回更多数据以供匹配.

3.2.11.5 TYPE选项
  • 从6.0版开始,使用 TYPE 选项要求 SCAN 只返回与给定类型匹配的对象
  • TYPE选项仅在整个数据库SCAN 命令上可用,HSCAN 或 ZSCAN 等无效。
  • 与MATCH类似, TYPE 筛选器会在从数据库中获取到元素后应用,因此该选项不会减少服务器完成完整遍历所必须执行的工作量,对于罕见类型,可能在多次遍历中没有收到任何元素。
3.2.11.6 使用错误的游标进行增量式遍历
  • 在同一时间, 可以有任意多个客户端对同一数据集进行遍历, 客户端每次执行遍历都需要传入一个游标, 并在遍历执行之后获得一个新的游标, 而这个游标就包含了遍历的所有状态, 因此, 服务器无须为遍历记录任何状态。
  • 只有两种游标是合法的:
    a. 在开始一个新的遍历时, 游标必须为 0。
    b. 增量式遍历命令在执行之后返回的游标值, 用于延续(continue)遍历过程的游标。
  • 使用非法游标并不会造成崩溃, 但可能会产生不确定的结果.

实验:
先往数据库中插入数据成这样 :
注意: 集合(Set)是一种无序的数据结构,即使按照一定的顺序插入元素,Redis在内部存储时并不保证保持相同的顺序。
在这里插入图片描述

在这里插入图片描述
指令含义: 从0开始, 返回3个键.
返回内容:x`
a. 返回的最后一个键是c,c是下一次从4开始
b. 返回的头三个键

3.3 String型Value命令(*)

**如果 value 字符串中带有空格,则该字符串必须使用双引号或单引号引起来,否则报错. 因此 , 在具体开发中, 建议每次写Value值时都使用括号

Redis 存储数据的 Value 可以是一个 String 类型数据。String 类型的 Value 是 Redis 中最基本,最常见的类型。String 类型的 Value 中可以存放任意数据,包括数值型,甚至是二进制的图片、音频、视频、序列化对象等。一个 String 类型的 Value 最大是 512M.

3.3.1 SET

  • 格式: SET key value [EX seconds|PX milliseconds|KEEPTTL] [NX|XX] [GET]
  • EX seconds – 设置键key的过期时间,单位时秒
  • PX milliseconds – 设置键key的过期时间,单位时毫秒
  • NX – 只有键key不存在的时候才会设置key的值
  • XX – 只有键key存在的时候才会设置key的值
  • KEEPTTL(6.0后新增) – 获取 key 的过期时间
  • GET(6.2后新增) – 返回 key 存储的值,如果 key 不存在返回空

注意: 由于SET命令加上选项已经可以完全取代SETNX, SETEX, PSETEX, GETSET,的功能,所以在将来的版本中,redis可能会不推荐使用并且最终抛弃这几个命令。

3.3.2 SETEX和PSETEX

 格式:SETEX/PSETEX key seconds value
 功能:set expire,其不仅为 key 指定了 value,还为其设置了生存时间。setex 的单位为秒,psetex 的单位为毫秒。
 说明:如果 key 已经存在, 则覆写旧值。该命令类似于以下两个命令,不同之处是, SETEX 是一个原子性操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
SET key value
EXPIRE key seconds # 设置生存时间

3.3.4 GETSET

 格式:GETSET key value
 功能:将给定 key 的值设为 value ,并返回 key 的旧值。
 返回值:当 key 存在但不是字符串类型时,返回一个错误;当 key 不存在时,返回 nil 。

3.3.5 MSET和MSETNX

 格式:MSET/MSETNX key1 value1 [key2 value2 …]
 功能:同时设置一个或多个 key-value 对。
 说明:MSET 和MSETNX就是SET和SETNX的升级, 同时支持1或多键值对版本()
 说明1:如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key 都不存在的情况下进行设置操作。
 说明2: MSET/MSETNX 是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况不可能发生。
 返回值: 总是返回“OK”,因为 MSET 不会失败。

3.3.6 MGET

 格式:MGET key [key …]
 功能:返回所有(一个或多个)给定 key 的值。
 返回值:如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。

3.3.7 APPEND

 格式:APPEND key value
 功能:

  • 如果 key 已经存在, 并且其值是一个字符串, APPEND 命令将 value 追加到key 原来的值的末尾。
  • 如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。

 返回值:追加 value 之后, key对应的值字符串的长度。
在这里插入图片描述

3.3.8 INCR和DECR

 格式: INCR key 或 DECR key
 功能:将 key 中存储的数字值增加/减少指定的数值,这个数值只能是整数,可以是负数,但不能是小数。
 返回值:如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行增/减操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增/减后的值。
 说明: 本质上这是一个整数操作,因为Redis没有专门的整数类型。存储在 key 中的字符串被转换为十进制有符号整数,在此基础上加1。

3.3.9 INCRBY和DECRBY

 格式: INCRBY key increment 或 DECRBY key decrement
 功能:将 key 中存储的数字值增加/减少指定的数值increment / decrement,这个数值只能是整数,可以是负数,但不能是小数。
 返回值:如果 key 不存在,那么 key 的值会先被初始化为 0,然后再执行增/减操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增/减后的值。

3.3.10 INCRBYFLOAT

 格式:INCRBYFLOAT key increment
 功能:为 key 中所储存的值加上浮点数增量 increment 。
 返回值:与之前的说明相同。没有 decrbyfloat 命令,但 increment 为负数可以实现减操作效果。

3.3.11 STRLEN

 格式:STRLEN key
 功能:返回 key 所储存的字符串值的长度。
 返回值:当 key 储存的不是字符串值时,返回一个错误;当 key 不存在时,返回 0 。

3.3.12 GETRANGE

 格式:GETRANGE key start end
 功能:返回 key 对应Value值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定,包括 start 和 end 在内。
 用途: GETRANGE 通过将结果范围限制为字符串的实际长度来处理超出范围的请求。
 说明:**end 必须要比 start 大。**支持负数偏移量,表示从字符串最后开始计数,-1 表示最后一个字符,-2 表示倒数第二个,以此类推。

3.3.13 SETRANGE

 格式:SETRANGE key offset value
 功能:从偏移量 offset 开始, 用 value 参数替换给定 key 所储存的字符串值 str。
 说明:当 offset 值大于 str 长度时,中间使用零字节\x00 填充,即 0000 0000 字节填充;对于不存在的 key 当作空串处理。
在这里插入图片描述
不存在的key的例子:
在这里插入图片描述

3.3.15 位操作命令

名称中包含 BIT 的命令,都是对二进制位的操作命令,例如,setbit、getbit、bitcount、 bittop、bitfield,这些命令不常用。

3.3.15 典型应用场景

3.3.15.1 数据缓存

Redis 作为数据缓存层,MySQL 作为数据存储层。应用服务器首先从 Redis 中获取数据,如果缓存层中没有,则从 MySQL 中获取后先存入缓存层再返回给应用服务器。

3.3.15.2 计数器

在 Redis 中写入一个 value 为数值型的 key 作为平台计数器、视频播放计数器等。每个有效客户端访问一次,或视频每播放一次,都是直接修改 Redis 中的计数器,然后再以异步方式持久化到其它数据源中,例如持久化到 MySQL。

3.3.15.3 共享 Session

在这里插入图片描述
对于一个分布式应用系统,如果将类似用户登录信息这样的 Session 数据保存在提供登录服务的服务器中,那么如果用户再次提交像收藏、支付等请求时可能会出现问题:在提供收藏、支付等服务的服务器中并没有该用户的 Session 数据,从而导致该用户需要重新登录。对于用户来说,这是不能接受的。
此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从 Redis 中查找相应的 Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。这样就不会引发“重新登录”问题。

3.3.15.4 限速器

现在很多平台为了防止 DoS(Denial of Service,拒绝服务)攻击,一般都会限制一个 IP不能在一秒内访问超过 n 次。而 Redis 可以可以结合 key 的过期时间与 incr 命令来完成限速功能,充当限速器。
注意,其无法防止 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击。

// 客户端每提交一次请求,都会执行下面的代码 
// 等价于 set 192.168.192.55 1 ex 60 nx 
// 指定新 ip 作为 key 的缓存过期时间为 60 秒 
Boolean isExists = redis.set(ip, 1, “EX 60, “NX”); 
//set失败返回值是空,因此判空
if(isExists != null || redis.incr(ip) <= 5) { // 通过 
} else { //限流}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C项目】顺序表

简介&#xff1a;本系列博客为C项目系列内容&#xff0c;通过代码来具体实现某个经典简单项目 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…

初识webpack(一)概念、入口配置、输出配置、loader等

目录 (一)概念 webpack的依赖图 (二)webpack的基本使用 (三)webpack的配置文件 1.入口(entry)配置 2.输出(output)配置 (三)loader 1.css文件处理 (1)安装css-loader和style-loader (2)在webpack.config.js中配置loader 2.less文件处理 3.postcss的使用 (1)安装…

python爬虫之豆瓣首页图片爬取

网址&#xff1a;https://movie.douban.com/ import requests from lxml import etree import re url https://movie.douban.com headers {User-Agent : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.289 Safari/5…

代理IP在游戏中的作用有哪些?

游戏代理IP的作用是什么&#xff1f;IP代理软件相当于连接客户端和虚拟服务器的软件“中转站”&#xff0c;在我们向远程服务器提出需求后&#xff0c;代理服务器首先获得用户的请求&#xff0c;然后将服务请求转移到远程服务器&#xff0c;然后将远程服务器反馈的结果转移到客…

redis 极简分布式锁实现

写在前面 工作中遇到&#xff0c;整理 reids 做简单分布式锁的思考博文适合刚接触 redis 的小伙伴理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是…

Flutter 开发3:创建第一个Flutter应用

Step 1: 安装Flutter 1.1 下载Flutter SDK 首先&#xff0c;你需要访问Flutter官方网站下载最新的Flutter SDK。选择适合你操作系统的安装包。 $ cd ~/development $ unzip ~/Downloads/flutter_macos_2.2.3-stable.zip1.2 更新环境变量 接下来&#xff0c;你需要将Flutter…

Git 介绍 与 配置

Git 介绍 Git是一个分布式版本控制系统&#xff0c;用于跟踪文件的更改和协作开发。它可以管理项目的版本历史记录&#xff0c;并允许多个开发者在同一时间进行并行开发。 解决上图产生的问题就出现了git 分布式版本控制系统 看下图 Git 配置 Git的基本配置包括用户名和电子邮…

人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示)

人脸识别 FaceNet人脸识别&#xff08;一种人脸识别与聚类的统一嵌入表示&#xff09; FaceNet的简介Facenet的实现思路训练部分 FaceNet的简介 Facenet的实现思路 import torch.nn as nndef conv_bn(inp, oup, stride 1):return nn.Sequential(nn.Conv2d(inp, oup, 3, stride…

Netty源码二:服务端创建NioEventLoopGroup

示例 还是拿之前启动源码的示例&#xff0c;来分析NioEventLoopGroup源码 NioEventLoopGroup构造函数 这里能看到会调到父类的MultiThread EventLoopGroup的构造方法 MultiThreadEventLoopGroup 这里我们能看到&#xff0c;如果传入的线程数目为0&#xff0c;那么就会设置2倍…

JDBC 结构优化2

JDBC 结构优化2 文章目录 JDBC 结构优化2结构优化2 - ATM系统(存,取,转,查)1 Service2 事务3 ThreadLocal4 事务的封装 结构优化2 - ATM系统(存,取,转,查) 1 Service 什么是业务? 代表用户完成的一个业务功能&#xff0c;可以由一个或多个DAO的调用组成。软件所提供的一个功…

[NCTF2019]Fake XML cookbook(特详解)

先试了一下弱口令&#xff0c;哈哈习惯了 查看页面源码发现xml function doLogin(){var username $("#username").val();var password $("#password").val();if(username "" || password ""){alert("Please enter the usern…

数据据库八之 视图、触发器、事务

【零】准备数据 【1】创建表 &#xff08;1&#xff09;部门表 d_id是部门的编号d_name是部门的名字 # 确保表不存在 drop table if exists department; # 创建表 create table department( d_id int auto_increment primary key, d_name varchar(6) )auto_increment 501 …

腾讯云部署vue+node项目

文章目录 一、安装宝塔二、vue项目部署三、node项目部署 前言: 关于项目部署,一开始也是找了很多资料,费了点时间,所以记录一下。希望能对各位有所帮助。 一、安装宝塔 1.首先在控制台,进入云服务器的终端界面 2.输入命令和密码获取权限,并且安装宝塔界面 yum install -y w…

如何把png改成jpg格式?分享5个好用的方法!

你是否经常遇到需要将PNG格式的图片转换成JPG格式的情况&#xff1f;无论是因为工作需要&#xff0c;还是为了适应不同的平台和设备&#xff0c;格式转换都是我们经常要面对的问题。那么&#xff0c;如何快速、简单地完成这个任务呢&#xff1f;今天&#xff0c;我们就来为你揭…

计算机网络——IP协议

前言 网络层的主要负责地址分配和路由选择,ip负责在网络中进行数据包的路由和传输。 IPv4报文组成&#xff08;了解&#xff09; IPv4首部&#xff1a;IPv4首部包含了用于路由和传输数据的控制信息&#xff0c;其长度为20个字节&#xff08;固定长度&#xff09;。 版本&#…

图灵之旅--ArrayList顺序表LinkedList链表栈Stack队列Queue

目录 线性表顺序表ArrayList简介ArrayList使用ArrayList的构造ArrayList常见操作ArrayList的遍历ArrayList的扩容机制利用ArrayList洗牌ArrayList的优缺点 链表链表的实现双向链表的实现 LinkedListLinkedList引入LinkedList的使用LinkedList的构造LinkedList的常用方法介绍Lin…

Power ModeII 插件的下载与使用-----idea

下载 Marketplace里面搜索下载即可 使用 下载后重启软件就可以用了 下面是一些关于Power ModeII &#xff0c;我的个性化设置截图 以及相关设置解释 插件或扩展的设置面板【用于给代码编辑器或集成开发环境&#xff08;IDE&#xff09;添加视觉效果】 主要设置 ENTER POWE…

Maven安装,学习笔记,详细整理maven的一些配置

Maven 1. 初识Maven 2. Maven概述 Maven模型介绍 Maven仓库介绍 Maven安装与配置 3. IDEA集成Maven 4. 依赖管理 01. Maven课程介绍 1.1 课程安排 学习完前端Web开发技术后&#xff0c;我们即将开始学习后端Web开发技术。做为一名Java开发工程师&#xff0c;后端 Web开发技术…

STM32——USART

一、通信 1.1通信是什么&#xff1b; 通信是将一个设备的数据发送到另一个设备中&#xff0c;从而实现硬件的扩展&#xff1b; 1.2通信的目的是什么&#xff1b; 实现硬件的扩展-在STM32中集成了很多功能&#xff0c;例如PWM输出&#xff0c;AD采集&#xff0c;定时器等&am…

数据结构和算法笔记5:堆和优先队列

今天来讲一下堆&#xff0c;在网上看到一个很好的文章&#xff0c;不过它实现堆是用Golang写的&#xff0c;我这里打算用C实现一下&#xff1a; Golang: Heap data structure 1. 基本概念 满二叉树&#xff08;二叉树每层节点都是满的&#xff09;&#xff1a; 完全二叉树&a…