Redis 基本命令—— 超详细操作演示!!!

内存数据库 Redis7—— Redis 基本命令

    • 三、Redis 基本命令(下)
      • 3.8 benchmark 测试工具
      • 3.9 简单动态字符串SDS
      • 3.10 集合的底层实现原理
      • 3.11 BitMap 操作命令
      • 3.12 HyperLogLog 操作命令
      • 3.13 Geospatial 操作命令
      • 3.14 发布/订阅命令
      • 3.15 Redis 事务
    • 四、Redis 持久化
    • 五、Redis 主从集群
    • 六、Redis 分布式系统
    • 七、Redis 缓存
    • 八、Lua脚本详解
    • 九、分布式锁

数据库系列文章:

关系型数据库:

  • MySQL —— 基础语法大全
  • MySQL —— 进阶


非关系型数据库:

  • Redis 的安装与配置

三、Redis 基本命令(下)

3.8 benchmark 测试工具

⭐️ 3.8.1、简介
    在Redis 安装完毕后会自动安装一个 redis-benchmark 测试工具,其是一个压 力测试工具,用于测试 Redis 的性能。
在这里插入图片描述

    通过 redis-benchmark --help 命令可以查看到其用法:

在这里插入图片描述

  • 其选项 options 非常多,下面通过例子来学习常用的 options 的用法。

⭐️ 3.8.2、测试1

(1) 命令解析
在这里插入图片描述
    以上命令中选项的意义:

  • -h :指定要测试的 Redis 的 IP ,若为本机,则可省略
  • -p :指定要测试的 Redis 的 port ,若为 6379 ,则可省略
  • -c :指定模拟有客户端的数量,默认值为 50
  • -n :指定这些客户端发出的请求的总量,默认值为 100000
  • -d :指定测试 get/set 命令时其操作的 value 的数据长度,单位字节,默认值为 3 。在测试其它命令时该指定没有用处。

    以上命令的意义是,使用 100 个客户端连接该 Redis ,这些客户端总共会发起 100000个请求, set/getvalue 为 8 字节数据。

(2) 测试结果分析

    该命令会逐个测试所有Redis 命令,每个命令都会给出一份测试报告,每个测试报告由四部分构成:

A、 测试环境报告

  • 首先就是测试环境:

在这里插入图片描述

B、 延迟百分比分布

  • 这是按照百分比进行的统计报告:每完成一次剩余测试量的 50% 就给出一个统计数据。

在这里插入图片描述

C、 延迟的累积分布

  • 这是按照时间间隔统计的报告:基本是每 0.1 毫秒统计一次。

在这里插入图片描述

D、 总述报告

  • 这是总述性报告。

在这里插入图片描述

⭐️ 3.8.3、测试2
在这里插入图片描述
    以上命令中选项的意义:

  • -t :指定要测试的命令,多个命令使用逗号分隔不能有空格
  • -q :指定仅给出总述性报告

3.9 简单动态字符串SDS

⭐️ 3.9.1、SDS简介
    无论是Redis 的 Key 还是 Value ,其基础数据类型都是字符串。例如 HashValuefieldvalue 的类型、 List 型、 Set 型、 ZSet 型 Value 的元素的类型等都是字符串。虽然 Redis是使用标准 C 语言开发的,但并没有直接使用 C 语言中传统的字符串表示,而是自定义了一种字符串。这种字符串本身的结构比较简单,但功能却非常强大,称为 简单动态字符串Simple Dynamic String ,简称 SDS

    注意,Redis 中的所有字符串并不都是 SDS ,也会出现 C 字符串。 C 字符串只会出现在字符串 “字面常量” 中,并且 该字符串不可能发生变更

在这里插入图片描述

redisLog(REDIS_WARNNING, "sdfsfsafsafds");

在这里插入图片描述

⭐️ 3.9.2、SDS结构

    SDS不同于 C 字符串。 C 字符串本身是一个以双引号括起来,以空字符 '\0' 结尾的字符序列。但 SDS 是一个结构体,定义在 Redis 安装目录下的 src/sds.h 中:

struct sdshdr {
	//字节数组,用于保存字符串
	char buf[];
	// buf[]中已使用字节数量,称为 SDS 的长度
	int len;
	// buf[]中尚未使用的字节数量
	int free;
}

    例如执行 SET country "China" 命令时,键 country 与 值 China 都是 SDS 类型的,只不过一个是 SDS 的变量,一个是 SDS 的字面常量。
在这里插入图片描述

  • China 在内存中的结构如下:

在这里插入图片描述
    通过以上结构可以看出, SDS 的 buf 值实际是一个 C 字符串,包含空字符 '\0' 共占 6 个字节。但 SDS 的 len 是不包含空字符 '\0' 的。
在这里插入图片描述

  • 该结构与前面不同的是,这里有 3 字节未使用空间。

⭐️ 3.9.3、SDS的优势

    C字符串使用 Len+1 长度的字符数组来表示实际长度为 Len 的字符串,字符数组最后以空字符 '\0' 结尾,表示字符串结束。这种结构简单,但不能满足 Redis 对字符串 功能性安全性高效性 等的要求。

(1) 防止 字符串长度获取 性能瓶颈

    对于C 字符串,若要获取其长度,则必须要通过遍历整个字符串才可获取到的。对于超长字符串的遍历,会成为系统的 性能瓶颈
    但,由于SDS 结构体中直接就存放着字符串的长度数据,所以对于获取字符串长度需要消耗的系统性能,与字符串本身长度是无关的,不会成为 Redis 的性能瓶颈。

(2) 保障二进制安全

    C字符串中只能包含符合某种编码格式的字符,例如 ASCIIUTF-8 等,并且除了字符串末尾外,其它位置是不能包含空字符 '\0' 的,否则该字符串就会被程序误解为提前结束。故而在图片、音频、视频、压缩文件、 office 文件等二进制数据的。
    但 SDS 不是以空字符 '\0' 作为字符串结束标志的,其是通过 len 属性来判断字符串是否结束的。所以,对于程序处理 SDS 中的字符串数据,无需对数据做任何限制、过滤、假设,只需读取即可。数据写入的是什么,读到的就是什么。

(3) 减少内存再分配次数

    SDS 采用了 空间预分配策略惰性空间释放策略 来避免内存再分配问题。
    空间预分配策略是指,每次SDS 进行空间扩展时,程序不但为其分配所需的空间,还会为其分配额外的未使用空间以空间换时间),以减少内存再分配次数。而额外分配的未使用空间大小取决于空间扩展后 SDS 的 len 属性值。

  • 如果 len 属性值 小于 1M ,那么分配的未使用空间 free 的大小与 len 属性值 相同
  • 如果 len 属性值 大于等于 1M ,那么分配的未使用空间 free 的大小固定是 1M

    SDS对于空间释放采用的是惰性空间释放策略。该策略是指, SDS 字符串长度如果缩短,那么多出的未使用空间将暂时不释放,而是增加到 free 中。以使后期扩展 SDS 时减少内存再分配次数。
    如果要释放 SDS 的未使用空间,则可通过 sdsRemoveFreeSpace() 函数来释放。

(4) 兼容 C 函数

    Redis 中提供了很多的 SDS 的 API ,以方便用户对 Redis 进行二次开发。为了能够兼容 C 函数, SDS 的底层数组 buf[] 中的字符串仍以空字符 '\0' 结尾。

    现在要比较的双方,一个是SDS ,一个是 C 字符串,此时可以通过 C 语言函数

strcmp(sds_str->buf, c_str)

⭐️ 3.9.4、常用的SDS操作函数

下表列出了一些常用的SDS 操作函数及其功能描述。

