Redis常见数据类型下

目录

 Hash 哈希

常用指令

HSET

HGET 

HEXISTS

HDEL 

HKEYS  

HVALS 

 HGETALL 

 HMGET 

内部编码

Hash类型和关系型数据库

缓存方式对比 

List 列表 

特点 

常用命令 

LPUSH 

LPUSHX 

 RPUSH 

 RPUSHX 

LRANGE  

LPOP  /  RPOP 

 LINDEX 

LINSERT  

阻塞(BLOCK)版本的命令 

 内部编码

使用场景

 消息队列

微博列表 

Set 集合 

常用命令 

 SADD

SMEMBERS 

SISMEMBER  

SCARD  

SPOP 

SMOVE 

SREM 

集合的交集、并集、差集 

SINTER / SUNION / DIFF  

SINTERSTORE / SUNIONSTORE / DIFFSTORE

 内部编码

使用场景

Zset 有序集合 

常用命令

 ZADD

ZCARD 

ZCOUNT 

ZRANGE 

ZPOPMAX 

ZRANK 

ZREVRANK 

ZSCORE 

ZREM 

ZREMRANGEBYRANK 

ZREMRANGEBYSCORE 

ZINCRBY 

使用场景 

渐进式遍历 

SCAN 


 Hash 哈希

⼏乎所有的主流编程语⾔都提供了哈希(hash)类型,它们的叫法可能是哈希、字典、关联数
组、映射。

TIPS:哈希类型中的映射关系通常称为:field-value 用于区别Redis整体的键值对key-val的关系

所以在Redis的value中使用hash类型应该是这么表示key - field - val

常用指令

HSET

设置hash中指定的字段field 的值 value

语法:

HSET key field value [field value ...]

返回值:添加的字段的个数

示例:

HGET 

获取hash中指定字段的值

语法:

HGET key field

返回值:字段对应的值或者nil

示例:

HEXISTS

判断hash中是否有指定的字段

语法:

HEXISTS key field

返回值:1表示存在,0表示不存在

示例:

HDEL 

删除hash中指定的字段

语法:

HDEL key field [field ...]

返回值:本次操作删除的字段个数

示例:

HKEYS  

 获取hash中的所有字段

语法:

HKEYS key

 返回值:字段列表

示例:

HVALS 

获取hash中所有的值

语法:

HVALS key

 返回值:所有的值val

示例:

 HGETALL 

获取哈希汇总的所有字段以及对应的值

语法:

HGETALL key

 返回值:字段和其对应的值

示例:

 HMGET 

一次获取hash中字段的多个值

语法:

HMGET key field [field ...]

 返回值:字段对应的值或者nil

示例:

TIPS:在使⽤HGETALL时,如果哈希元素个数⽐较多,会存在阻塞Redis的可能。如果开发⼈员只需要获取部分field,可以使⽤HMGET

内部编码

哈希的内部编码有两种:

1.ziplist(压缩列表):当hash类型元素小于hash-max-ziplist-entries配置(默认512个)、同时所有的值都小于hash-max-ziplist-value(默认64字节),Redis会使用ziplist作为hash的内部实现,zipliost使用更加紧凑的就够实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀

2.hashtable(哈希表):当哈希类型无法满足ziplist的条件时,Redis会使用hashtable作为哈希的内部实现,因为此时的hashlist的读写小会下降,而hashtable的读写时间复杂度为O(1)

Hash类型和关系型数据库

  • 哈希类型是稀疏的,⽽关系型数据库是完全结构化的,例如哈希类型每个键可以有不同的field,⽽关系型数据库⼀旦添加新的列,所有⾏都要为其设置值,即使为null
  • 关系数据库可以做复杂的关系查询,而Reid社区模拟关系型复杂查询,例如:联表查询、聚合查询等基本不可能,维护成本高

缓存方式对比 

 

现在有三种方法缓存用户信息

1.原生字符串类型 -- 使用字符串类型,每个属性占用一个键

set user:1:name gc
set user:1:age 22
set user:1:sex 男

 优点: 实现简单,针对个别属性变更也很灵活。

