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基本类似 

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

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

相关文章

【Python】新手入门学习:什么是工作目录?

【Python】新手入门学习&#xff1a;什么是工作目录&#xff1f; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得…

数据库不应放在容器中?- B站Kubernetes有状态服务实践(Elasticsearch/Clickhouse)

本期作者 前言 云原生时代下&#xff0c; Kubernetes已成为容器技术的事实标准&#xff0c; 使得基础设施领域应用下自动化运维管理与编排成为可能。对于无状态服务而言&#xff0c; 业界早已落地数套成熟且较完美的解决方案。可对于有状态的服务&#xff0c; 方案的复杂度就以…

StringBuilder --java学习笔记

StringBuilder 代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的StringBuilder比String更适合做字符串的修改操作&#xff0c;效率会更高&#xff0c;代码也会更简洁 StringBuilder的常用构造器和方…

分享8款高效办公软件,让你准时下班

在现代职场中&#xff0c;办公软件已经成为我们日常工作中不可或缺的一部分。选择适合自己、高效且实用的办公软件&#xff0c;能大大提升我们的工作效率&#xff0c;从而帮助我们更好地平衡工作与生活。今天给大家分享8款高效办公软件&#xff0c;让你准时下班成为可能。 01、…

29 残差网络 ResNet【李沐动手学深度学习v2课程笔记】

目录 1. ResNet 1.1 残差块 1.2 ResNet块 1.3 总结 2. 代码实现 2.1 残差块 2.2 ResNet模型 2.3 训练模型 3. 小结 1. ResNet 1.1 残差块 只有当较复杂的函数类包含较小的函数类时&#xff0c;我们才能确保提高它们的性能。 1.2 ResNet块 五个stage 只不过是ResNet块…

Docker学习——Dock镜像

什么是Docker镜像 Docker 镜像类似于虚拟机镜像&#xff0c;可以将它理解为一个只读的模板。 一个镜像可以包含一个基本的操作系统环境&#xff0c;里面仅安装了 Apache 应用程序&#xff08;或 用户需要的其他软件&#xff09; 可以把它称为一个 Apache 镜像。镜像是创建 Do…

POS 之 提款密钥与验证者密钥

回顾之前的文章 文章标题文章地址&#x1f367;ETH网络中的账户https://blog.csdn.net/weixin_29491885/article/details/136318898&#x1f368;我们为什么需要助记词https://blog.csdn.net/weixin_29491885/article/details/135860211&#x1f9c1;一组助记词走遍天下也不怕…

嵌入式学习第二十六天!(网络传输:TCP编程、HTTP协议)

TCP通信&#xff1a; 1. TCP发端&#xff1a; socket -> connect -> send -> recv -> close 2. TCP收端&#xff1a; socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数&#xff1a; 1. co…

excel函数

1.VLOOKUP(B2.[测试部门.xls]结果集!$A:$C,1,FALSE)

2023年第三届中国高校大数据挑战赛第二场赛题D题赛题:行业职业技术培训能力评价(成品论文 代码与思路 视频讲解)

赛题 中国是制造业大国&#xff0c;产业门类齐全&#xff0c;每年需要培养大量的技能娴熟的技术工人进入工厂。某行业在全国有多所不同类型&#xff08;如国家级、省级等&#xff09;的职业技术培训学校&#xff0c;进行 5 种技能培训。学员入校时需要进行统一的技能考核&…

node管理器 nvm

需求背景&#xff1a;如果出现多个项目 不同项目使用的node版本不一致 需要切换node版本 如果每次单独下载对应的node版本太过于麻烦&#xff0c;使用nvm可以下载多个node版本&#xff0c;通过nvm切换控制使用哪个node版本 nvm下载地址&#xff1a;https://github.com/coreybut…

0-13 - 准备:智能指针类和异常类

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 智能指针示例1.1 内存泄漏&#xff08;臭名昭著的Bug &#xff09;1.2 当代 C 软件平台中的智能指针1.3 智能指针的设计方案1.4 智能指针的使用军规1.5 编程实验&#xff1a;智能指针示例 2. 异常类构建2.1 现代 C 库必然包含充…

蜂窝物联:智慧畜牧养殖解决方案

我国是一个畜牧大国&#xff0c;在实现畜牧业发展的过程中&#xff0c;面临着企业生产管理水平低、政府监管薄弱、环境污染、行业数据资源分散等问题&#xff0c;阻碍了现代畜牧业的快速发展。 近年来&#xff0c;蜂窝物联针对畜牧业的发展现状&#xff0c;借助新一代物联网和…

华为OD七日集训第2期 - 按算法分类,由易到难,循序渐进,玩转OD

目录 一、适合人群二、本期训练时间三、如何参加四、七日集训第 2 期五、精心挑选21道高频100分经典题目&#xff0c;作为入门。第1天、逻辑分析第2天、字符串处理第3天、矩阵第4天、深度优先搜索dfs算法第5天、回溯法第6天、二分查找第7天、双指针 大家好&#xff0c;我是哪吒…

新闻媒体软文发布,提升企业宣传效果的最佳方法!

在新闻媒体上发布宣传效果确实很高&#xff0c;可以帮助企业提高宣传效果&#xff0c;为企业打开知名度。迅推客新闻媒体软文发布有很多优势。如果写软文推广公司&#xff0c;可以有很多方法&#xff0c;比如用软文推广公司产品&#xff0c;介绍公司产品的亮点&#xff0c;其实…

【QT+QGIS跨平台编译】之七十一:【QGIS_Analysis跨平台编译】—【qgsrastercalclexer.cpp生成】

文章目录 一、Flex二、生成来源三、构建过程一、Flex Flex (fast lexical analyser generator) 是 Lex 的另一个替代品。它经常和自由软件 Bison 语法分析器生成器 一起使用。Flex 最初由 Vern Paxson 于 1987 年用 C 语言写成。 “flex 是一个生成扫描器的工具,能够识别文本中…

一口气看完西汉210年历史

1、刘邦建国 公元前202&#xff0c;刘邦在垓下之战中击败楚王项羽&#xff0c;终结了历时7年的秦末大乱&#xff0c;建立西汉王朝。 西汉全盛时期地图 公元前201年&#xff0c;匈奴单于冒顿引兵攻打太原&#xff0c;异姓诸侯王之一的汉王信战败投降&#xff0c;刘邦被迫亲自率…

Python·算法·每日一题(3月12日) 删除链表的倒数第 N 个结点

题目 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示例…

server win搭建apache网站服务器+php网站+MY SQL数据库调用电子阅览室

一、适用场景&#xff1a; 1、使用开源的免费数据库Mysql&#xff1b; 2、自己建网站的发布&#xff1b; 3、使用php代码建网站&#xff1b; 4、使用windows server作为服务器&#xff1b; 5、使用apache作为网站服务器。 二、win server 中apache网站服务器搭建 &#xff0…

【v4l2】V4L2框架-videobuf2(二)

系列文章目录 【V4L2】V4L2框架简述 【V4L2】V4L2框架之驱动结构体 【V4L2】V4L2子设备 【V4L2】V4L2框架-media device 【V4L2】V4L2框架-videobuf2 文章目录 系列文章目录用户空间的操作/dev/video 节点与 videobuf2 联系编程注意事项 用户空间的操作 用户空间 stream 操作 …