函数功能描述
sdsnew()使用指定的 C 字符串创建一个 SDS
sdsempty()创建一个不包含任何字符串数据的SDS
sdsdup()创建一个指定 SDS 的副本
sdsfree()释放指定的SDS
sdsclear()清空指定 SDS 的字符串内容
sdslen()获取指定SDS 的已使用空间 len 值
sdsavail()获取指定 SDS 的未使用空间 free 值
sdsMakeRoomFor()使指定的SDS 的 free 空间增加指定的大小
sdsRemoveFreeSpace()释放指定 SDS 的 free 空间
sdscat()将指定的C 字符串拼接到指定 SDS 字符串末尾
sdscatsds()将指定的 SDS 的字符串拼接到另一个指定 SDS 字符串末尾
sdscpy()将指定的C 字符串复制到指定的 SDS 中,覆盖原 SDS 字符串内容
sdsgrouzero()扩展 SDS 字符串到指定长度。这个扩展是使用空字符 '\0' 填充
sdsrange()截取指定SDS 中指定范围内的字符串
sdstrim()在指定 SDS 中删除所有指定 C 字符串中出现的所有字符
sdsemp()对比两个给定的SDS 字符串是否相同
sdstolow()将指定 SDS 字符串中的所有字母变为小写
sdstoupper()将指定SDS 字符串中的所有字母变为大写

3.10 集合的底层实现原理

    Redis 中对于 Set 类型的底层实现,直接采用了 hashTable 。但对于 HashZSetList 集合的底层实现进行了特殊的设计,使其保证了 Redis 的高性能。

⭐️ 3.10.1、两种实现的选择

    对于 HashZSet 集合,其底层的实现实际有两种:压缩列表 zipList ,与跳跃列表 skipList

    这两种实现对于用户来说是透明的,但用户写入不同的数据,系统会自动使用不同的实现。只有同时满足以配置文件 redis.conf 中相关集合 元素数量阈值元素大小阈值 两个条件,使用的就是压缩列表 zipList ,只要有一个条件不满足使用的就是跳跃列表 skipList 。例如,对于
ZSet 集合中这两个条件如下:
在这里插入图片描述

  • 集合元素个数小于 redis.confzset-max-ziplist-entries 属性的值,其默认值为 128
  • 每个集合元素大小都小于 redis.confzset-max-ziplist-value 属性的值,其默认值为 64 字节

⭐️ 3.10.2、zipList

在这里插入图片描述
(1) 什么是 zipList

    zipList,通常称为压缩列表 是一个经过 特殊编码 的用于 存储 字符串或整数双向链表
其底层数据结构由三部分构成: headentriesend 。这三部分在内存上是连续存放的。

(2) head

    head 又由三部分构成:

  • zlbytes 占 4 个字节,用于存放 zipList 列表整体数据结构所占的字节数,包括 zlbytes 本身的长度。
  • zltail 占 4 个字节,用于存放 zipList 中最后一个 entry 在整个数据结构中的偏移量(字节)。该数据的存在可以快速定位列表的尾 entry 位置,以方便操作。
  • zllen 占 2 字节,用于存放列表包含的 entry 个数。由于其只有 16 位,所以 zipList 最多可以含有的 entry 个数为 2 16 − 1 = 65535 2^{16} - 1 = 65535 2161=65535 个。(也能超过这个数量,超了这部分就失效了,只能遍历。)

(3) entries

    entries 是真正的列表,由很多的 列表元素 entry 构成。由于不同的元素类型、数值的不同,从而导致每个 entry 的长度不同。

    每个 entry 由三部分构成:

  • prevlength 该部分用于记录上一个 entry 的长度,以实现 逆序遍历 。默认长度为 1 字节,只要上一个 entry 的长度 <254 字节prevlength 就占 1 字节,否则其会自动扩展为 3 字节长度。
  • encoding 该部分用于标志后面的 data具体类型。如果 data 为整数类型, encoding 固定长度为1 字节。如果 data 为字符串类型,则 encoding 长度可能会是1 字节、2 字节或5 字节。data 字符串不同的长度,对应着不同的 encoding 长度。
  • data真正存储的数据。数据类型只能是整数类型或字符串类型。不同的数据占用的字节长度不同。