缺点:占⽤过多的键,内存占⽤量较⼤,同时⽤⼾信息在?Redis?中⽐较分散,缺少内聚性,所以这种⽅案基本没有实⽤性

2.序列化字符串类型,例如JSON格式

set user:1 经过序列化后的字符串~~

 优点:针对总是以整体为操作的信息比较合适

缺点:序列化和反序列化本身需要一定的开销,如果总是操控个别属性的话不方便

3.哈希类型

hmset user:1 name gc age 22 sex 男

优点:简单直观且灵活

缺点:需要控制hash在ziplist和hashtable两种内部编码的转换,可能会造成内存开销大

List 列表 

列表类型是⽤来存储多个有序的字符串,⼀个列表最多可以存储2^32-1 个元素。在Redis中,可以对列表两端插⼊(push)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下标的元素等

入图对列表两端的插入和 弹出操作

特点 

  • 1. 列表中元素是有序的,是可以使用索引下标获取某个元素或者某个范围的元素列表
  • 2. 获取会得到该下标的元素,删除会将列表的长度减小
  • 3. 列表的元素允许重复 

常用命令 

LPUSH 

将⼀个或者多个元素从左侧放⼊(头插)到list中

返回值:插⼊后list的⻓度

示例:

LPUSHX 

在key存在时,将⼀个或者多个元素从左侧放⼊(头插)到list中。不存在则直接返回

语法:

LPUSHX key element [element ...] 

 返回值:插⼊后list的⻓度。

示例:

 RPUSH 

 将⼀个或者多个元素从右侧放⼊(尾插)到list中。

语法:

RPUSH key element [element ...]

 返回值:插⼊后list的⻓度

示例:

 RPUSHX 

在key存在时,将⼀个或者多个元素从右侧放⼊(尾插)到list中

语法:

RPUSHX key element [element ...] 

 返回值:插入之后的list长度

示例:

LRANGE  

获取从start到end区间的所有元素,左闭右闭 

语法:

LRANGE key start stop 

 返回值:指定区间内的元素

如果start为0,stop为-1就是遍历所有

 示例:

LPOP  /  RPOP 

lpop 从list左侧取出元素(即头删)

rpop从list右侧取出元素(即尾删)

语法:

LPOP key
RPOP key

 返回值:取出的元素或者nil

示例:

 LINDEX 

获取从左数第index位置的元素

语法:

LINDEX key index 

 返回值:取出的元素或者nil

示例:

LINSERT  

在特定位置插⼊元素。

语法:

LINSERT key <BEFORE | AFTER> pivot element 

 返回值:插入之后的list长度

 示例:

阻塞(BLOCK)版本的命令 

blpop和brpop是lpop和rpop的阻塞版本,和对应⾮阻塞版本的作⽤基本⼀致

但是阻塞版本会有如下特殊:

  • 在列表中有元素的情况下,阻塞和⾮阻塞表现是⼀致的。但如果列表中没有元素,⾮阻塞版本会理解返回nil,但阻塞版本会根据timeout,阻塞⼀段时间,期间Redis可以执⾏其他命令,但要求执⾏该命令的客⼾端会表现为阻塞状态
  • 命令中如果设置了多个键,那么会从左向右进⾏遍历键,⼀旦有⼀个键对应的列表中可以弹出元素,命令⽴即返回
  • 如果多个客⼾端同时多⼀个键执⾏pop,则最先执⾏命令的客⼾端会得到弹出的元素

 内部编码

列表类型的内部编码有两种:

1.ziplist(压缩列表):当hash类型元素小于hash-max-ziplist-entries配置(默认512个)、同时所有的值都小于hash-max-ziplist-value(默认64字节),Redis会使用ziplist作为hash的内部实现,zipliost使用更加紧凑的就够实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀

2.linkedlist(链表):大哥你列表无法满足ziplist条件的时候,Redis会使用linkedlist作为列表内部实现

使用场景

 消息队列

Redis可以使⽤lpush+brpop命令组合实现经典的阻塞式⽣产者-消费者模型队列,⽣产者客⼾端使⽤lpush从列表左侧插⼊元素,多个消费者客⼾端使⽤brpop命令阻塞式地从队列中"争抢"队⾸元素。通过多个客⼾端来保证消费的负载均衡和⾼可⽤性 

Redis分频道的阻塞队列模型:

微博列表 

每个⽤⼾都有属于⾃⼰的Timeline(微博列表),现需要分⻚展⽰⽂章列表。此时可以考虑使⽤
列表,因为列表不但是有序的,同时⽀持按照索引范围获取元素。

1.每篇微博使用哈希结构存储,举例微博有中有三个重要属性,title,content,time

hmset mblog:1 title xx time 1476536196 content xxxxx
...
hmset mblog:n title xx time 1476536196 content xxxxx

2.向用户的微博列表添加微博文章,user:uid:mblogs 作为键

其实就是往用户微博列表中,插入微博文章的哈希键

lpush user:1:mblogs mblog:1 mblog:3
...
lpush user:k:mblogs mblog:9

3.获取用户的微博列表,例如获取用户前1~6篇微博文章

keylist = lrange user:1:mblogs 0 9
for key in keylist{hgetall key
}

 这种方案实际可能存在两个问题:

1. 1+n问题,如果每次获取的微博个数较多,需要多次hgetall,此时可以考虑使用pipeline流水线模式批量提交命令

2.分裂获取文章时,lrange在列表两端表现好,获取列表中间元素标签差。此时可以对列表文进行拆分提高效率

Set 集合 

1.集合类型也是保存多个字符串类型的元素的,与列表类型不同的是,集合中元素之间是⽆序的

2.集合元素不允许重复,⼀个集合中最多可以存储2^32 -1 个元素。Redis除了⽀持集合内的增删查改操作,同时还⽀持多个集合取交集、并集、差集,合理地使⽤好集合类型,能在实际开发中解决很多问题

常用命令 

 SADD

将⼀个或者多个元素添加到set中。注意,重复的元素⽆法添加到set中。

语法:

SADD key member [member ...]

 返回值:本次添加成功的元素个数

示例:

SMEMBERS 

 获取⼀个set中的所有元素,注意,元素间的顺序是⽆序的。

语法:

SMEMBERS key 

返回值:所有元素的列表 

示例:

SISMEMBER  

 判断⼀个元素在不在set中。

语法:

SISMEMBER key member

 返回值:1表示元素在set中,0则表示不在set中 

示例:

SCARD  

获取⼀个set的基数(cardinality),即set中的元素个数

语法:

SCARD key

 返回值:set内的元素个数

示例:

SPOP 

从set中删除并返回⼀个或者多个元素。注意,由于set内的元素是⽆序的,所以取出哪个元素实际是未定义⾏为,即可以看作随机的

语法:

SPOP key [count]

 返回值:取出的元素

示例:

SMOVE 

将⼀个元素从源set取出并放⼊⽬标set中。

语法:

SMOVE source destination member 

 返回值:1表示成功,0表示失败

示例:

SREM 

将指定的元素从set中删除。

语法:

SREM key member [member ...] 

 返回值:本次操作删除的元素个数

示例:

集合的交集、并集、差集 

交集(inter)、并集(union)、差集(diff)如图所示  

SINTER / SUNION / DIFF  

获取sinter交集,sunion并集,diff差集中的元素

语法:

SINTER key [key ...] SUNION key [key ...] SDIFF key [key ...]

 返回值:交集、并集、差集的元素

SINTERSTORE / SUNIONSTORE / DIFFSTORE

获取给定set的交集、并集、差集中的元素并保存到⽬标set中。

语法:

SINTERSTORE destination key [key ...]
SUNIONSTORE destination key [key ...]
DIFFSTORE   destination key [key ...]

返回值:交集、并集、差集的元素个数

 内部编码

集合类型的内部编码有两种:

intset(整数集合):当集合中的元素都是整数并且元素的个数⼩于set-max-intset-entries配置
(默认512个)时,Redis会选⽤intset来作为集合的内部实现,从⽽减少内存的使⽤