(4) end

    end 只包含一部分,称为 zlend。占1 个字节,值固定 为 255,即二进制位为全1,表示一个 zipList 列表的结束。

⭐️ 3.10.3、listPack

    对于ziplist,实现复杂,为了逆序遍历,每个 entry 中包含前一个 entry 的长度,这样会导致在 ziplist 中间修改或者插入entry需要进行级联更新。在高并发的写操作场景下会极度降低 Redis 的性能。为了实现更紧凑、更快的解析,更简单的实现,重写 实现了ziplist,并命名为listPack
在这里插入图片描述

    在 Redis 7.0 中,已经将 zipList 全部替换为了 listPack,但为了兼容性,在配置中也保留了 zipList 的相关属性。
在这里插入图片描述

在这里插入图片描述
(1) 什么是 listPack

     listPack 也是一个经过 特殊编码 的用于 存储 字符串或整数双向链表。其底层数据结构也由三部分构成:headentriesend,且这三部分在内存上也是连续存放的。
    listPackzipList 的重大区别在 head与每个 entry 的结构上,表示列表结束的 endzipListzlend 是相同的,占一个字节,且 8 位全为1

(2) head

    head 由两部分构成:

  • totalBytes :占 4 个字节,用于存放 listPack 列表整体数据结构所占的字节数,包括 totalBytes 本身的长度。
  • elemNum :占 2 字节,用于存放列表包含的 entry 个数。其意义与 zipListzllen 的相同。

    与 zipListhead 相比,没有了记录最后一个 entry 偏移量的 zltail

(3) entries

    entries 也是 listPack 中真正的列表,由很多的列表元素 entry 构成。由于不同的元素类型、数值的不同,从而导致每个 entry 的长度不同。但与 zipListentry 结构相比, listPackentry 结构发生了较大变化。
    其中最大的变化就是没有了记录前一个 entry 长度的 prevlength ,而增加了记录当前 entry 长度的 element-total-len 。而这个改变仍然可以实现 逆序遍历 ,但却避免了由于在列表中间修改或插入 entry 时引发的级联更新 。

    每个 entry 仍 由三部分构成:

  • encoding: 该部分用于标志后面的 data 的具体类型。如果 data 为整数类型, encoding长度可能会是 1 、 2 、 3 、 4 、 5 或 9 字节。不同的字节长度,其标识位不同。如果 data为字符串类型,则 encoding 长度可能会是 1 、 2 或 5 字节。 data 字符串不同的长度,对应着不同的 encoding 长度。
  • data:真正存储的数据。数据类型只能是整数类型或字符串类型。不同的数据占用的字
    节长度不同。
  • element-total-len: 该部分用于记录当前 entry 的长度,用于实现 逆序遍历 。由于其特殊的记录方式,使其本身占有的字节数据可能会是 1 、 2 、 3 、 4 或 5 字节。

⭐️ 3.10.4、skipList

(1) 什么是 skipList

    skipList跳跃列表,简称跳表 是一种 随机化 的数据结构,基于 并联双向链表,实现简单,查找 效率较高 。简单 来说跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能。也 正是这个跳跃功能,使得在查找元素时,能够提供 较高的效率 。

(2) skipList 原理

    假设有一个带头尾结点的有序链表。
在这里插入图片描述
    在该链表中,如果要查找某个数据,需要从头开始逐个进行比较,直到找到包含数据的那个节点,或者找到第一个比给定数据大的节点,或者找到最后尾结点,后两种都属于没有找到的情况。同样,当我们要插入新数据的时候,也要经历同样的查找过程,从而确定插入位置。
    为了提升查找效率,在偶数结点上增加一个指针,让其指向下一个偶数结点。