hashtable(哈希表):当集合类型⽆法满⾜intset的条件时,Redis会使⽤hashtable作为集合的内部实现。

使用场景

集合类型⽐较典型的使⽤场景是标签(tag)。例如A⽤⼾对娱乐、体育板块⽐较感兴趣,B⽤⼾对历史、新闻⽐较感兴趣,这些兴趣点可以被抽象为标签。有了这些数据就可以得到喜欢同⼀个标签
的⼈,以及⽤⼾的共同喜好的标签 。例如⼀个电⼦商务⽹站会对不同标签的⽤⼾做不同的产品推荐

Zset 有序集合 

有序集合相对于字符串、列表、哈希、集合来说会有⼀些陌⽣。它保留了集合不能有重复成员的
特点,但与集合不同的是,有序集合中的每个元素都有⼀个唯⼀的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可以维护有序性的,但这个有序不是⽤下标作为排序依据⽽是⽤这个分数

 TIPS:有序集合中的元素是不能重复的,但分数允许重复。类⽐于⼀次考试之后,每个⼈⼀定有⼀个唯⼀的分数,但分数允许相同。

常用命令

 ZADD

添加或者更新指定的元素以及关联的分数到zset中,分数应该符合double类型,+inf/-inf?作为正负极限也是合法的。

ZADD的相关选项:

  • XX:仅仅⽤于更新已经存在的元素,不会添加新元素
  • NX:仅⽤于添加新元素,不会更新已经存在的元素
  • CH:默认情况下,ZADD?返回的是本次添加的元素个数,但指定这个选项之后,就会还包含本次更新的元素的个数。
  • INCR:此时命令类似ZINCRBY的效果,将元素的分数加上指定的分数。此时只能指定⼀个元素和分数。

语法:

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member...]

返回值:本次添加成功的元素个数。

示例:

ZCARD 

获取⼀个zset的基数(cardinality),即zset中的元素个数。

语法:

ZCARD key

 返回值:zset内的元素个数。 

 示例:

ZCOUNT 

返回分数在min和max之间的元素个数,默认情况下,min和max都是包含的

语法:

ZCOUNT key min max 

 返回值:满⾜条件的元素列表个数 

示例:

ZRANGE 

返回指定区间⾥的元素,分数按照升序。带上WITHSCORES可以把分数也返回

语法:

ZRANGE key start stop [WITHSCORES] 

 此处的[start,stop]为下标构成的区间从0开始,⽀持负数.

返回值:区间内的元素列表

示例:

ZPOPMAX 

删除并返回分数最⾼的count个元素

语法:

ZPOPMAX key [count]

  返回值:分数和元素列表

ZRANK 

返回指定元素的排名,升序。

语法:

ZRANK key member 

 示例: 

ZREVRANK 

返回指定元素的排名,降序

语法:

ZREVRANK key member 

 示例:

ZSCORE 

返回指定元素的分数 

语法:

ZSCORE key member 

 示例:

ZREM 

删除指定的元素

语法:

ZREM key member [member ...]

 返回值: 本次操作删除的元素个数

示例: 

ZREMRANGEBYRANK 

按照排序,升序删除指定范围的元素,左闭右闭。 

语法:

ZREMRANGEBYRANK key start stop 

 返回值:本次操作删除的元素个数。

示例:

ZREMRANGEBYSCORE 

按照分数删除指定范围的元素,左闭右闭。

语法:

ZREMRANGEBYSCORE key min max 

 返回值:本次操作删除的元素个数

示例:

ZINCRBY 

为指定的元素的关联分数添加指定的分数值 

语法:

ZINCRBY key increment member

 返回值:增加后元素的分数

示例:

使用场景 

有序集合⽐较典型的使⽤场景就是排⾏榜系统。例如常⻅的⽹站上的热榜信息,榜单的维度可能是多⽅⾯的:按照时间、按照阅读量、按照点赞量。

比如点赞一篇文章,就可以使用有序集合zadd 和 zincrby功能对该文章的点赞数增加

也可以将用户文章删除zrem,以及展示前100最多赞的文章 zrank等~~

渐进式遍历 

 Redis使⽤scan命令进⾏渐进式遍历键,进⽽解决直接使⽤keys获取键时可能出现的阻塞问题。每次scan命令的时间复杂度是O(1),但是要完整地完成所有键的遍历,需要执⾏多次scan。

  •  ⾸次scan从0开始
  •  当scan返回的下次位置为0时,遍历结束.

SCAN 

以渐进式的方式进行键的遍历

语法:

SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] 

 返回值: 下⼀次scan的游标(cursor)以及本次得到的键。

示例:

除了scan以外,Redis⾯向哈希类型、集合类型、有序集合类型分别提供了hscan、sscan、zscan命令,它们的⽤法和scan基本类似 

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

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

相关文章

【Linux】文件缓冲区|理解文件系统

目录 预备知识 观察现象 第一&#xff1a;携带\n&#xff0c;不使用fork()&#xff0c;打印到显示器 第二&#xff1a;携带\n&#xff0c;使用fork()&#xff0c;打印到显示器 第三&#xff1a;携带\n&#xff0c;使用fork()&#xff0c;打印到文件里 第四&#xff1a;不携…

如何选择适合的G口大流量服务器?

G口大流量服务器是指接入互联网的带宽达到1Gbps及以上&#xff0c;并且能够提供大量数据传输服务的服务器。那么如何选择适合的G口大流量服务器&#xff0c;RAK部落小编为您整理发布选择适合的G口大流量服务器需要考虑哪些关键点。 选择适合的G口大流量服务器时&#xff0c;应该…

JavaSec 基础之 CC1 链

文章目录 背景环境以及配置分析0x1 终点(利用点分析)0x20x30x310x320x33 0x040x05 背景 Apache Commons Collections是Apache提供的一个Java库&#xff0c;它扩展了Java自带的集合框架。通过这个库&#xff0c;咱们可以使用更多种类的集合类型&#xff0c;以及各种实用的集合操…

星星魔方

星星魔方 1&#xff0c;魔方三要素 &#xff08;1&#xff09;组成部件 6个中心块和8个角块和三阶魔方同构&#xff0c;另外每个面还有构成五角星的十个块。 &#xff08;2&#xff09;可执行操作 一共12种操作&#xff0c;其中6种是每个层顺时针旋转90度&#xff0c;另外6…

HTML静态网页成品作业(HTML+CSS)——家乡漳州介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

Python的特性——跟老吕学Python编程

Python的特性——跟老吕学Python编程 Python的特性1.Python易学易用2.Python是解释型语言3.Python是交互式的4.Python是一种多范式语言5.Python的标准库6.Python是开源的7.Python是跨平台的8.用于GUI应用程序的Python9.Python的数据库连接10.Python是可扩展的11.Python拥有活跃…

【golang】28、用 httptest 做 web server 的 controller 的单测

文章目录 一、构建 HTTP server1.1 model.go1.2 server.go1.3 curl 验证 server 功能1.3.1 新建1.3.2 查询1.3.3 更新1.3.4 删除 二、httptest 测试2.1 完整示例2.2 实现逻辑2.3 其他示例2.4 用 TestMain 避免重复的测试代码2.5 gin 框架的 httptest 一、构建 HTTP server 1.1…

ElementUI两个小坑

1.form表单绑定的是一个对象&#xff0c;表单里的一个输入项是对象的一个属性之一&#xff0c;修改输入项&#xff0c;表单没刷新的问题&#xff0c; <el-form :model"formData" :rules"rules" ref"editForm" class"demo-ruleForm"…

蓝牙耳机链接电脑莫名奇妙关机问题(QQ浏览器)

蓝牙耳机连接电脑听歌的时候&#xff0c;如果听歌软件是暴风影音&#xff0c;或者其它播放器&#xff0c;蓝牙不会自动关机&#xff0c;但如果是QQ浏览器&#xff0c;蓝牙耳机经常莫名其妙的关机&#xff0c;时间间隔忽长忽短&#xff0c;没有规律&#xff0c;解决办法就是重启…