在这里插入图片描述

    这样所有偶数结点就连成了一个新的链表(简称 高层链表),当然,高层链表包含的节点个数只是原来链表的一半。此时再想查找某个数据时,先沿着高层链表进行查找。 当遇到第一个比待查数据大的节点时,立即从该大节点的前一个节点回到原链表中进行查找。例如若想插入一个数据 20, 则先在( 8,19,31,42 )的链表中查找,找到第一个比 20 大的节点 31 ,然后再在高层链表中找到 31 节点的前一个节点 19 ,然后再在原链表中获取到其下一个节点值为 23 。比 20大,则将 20 插入到 19 节点与 23 节点之间。若插入的是 25 ,比节点23 大,则插入到 23 节点与 31 节点之间。
    该方式明显可以减少比较次数,提高查找效率。如果链表元素较多,为了进一步提升查找效率,可以将原链表构建为三层链表,或 再高层级链表

在这里插入图片描述
    层级越高,查找效率就会越高 。

(3) 存在的问题

    这种对链表分层级的方式从原理上看确实提升了查找效率,但在实际操作时就出现了问题:由于固定序号的元素拥有固定层级,所以列表元素出现 增加或删除 的情况下,会导致列表整体元素层级大调整,但这样势必会大大降低系统性能
    例如,对于划分两级的链表,可以规定奇数结点为高层级链表,偶数结点为低层级链表。对于划分三级的链表,可以按照节点序号与 3 取模结果进行划分。但如果插入了新的节点,或删除的原来的某些节点,那么定会按照原来的层级划分规则进行重新层级划分,那么势必会大大降低系统性能。

(4) 算法优化

    为了避免前面的问题, skipList 采用了 随机分配层级方式。即在确定了总层级后,每添加一个新的元素时会自动为其随机分配一个层级。这种随机性就解决了节点序号与层级间的固定关系问题。
在这里插入图片描述
    上图演示了列表在生成过程中为每个元素随机分配层级的过程。从这个 skiplist 的创建和插入过程可以看出,每一个节点的层级数都是随机分配的,而且新插入一个节点不会影响到其它节点的层级数。只需要修改插入节点前后的指针,而不需对很多节点都进行调整。这就降低了插入操作的复杂度。
    skipList指的就是除了最下面第 1 层链表之外,它会产生若干层稀疏的链表,这些链表里面的指针跳过了一些节点 ,并且越高层级的链表跳过的节点越多。在查找数据的时先在高层级链表中进行查找,然后逐层降低,最终可能会降到第 1 层链表来精确地确定数据位置。在这个过程中由于跳过了一些节点,从而加快了查找速度。

⭐️ 3.10.5、quickList

在这里插入图片描述
(1) 什么是 quickList

    quickList,快速列表 quickList 本身是一个双向无循环 链表,它的每一个节点都是一个 zipList 。从 Redis3.2 版本开始,对于 List 的底层实现,使用 quickList 替代了 zipListlinkedList
    zipListlinkedList 都存在有明显不足,而 quickList 则 对它们进行了改进 :吸取了 zipListlinkedList 的优点,避开了它们的不足。
    quickList 本质上是 zipListlinkedList 的混合体 。 其 将 linkedList 按段切分,每一段使用 zipList紧凑存储 若干真正的数据元素 ,多个 zipList 之间使用双向指针串接起来。 当然,对于每个 zipList 中最多可存放多大容量的数据元素,在配置文件(redis.conf)中通过 list-max-ziplist-size 属性可以指定。
在这里插入图片描述

(2) 检索操作

    为了更深入的理解 quickList 的工作原理,通过对检索插入删除等操作的实现分析来加深理解。
    对于 List 元素的检索,都是以其索引 index 为依据的。 quickList 由一个个的 zipList 构成,每个 zipListzllen 中记录的就是当前 zipList 中包含的 entry 的个数,即包含的真正数据元素的个数。根据要检索元素的 index ,从 quickList 的头节点开始,逐个对 zipListzllensum求和,直到找到第一个求和后 sum 大于 indexzipList ,那么要检索的这个元素就在这个 zipList 中。

(3) 插入操作

    由于 zipList 是有大小限制的,所以在 quickList 中插入一个元素在逻辑上相对就比较复杂一些。假设要插入的元素的大小为 insertBytes ,而查找到的插入位置所在的 zipList 当前的大小为 zlBytes .

那么具体可分为下面几种情况:

  • 情况一:当 insertBytes + zlBytes <= list-max-ziplist-size 时 直接插入到 zipList 中相应位置即可。
  • 情况二:当 insertBytes + zlBytes > list-max-ziplist-size ,且插入的位置位于该 zipList 的首部位置,此时需要查看该 zipList 的前一个 zipList 的大小 prev_zlBytes
    • insertBytes + prev_zlBytes <= list-max-ziplist-size 时,直接将元素插入到前一个 zipList 的尾部位置即可
    • insertBytes + prev_zlBytes > list-max-ziplist-size 时,直接将元素自己 构建 为一个新的 zipList ,并连入 quickList
  • 情况三:当 insertBytes + zlBytes > list-max-ziplist-size ,且插入的位置位于该 zipList 的尾部位置,此时需要查看该 zipList 的后一个 zipList 的大小 next_zlBytes
    • insertBytes + next_zlBytes <= list-max-ziplist-size 时,直接将元素插入到后一个 zipList 的头部位置即可
    • insertBytes + next_zlBytes > list-max-ziplist-size 时,直接将元素自己 构建 为一个新的 zipList ,并连入 quickList
  • 情况四:当 insertBytes + zlBytes > list-max-ziplist-size ,且插入的位置位于该 zipList 的中间位置,则将当前 zipList 分割 为两个 zipList 连接入 quickList 中,然后将元素插入到分割后的前面 zipList 的尾部位置。

(4) 删除操作

    对于删除操作,只需要注意一点,在相应的 zipList 中删除元素后,该 zipList是否还有元素。如果没有其它元素了,则将该 zipList 删除,将其前后两个 zipList 相连接。

⭐️ 3.10.6、key与value 中元素的数量

    前面讲述的Redis 的各种特殊数据结构的设计,不仅极大提升了 Redis 的性能,并且还使得 Redis 可以支持的 key 的数量、集合 value 中可以支持的元素数量可以非常庞大。

  • Redis 最多可以处理 2 32 2^{32} 232key (约 42 亿) ),并且在实践中经过测试,每个 Redis 实例至少可以处理 2.5 亿个 key
  • 每个 HashListSetZSet 集合都可以包含 2 32 2^{32} 232 个元素。

3.11 BitMap 操作命令

⭐️ 3.11.1、BitMap简介
⭐️ 3.11.2、setbit

⭐️ 3.11.3、getbit

⭐️ 3.11.4、bitcount

⭐️ 3.11.5、bitpos
⭐️ 3.11.6、bitop
⭐️ 3.11.7、应用场景

3.12 HyperLogLog 操作命令

⭐️ 3.12.1、HyperLogLog简介
⭐️ 3.12.2、pfadd
⭐️ 3.12.3、pfcount
⭐️ 3.12.4、pfmerge
⭐️ 3.12.5、应用场景

3.13 Geospatial 操作命令

⭐️ 3.13.1、Geospatial简介
⭐️ 3.13.2、geoadd
⭐️ 3.13.3、geopos
⭐️ 3.13.4、geodist
⭐️ 3.13.5、geohash
⭐️ 3.13.6、georadius
⭐️ 3.13.7、georadiusbymember
⭐️ 3.13.8、应用场景

3.14 发布/订阅命令

⭐️ 3.14.1、消息系统
⭐️ 3.14.2、subscribe
⭐️ 3.14.3、psubscribe
⭐️ 3.14.4、publish
⭐️ 3.14.5、unsubscribe
⭐️ 3.14.6、punsubscribe
⭐️ 3.14.7、pubsub

3.15 Redis 事务

⭐️ 3.15.1、Redis 事务特性
⭐️ 3.15.2、Redis 事务实现
⭐️ 3.15.3、Redis 事务异常处理
⭐️ 3.15.4、Redis 事务隔离机制

四、Redis 持久化

🚀🚀🚀 Redis 持久化 快速食用:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------->


五、Redis 主从集群

六、Redis 分布式系统

七、Redis 缓存

八、Lua脚本详解