考研C语言复习初阶(5)

目录 一.表达式求值 1.1隐式类型转换 1.2 算术转换 12.3 操作符的属性 二. 指针是什么&#xff1f; 三 指针和指针类型 3.1 指针-整数 3.2 指针的解引用 3.3 野指针 四.指针运算 4.1 指针-整数 4.2 指针-指针 4.3 指针的关系运算 5. 指针和数组 6. 二级指针 …

202012青少年软件编程(图形化) 等级考试试卷(一级)

青少年软件编程(图形化) 等级考试试卷(一级)2020年12月 第1题:【 单选题】 下面哪个区域是“舞台区” ?( ) A:A B:B C:C D:D 【正确答案】: B 【试题解析】 : 第2题:【 单选题】 下图为小猫的初始方向, 哪个积木可以让小猫面向正右方?( ) A: B: C:…

2024.3.11 训练记录(13)

继续补题 文章目录 ICPC 2018青岛I Soldier GameICPC 2018青岛K Airdrop ICPC 2018青岛I Soldier Game 题目链接 线段树 果然稍微复杂一点的线段树就很难实现啊&#xff0c;不看题解根本没反应过来是线段树 struct Node {int l, r, lb, rb, nb, b; } tr[N * 4];其中&#x…

一个Promise全新API

1. 资讯速览 最近&#xff0c;Promise 新出了一个方法&#xff0c;已经进入 Stage 3 &#xff08;候选阶段&#xff09; &#xff0c;相信很快就能达到 Stage 4 &#xff08;完成阶段&#xff09;&#xff0c;并在项目中广泛使用。 这个方法就是 Promise.withResolvers。它是…

【C++干货基地】面向对象核心概念与实践原理:拷贝构造函数的全面解读

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

游戏行业需要堡垒机吗?用哪款堡垒机好?

相信大家对于游戏都不陌生&#xff0c;上到老&#xff0c;下到小&#xff0c;越来越多的小伙伴开始玩游戏。随着游戏用户的增加&#xff0c;如何保障用户资料安全&#xff0c;如何确保游戏公司数据安全等是一个不容忽视的问题。因此不少人在问&#xff0c;游戏行业需要堡垒机吗…

系统设计 - SDK设计流程

▌从 0 到 1 开发 一般从 0 设计一款 SDK&#xff0c;总体上可以分为 5 个步骤&#xff1a;基础架构的设计、开放 API 接口设计、业务功能框架设计与开发、基础核心库设计与开发、打包与发布。 1. 第一步是基础架构设计&#xff0c;一个好的架构可主要从可读性、可扩展性、可维…

css3实现3D立方体旋转特效源码

源码介绍 CSS3自动旋转正方体3D特效是一款基于css3 keyframes属性制作的图片相册自动旋转立方体特效 效果展示 下载地址 css3实现3D立方体旋转特效代码

PCL点云处理之四点确定球心和半径(克拉默法则C++) (二百二十九)

PCL点云处理之四点确定球心和半径(克拉默法则C++) (二百二十九) 一、算法介绍二、算法实现1.代码2.结果一、算法介绍 相比于计算点坐标均值作为球心和某点到均值距离作为半径的快速计算法,这里介绍的方法更加适合精度要求较高的四点定球计算,下面是具体的实现代码,C++编…

搭建mysql主从复制(主主复制)

1&#xff1a;设主库允许远程连接(注意&#xff1a;设置账号密码必须使用的插件是mysql_native_password&#xff0c;其他的会连接失败) #切换到mysql这个数据库&#xff0c;修改user表中的host&#xff0c;使其可以实现远程连接 mysql>use mysql; mysql>update user se…

蓝牙系列十三:协议栈L2CAP层

L2CAP 全称为逻辑链路控制与适配协议(Logical Link Control and Adaptation Protocol)&#xff0c;位于基带层之上&#xff0c;将基带层的数据分组交换为便于高层应用的数据分组格式&#xff0c;并提供协议复用和服务质量交换等功能。 该层属于主机的内容&#xff0c;位于HCI层…