九、分布式锁

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C语言加油站】函数栈帧的创建与销毁 #保姆级讲解

函数栈帧的创建与销毁 导言一、计算机硬件1.冯•诺依曼机基本思想2.冯•诺依曼机的特点&#xff1a;3.存储器3.1 分类3.2 内存的工作方式3.3 内存的组成 4.寄存器4.1 基本含义4.2 寄存器的功能4.3 工作原理4.4 分类4.4.1 通用寄存器组AX(AH、AL)&#xff1a;累加器BX(BH、BL)&a…

第七节HarmonyOS UIAbility生命周期以及启动模式

一、UIAbility生命周期 为了实现多设备形态上的裁剪和多窗口的可扩展性&#xff0c;系统对组件管理和窗口管理进行了解耦。UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态&#xff0c;WindowStageCreate和WindowStageDestroy为窗口管理器&#xff08…

堆结构的应用:随时取得数据流中的中位数

大根堆和小根堆配合 实现 第一个数字直接入大根堆 对于后面的数字&#xff0c; 如果数字 < 大根堆的堆顶&#xff0c;这个数字入大根堆 否则入小根堆 在数字入堆的同时&#xff0c;进行大根堆与小根堆的大小的比较&#xff0c;一旦它们两个的大小之差 2&#xff0c;较大…

【浅尝C++】C++类的6大默认成员函数——构造、析构及拷贝构造函数

&#x1f388;归属专栏&#xff1a;浅尝C &#x1f697;个人主页&#xff1a;Jammingpro &#x1f41f;记录一句&#xff1a;好想摆烂&#xff0c;又好想学习~~ 文章前言&#xff1a;本篇文章简要介绍C类的构造函数、析构函数及拷贝构造函数&#xff0c;介绍每个小点时&#xf…

java+python农村集体产权管理系统php+vue

注册、登陆该系统根据操作权限的不同分为管理员和用户两种&#xff0c;新用户在登陆前要进行用户注册&#xff0c;注册完成后方可进行登陆。 本次设计的关键问题处理&#xff0c;主要有如下几点&#xff1a; (1&#xff09;本次开发&#xff0c;采用主流Thinkphp框架进行开发&a…

linux进入telnet和推出telnet

安装telnet centos7 yum install -y telnet ubuntu apt install -y telnet 进入telnet telnet ip port 退出telnet 1. 按下下面的组合键 ctrl] 2. 输入下面命令推出 quit

Go 语言中 sync 包的近距离观察

让我们来看看负责提供同步原语的 Go 包&#xff1a;sync。 sync.Mutex sync.Mutex 可能是 sync 包中被广泛使用的原语。它允许对共享资源进行互斥操作&#xff08;即不允许同时访问&#xff09;&#xff1a; mutex : &sync.Mutex{}mutex.Lock() // Update shared variab…

【linux】基本指令(中篇)

echo指令 将引号内容打印到显示屏上 输出的重定向 追加的重定向 输出的重定向 我们学习c语言的时候当以写的方式创建一个文件&#xff0c;就会覆盖掉该文件之前的内容 当我们以追加的方式打开文件的时候&#xff0c;原文件内容不会被覆盖而是追加 more指令 10.more指令…

YOLOv8优化策略:自适应改变核大小卷积AKConv,效果优于标准卷积核和DSConv |2023.11月最新成果

🚀🚀🚀本文改进: AKConv 中,通过新的坐标生成算法定义任意大小的卷积核的初始位置。 为了适应目标的变化,引入了偏移量来调整每个位置的样本形状。 此外,我们通过使用具有相同大小和不同初始采样形状的 AKConv 来探索神经网络的效果。 AKConv 通过不规则卷积运算完成…

简介vue

目录 一、介绍 渐进式框架​ 单文件组件​ 选项式 API (Options API)​ 组合式 API (Composition API)​ 该选哪一个&#xff1f;​ 创建一个 Vue 应用 应用实例​ 根组件​ DOM 中的根组件模板 应用配置​ 多个应用实例​ 一、介绍 Vue (发音为 /vjuː/&#xff…

代码随想录算法训练营第四十六天|139.单词拆分、背包问题总结

LeetCode 139. 单词拆分 题目链接&#xff1a;139. 单词拆分 - 力扣&#xff08;LeetCode&#xff09; 这道题使用完全背包来实现&#xff0c;我们首先考虑字符串是否可以由字符串列表组成&#xff0c;因此dp数组大小为n 1 &#xff0c;其意义是&#xff0c;在n个位置时是否能…

在 CentOS 7 上安装 MySQL 8

在 CentOS 7 上安装 MySQL 8 步骤 1: 添加 MySQL Yum 存储库 首先&#xff0c;我们需要添加 MySQL Yum 存储库。打开终端并执行以下命令&#xff1a; sudo yum install -y https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm步骤 2: 导入 MySQL GPG 公钥 …

wangeditor实时预览

<template><div><!--挂载富文本编辑器--><div style"width: 45%;float: left;margin-left: 2%"><p>编辑内容</p><div id"editor" style"height: 100%"></div></div><div style"w…

20世纪的葡萄酒有哪些创新?

葡萄酒是用酵母发酵的&#xff0c;直到20世纪中叶&#xff0c;这一过程都依赖于自然产生的酵母。这些发酵的结果往往不一致&#xff0c;而且由于发酵时间长&#xff0c;容易腐败。 酿酒业最重要的进步之一是在20世纪50、60年代引进了地中海的纯发酵菌种酿酒酵母&#xff0c;俗称…

计算机基础知识60

MySQL分组 # 概念&#xff1a;分组是按照某个指定的条件将单个单个的个体分成一个个整体 # MySQL分组的关键字&#xff1a;group by # 分组一般配合聚合函数使用&#xff1a; sum max min avg count 基本的语法格式: group by 字段名 [having 条件表达式] # 单独使用 group by关…

滴滴打车app出现系统异常,已过12小时,部分功能仍未完全恢复

据多地用户反馈&#xff0c;滴滴出行APP无法使用。11月27日深夜&#xff0c;上海、北京、广州等多地滴滴用户反馈&#xff0c;滴滴出行APP无法使用&#xff0c;地图无法加载。 不少网约车司机反映&#xff0c;“滴滴出行”系统出现故障&#xff0c;导致无法接单、定位混乱等情况…

相关性分析和作图

相关的类型 1. Pearson、Spearman和Kendall相关 Pearson 积差相关系数衡量了两个定量变量之间的线性相关程度。&#xff08;连续&#xff09; Spearman等级相关系数则衡量分级定序变量之间的相关程度。&#xff08;分类&#xff09; Kendall’s Tau 相关系数也是一种非参数的…

MySQL实现高可用方案-MHA安装及配置

MySQL高可用性解决方案Master High Availability (MHA) 是一种在 MySQL 故障转移环境中实现快速故障转移和数据保护的开源软件。MHA 能在 MySQL 主节点发生故障时&#xff0c;自动将备节点提升为主节点&#xff0c;并且不会中断正在进行的 SQL 操作。 需求&#xff1a;主从配置…

业务建模工具BPMN

目录 一、什么是BPMN 二、业务流程梳理的重要作用 三、BPMN的全图 四、BPMN的组成 1.BPMN的基本元素&#xff08;2.0&#xff09; 1.1 流对象&#xff08;Flow Objects&#xff09; 1.2 数据&#xff08;Data&#xff09; 1.3 连接对象&#xff08;Connecting Objects&a…

M3VSNET:无监督多度量多视图立体视觉网络(2021年)

M3VSNET&#xff1a;无监督多度量多视图立体视觉网络&#xff08;2021年&#xff09; 摘要1 引言2 相关工作3 实现方法3.1 网络架构 B. Huang, H. Yi, C. Huang, Y. He, J. Liu and X. Liu, “M3VSNET: Unsupervised Multi-Metric Multi-View Stereo Network,” 2021 IEEE Inte…