Redis自学之路—高级特性(实现消息队列)(七)
目录
简介
Redis的Key和Value的数据结构组织
全局哈希表
渐进式rehash
发布和订阅
操作命令
publish 发布消息
subscribe 订阅消息
psubscribe订阅频道
unsubscribe 取消订阅一个或多个频道
punsubscribe 取消订阅一个或多个模式
查询订阅情况-查看活跃的频道
查询订阅情况-查看频道订阅数
使用场景
缺点
Redis Stream
Stream总述
常用操作命令
生产端
xadd 追加消息
xrange 获取消息列表,会自动过滤已经删除的消息
xlen 消息长度
del 删除Stream
xdel 删除指定的消息(指定ID)
消费者
单消费者
xread从Streams开头进行消费
指定从streams的消息ID开始(不包括命令中的消息id)
从尾部读取最新的一条消息
以阻塞的方式读取最新一条消息
消费组
xgroup 创建消费组 0-表示从头开始消费
xgroup 创建消费组 $表示从尾部开始消费,只接受新消息,当前Stream消息会全部忽略
xinfo查看指定Stream的详细信息
xinfo 查看消费组Group的情况
xinfo 查看Consumer信息
消息消费
xreadgroup消费组的组内消费
xreadgroup 设置阻塞等待进行消费组内消费者消费消息
xack 消息确认
消息不消息的原因
xpending 获取消费组内消费者的未处理完毕的消息
xpending 查询详细信息
xclaim用于转移未确认(pending)消息所有权
查看已消费消息的方法
Redis中几种消息队列实现总结
1.基于List的 LPUSH+BRPOP 的实现
优点
缺点
2.基于Sorted-Set的实现
优点
缺点
3.PUB/SUB,订阅/发布模式
优点
缺点
基于Stream类型的实现
消息队列问题
Stream消息太多怎么办?
消息如果忘记ACK会怎样?
PEL如何避免消息丢失?
死信问题
Stream的高可用
分区 Partition
简介
本文章主要了解Redis的高级特性与应用场景,很多朋友们都认为Redis只是单纯的负责项目中的缓存,以及在项目中做登录功能,数据缓存功能,其实都被误导了,Redis也是支持消息队列的,支持发布和订阅、支持生产端、消费端。目前第三方消息队列所能处理的事,Redis也是可以的,只不过Redis有它自己的优点和弊端,接下来主要来了解一下Redis的消息队列。
Redis的Key和Value的数据结构组织
全局哈希表
为了实现从键到值的快速访问,Redis 使用了一个哈希表来保存所有键值对。一个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶。一个哈希表是由多个哈希桶组成的,每个哈希桶中保存了键值对数据。
哈希桶中的 entry 元素中保存了key和value指针,分别指向了实际的键和值,这样一来,即使值是一个集合,也可以通过*value指针被查找到。因为这个哈希表保存了所有的键值对,所以,把它称为全局哈希表。
哈希表的最大好处很明显,就是可以用 O(1) 的时间复杂度来快速查找到键值对:只需要计算键的哈希值,就可以知道它所对应的哈希桶位置,然后就可以访问相应的 entry 元素。
但当往 Redis 中写入大量数据后,就可能发现操作有时候会突然变慢了。这其实是因为忽略了一个潜在 的风险点,那就是哈希表的冲突问题和 rehash 可能带来的操作阻塞。
当往哈希表中写入更多数据时,哈希冲突是不可避免的问题。这里的哈希冲突,两个 key 的哈希值和哈希桶计算对应关系时,正好落在了同一个哈希桶中。
Redis 解决哈希冲突的方式,就是链式哈希。链式哈希也很容易理解,就是指同一个哈希桶中的多个元素用一个链表来保存,它们之间依次用指针连接。
当然如果这个数组一直不变,那么hash冲突会变很多,这个时候检索效率会大打折扣,所以Redis就需要把数组进行扩容(一般是扩大到原来的两倍),但是问题来了,扩容后每个hash桶的数据会分散到不同的位置,这里设计到元素的移动,必定会阻塞IO,所以这个ReHash过程会导致很多请求阻塞。
渐进式rehash
为了避免这个问题,Redis 采用了渐进式 rehash。
首先、Redis 默认使用了两个全局哈希表:哈希表 1 和哈希表 2。一开始,当你刚插入数据时,默认使用哈希表 1,此时的哈希表 2 并没有被分配空间。随着数据逐步增多,Redis 开始执行 rehash。
1、给哈希表 2 分配更大的空间,例如是当前哈希表 1 大小的两倍
2、把哈希表 1 中的数据重新映射并拷贝到哈希表 2 中
3、释放哈希表 1 的空间
在上面的第二步涉及大量的数据拷贝,如果一次性把哈希表 1 中的数据都迁移完,会造成 Redis 线程阻塞,无法服务其他请求。此时,Redis 就无法快速访问数据了。
在Redis 开始执行 rehash,Redis仍然正常处理客户端请求,但是要加入一个额外的处理:
- 处理第1个请求时,把哈希表 1中的第1个索引位置上的所有 entries 拷贝到哈希表 2 中
- 处理第2个请求时,把哈希表 1中的第2个索引位置上的所有 entries 拷贝到哈希表 2 中
- 如此循环,直到把所有的索引位置的数据都拷贝到哈希表 2 中。
这样就巧妙地把一次性大量拷贝的开销,分摊到了多次处理请求的过程中,避免了耗时操作,保证了数据的快速访问。
所以这里基本上也可以确保根据key找value的操作在O(1)左右。
不过这里要注意,如果Redis中有海量的key值的话,这个Rehash过程会很长很长,虽然采用渐进式Rehash,但在Rehash的过程中还是会导致请求有不小的卡顿。并且像一些统计命令也会非常卡顿:比如keys
按照Redis的配置每个实例能存储的最大的key的数量为2的32次方,即2.5亿,但是尽量把key的数量控制在千万以下,这样就可以避免Rehash导致的卡顿问题,如果数量确实比较多,建议采用分区hash存储。
发布和订阅
Redis提供了基于“发布/订阅(pub/sub)”模式的消息机制,此模式下,消息发布者和订阅者不进行直接的通信,发布者客户端向指定的频道(channel)发布消息,订阅该频道的每个客户端都可以收到该消息.
操作命令
Redis主要提供了发布消息、订阅频道、取消订阅以及按照模式订阅和取消订阅等命令。
publish 发布消息
publish channel message
返回值是接收到信息的订阅者数量,如果是0说明没有订阅者,这条消息就丢了(再启动订阅者也不会收到)。
subscribe 订阅消息
subscribe channel [channel ...]
订阅者可以订阅一个或多个频道,如果此时另一个客户端发布一条消息,当前订阅者客户端会收到消息。
客户端在执行订阅命令之后进入了订阅状态(类似于监听),
只能接收subscribe、psubscribe,unsubscribe、 punsubscribe的四个命令。
psubscribe订阅频道
PSUBSCRIBE pattern [pattern ...]
通过模式订阅频道。模式是一个类似正则表达式的概念,允许客户端订阅匹配特定模式的所有频道。
示例:如果客户端执行 PSUBSCRIBE news.* 命令,它将订阅所有以 “news.” 开头的频道,并接收这些频道上发布的所有消息。
unsubscribe 取消订阅一个或多个频道
UNSUBSCRIBE channel [channel ...]
取消订阅一个或多个频道。
示例:如果客户端之前订阅了 “news.it” 频道,并执行 UNSUBSCRIBE news.it 命令,它将停止接收该频道上发布的消息。
punsubscribe 取消订阅一个或多个模式
UNSUBSCRIBE channel [channel ...]
取消订阅一个或多个模式。
示例:如果客户端之前订阅了 “news.it” 频道,并执行 UNSUBSCRIBE news.it 命令,它将停止接收该频道上发布的消息。
查询订阅情况-查看活跃的频道
pubsub channels [pattern]
Pubsub 命令用于查看订阅与发布系统状态,包括活跃的频道(是指当前频道至少有一个订阅者),其中[pattern]是可以指定具体的模式,类似于通配符。
查询订阅情况-查看频道订阅数
pubsub numsub channel
使用场景
需要消息解耦又并不关注消息可靠性的地方都可以使用发布订阅模式。
缺点
- 会出现消息丢失,无法找回情况
- 无法实现消息堆积和回溯
例如:PubSub 的生产者传递过来一个消息,Redis会直接找到相应的消费者传递过去。如果一个消费者都没有,那么消息直接丢弃。如果开始有三个消费者,一个消费者突然挂掉了,生产者会继续发送消息,另外两个消费者可以持续收到消息。但是挂掉的消费者重新连上的时候,这断连期间生产者发送的消息,对于这个消费者来说就是彻底丢失了。
所以和很多专业的消息队列系统(例如Kafka、RocketMQ)相比,Redis 的发布订阅很粗糙,但胜在足够简单,如果当前场景可以容忍的这些缺点,也不失为一个不错的选择。
正是因为 PubSub 有这些缺点,它的应用场景其实是非常狭窄的。
从Redis5.0 新增了 Stream 数据结构。
Redis Stream
Redis5.0最大的新特性就是多出了一个数据结构Stream,它是一个新的强大的支持多播的可持久化的消息队列,Redis的作者声明Redis Stream借鉴了Kafka的设计。
Stream总述
Redis Stream 的结构如上图所示,每一个Stream都有一个消息链表,将所有加入的消息都串起来,每个消息都有一个唯一的 ID 和对应的内容。消息是持久化的,Redis 重启后,内容还在。
具体操作:
1.每个Stream都有唯一的名称,它就是Redis的key,首次使用xadd指令追加消息时自动创建。
- 消息ID的形式是timestampInMillis-sequence。
- 例如1537856881582-3,它表示当前的消息在毫米时间戳1537856881582时产生,并且是该毫秒内产生的第5条消息。
- 消息ID可以由服务器自动生成(*代表默认自动),也可以由客户端自己指定,但是形式必须是整数-整数,而且必须是后面加入的消息的ID要大于前面的消息ID。
- 消息内容就是键值对,跟hash结构的键值对一样。
2.每个Stream都可以挂多个消费组,每个消费组会有个游标last_delivered_id在Stream数组之上往前移动,表示当前消费组已经消费到哪条消息了。
每个消费组都有一个Stream内唯一的名称,消费组不会自动创建,它需要单独的指令xgroup create进行创建,需要指定从Stream的某个消息ID开始消费,这个ID用来初始化last_delivered_id变量。
3.每个消费组(Consumer Group)的状态都是独立的,相互不受影响。同一份Stream内部的消息会被每个消费组都消费到。
4.同一个消费组(Consumer Group)可以挂接多个消费者(Consumer),这些消费者之间是竞争关系,任意一个消费者读取了消息都会使游标last_delivered_id往前移动,每个消费者有一个组内唯一名称。
多个消费者可以达到流量分摊的目的,为大业务流量的场景做负载和分流。
5.消费者(Consumer)内部会有个状态变量pending_ids,它记录了当前已经被客户端读取,但是还没有ack的消息。
如果客户端没有ack,这个变量里面的消息ID会越来越多,一旦某个消息被ack,它就开始减少。这个pending_ids变量在Redis官方被称为PEL,也就是Pending Entries List,这是一个核心的数据结构,它用来确保客户端至少消费了消息一次,而不会在网络传输的中途丢失了没处理。
常用操作命令
生产端
xadd 追加消息
xadd第一次对于一个stream使用可以生成一个stream的结构
xadd key [NOMKSTREAM] [MAXLEN|MINID [=|~] threshold [LIMIT count]] *|ID field value [field value ...]
- key:流的键名
- ID:新条目的ID。如果指定为*,Redis会自动生成一个唯一的ID。
- field value:一个或多个键值对,表示添加到流中的条目数据。
- [NOMKSTREAM]:如果流不存在
相关文章:
Redis自学之路—高级特性(实现消息队列)(七)
目录 简介 Redis的Key和Value的数据结构组织 全局哈希表 渐进式rehash 发布和订阅 操作命令 publish 发布消息 subscribe 订阅消息 psubscribe订阅频道 unsubscribe 取消订阅一个或多个频道 punsubscribe 取消订阅一个或多个模式 查询订阅情况-查看活跃的频道 查询…...
ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本)
ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本) code review! 参考笔记 1.ROS基本框架1——编写简单的发布者和订阅者(C++和Python版本) 2.ROS基本框架2——在ROS开发中创建并使用自定义消息(C++版本) 文章目录 ROS基本框架2——在ROS开发中创建并使用自定义…...
计算机的错误计算(一百七十二)
摘要 探讨 MATLAB 对于算式 的计算误差。 例1. 在 MATLAB 中计算 的值。 直接贴图吧: 这样,MATLAB 的输出中只有3位正确数字,有效数字的错误率为 (16-3)/16 81.25% . 因为16位的正确输出为 0.2971242332737277e-18(ISReals…...
贵州大学oj平台高级语言第九次作业(四)
题目:链表的基础操作 题目描述 链表是软件中一种最基本的数据结构,它是用链式存储结构实现数据存储的线性表。它较顺序表(如数组)而言在插入和删除数据时不必移动其后的大批量元素。现在给你一些整数,然后会频繁地插入和删除其中的某些元素&a…...
手机卡限速丨中国移动5G变3G,网速500kb
以下猜测错误,又有新的猜测:河南移动的卡出省限速。可能是因为流量结算。 “2024年7月1日起,中国移动集团内部将开启跨省流量结算” 在深圳四五年了,之前没有过,就从上个月开始。11月底解除限速,12月刚开…...
种花问题算法
假设有一个很长的花坛,一部分地块种植了花,另一部分却没有。可是,花不能种植在相邻的地块上,它们会争夺水源,两者都会死去。 给你一个整数数组 flowerbed 表示花坛,由若干 0 和 1 组成,其中 0 …...
Node.js-Mongodb数据库
MongoDB MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库 数据库是什么? 数据库(DataBase)是按照数据结构来组织、存储和管理数据的应用程序(软件) 数据库作用? 对数据进行增、删…...
Nginx
目录 基本介绍 Nginx核心功能 Nginx下载&安装&启动 配置防火墙 Nginx常用命令 Nginx配置文件 全局块 events块 http块 http全局块 server 块 检查配置信息 快速入门 安装JDK 安装Tomcat 反向代理分析 Location语法规则 反向代理配置-Location实例 …...
CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(没思路了)
通过网盘分享的文件:如果能重来.zip 链接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取码: 1111 --来自百度网盘超级会员v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…...
HTML5系列(7)-- Web Storage 实战指南
前端技术探索系列:HTML5 Web Storage 实战指南 🗄️ 致读者:本地存储的新纪元 👋 前端开发者们, 今天我们将深入探讨 HTML5 中的 Web Storage 技术,这是一个强大的本地存储解决方案,让我们能…...
RocketMQ: 保证消息的可靠性投递
概述 在分布式系统中,消息队列作为异步通信的重要组件,其可靠性和稳定性至关重要RocketMQ 是阿里巴巴开源的一款高性能、高可靠性的分布式消息中间件,广泛应用于各种场景,如交易订单处理、日志收集、流计算等 RocketMQ 的可靠性…...
消息传递神经网络(Message Passing Neural Networks, MPNN)
消息传递神经网络(Message Passing Neural Networks, MPNN) 一、引言二、消息传递框架概述1.消息传递阶段(1)消息生成与传播-message(2)消息聚合-aggregate(3)消息更新-update&#…...
Python干货总结篇:列表、字典、集合、元组的区别与用途
前言: 更详细知识点,搞懂列表、字典、集合、元组到底是什么,可关注主页文章:Python知识点精汇! 目录 一、特点与用途 1.列表:a[ ] 2.集合:a{ } 3.字典:a{key:value} 4.元组&am…...
vue.js学习(day 18)
实例:面经基础版...
【Gitlab】CICD使用minio作为分布式缓存
1、安装minio 下载适合自己系统版本的安装文件https://dl.min.io/server/minio/release/windows-amd64/ yum install xxx.rpm 2、配置/etc/profile export MINIO_ACCESS_KEYroot [ui登录账号] export MINIO_SECRET_KEYminioDev001 [ui登录密码] export MINIO_OPTS"…...
医院管理系统
私信我获取源码和万字论文,制作不易,感谢点赞支持。 医院管理系统 摘要 随着信息互联网信息的飞速发展,医院也在创建着属于自己的管理系统。本文介绍了医院管理系统的开发全过程。通过分析企业对于医院管理系统的需求,创建了一个计…...
编译器优化技术
方法内联 逃逸分析 公共子表达式消除 数据边界检查消除...
高斯消元——acwing
题目一:高斯消元解线性方程组 883. 高斯消元解线性方程组 - AcWing题库 分析 代码 #include<bits/stdc.h> using namespace std;const int N 110; const double eps 1e-6; // 注意了double, 和1e-6 ,,这样才是double的0 int n;double a[N][N];int guass…...
华为关键词覆盖应用市场ASO优化覆盖技巧
在我国的消费者群体当中,华为的品牌形象较高,且产品质量过硬,因此用户基数也大。与此同时,随着影响力的增大,华为不断向外扩张,也逐渐成为了海外市场的香饽饽。作为开发者和运营者,我们要认识到…...
[代码随想录06]哈希表的使用,有效字母异位词,两数组交集,快乐数,两数之和
前言 哈希表是什么?一句话带你理解,简单来说我们对于杂乱的数据,怎么快速找到数据,如何做呢?一般的做法就是遍历复杂度为o(N)去找寻一个数据,但是吧,我们这样思考的话,还是花了大量时…...
linux网络抓包工具
linux网络抓包工具 一、tcpdump1.1 基本用法1.2 龙芯平台实例操作 二、wireshark2.1 主要功能2.2 龙芯平台实例操作 一、tcpdump tcpdump 指令可列出经过指定网络界面的数据包文件头,可以将网络中传送的数据包的 “头” 完全截获下来提供分析。它支持针对网络层、协…...
运维工程师.云计算工程师面试题.考试题
《(全国)运维自动化阶段第1套卷》 卷面总分 题号 单选题 90 题分 得分 一、单选题(每题2分,共计70分;得分____) 1. 下面哪个选项可以做变量名称?( ) A、if B、123abc C、for D、User_Name 2. 哪种数据类型可以做增,删,改相关操作?( ) A、字符串 B、列表 C、元…...
递归1——递归入门
目录 1.递归 2.递归的基本题目 2.1.题目一——P5739 【深基7.例7】计算阶乘 - 洛谷 | 计算机科学教育新生态 2.2.题目二——B2064 斐波那契数列 - 洛谷 | 计算机科学教育新生态 2.3.题目三——B2142 求 123...N 的值 - 洛谷 | 计算机科学教育新生态 2.4.题目四——B2144…...
XuperChain核心流程
04-XuperChain核心流程 0 XuperChain架构图 核心框架 Xuper Chain主要由 Xuper Core 这个核心引擎来构建。Xuper Core 分为三个部分: 基础组件:日志、存储、监控等关键组件,以及密码学库等基本组件。 核心组件:包括共识、合约、账…...
2024.12.2工作复盘
1.今天学了什么? 简单的写了一篇博客,是关于参数校验的问题,参数校验,一个是前后端校验到底一不一致,一个是绕过前端校验,看后台的逻辑到底能不能校验住。 2.今天解决了什么问题? 3.今天完成…...
关于Vscode配置Unity环境时的一些报错问题(持续更新)
第一种报错: 下载net请求超时(一般都会超时很正常的) 实际时并不需要解决,它对你的项目毫无影响 第二种报错: .net版本不匹配 解决:(由于造成问题不一样,所以建议都尝试一次&…...
微信小程序——文档下载功能分享(含代码)
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
长短期记忆网络 (LSTM) 简介
文章目录 一、说明二、传统 RNN 的问题三、为什么梯度消失?四、长短期记忆网络简介五、忘记门六、Update Gate (Input Gate)七、Output Gate八、数学上的内存九、从 LSTM 到 Transformer十、总结 一、说明 机器学习取得进步的领域之一是自然语言处理。对于用于机器…...
【电子通识】USB Type-C线缆为什么有的用到E-Marker芯片
USB Type-C接口具备数据传输、充电(基于USB PD协议)和音频视频传输能力。但是,上述功能都有强弱之别,并因此衍生出了无数种规格的USB Type-C线缆。 如下所示直接搜索就可以看到,虽然都是Type-C接口,但存在很多不同种类的线缆规格。 以数据传输为例,USB Type-C可选USB2.0…...
【故障处理系列--移动云云盘根目录在线扩容】
移动云云盘根目录扩容 **目的:**测试harbor仓库服务器的根目录能否在线扩容 1、移动云控制台系统盘扩容 这里以我自己的虚拟机演示 2、查看分区的文件类型 3、安装growpart工具 rootgitlab-cli:~# apt install cloud-guest-utils -y rootgitlab-cli:~# apt ins…...
混沌工程/混沌测试/云原生测试/云平台测试
背景 私有云/公有云/混合云等具有复杂,分布式,环境多样性等特点,许多特殊场景引发的线上问题很难被有效发现。所以需要引入混沌工程,建立对系统抵御生产环境中失控条件的能力以及信心,提高系统面对未知风险得能力。 …...
CQ 社区版 2024.11 | 新增“审批人组”概念、可通过SQL模式自定义审计图表……
CloudQuery 社区 11 月新版本来啦!本月版本依旧是 CUG(CloudQuery 用户组)尝鲜版的更新。 针对审计模块增加了 SQL 模式自定义审计图表;在流程模块引入了“审批人组”概念。此外,在 SQL 编辑器、连接管理等模块都涉及…...
【maven-4】IDEA 配置本地 Maven 及如何使用 Maven 创建 Java 工程
IntelliJ IDEA(以下简称 IDEA)是一款功能强大的集成开发环境,广泛应用于 Java 开发。下面将详细介绍如何在 IDEA 中配置本地 Maven,并创建一个 Maven Java 工程,快速上手并高效使用 Maven 进行 Java 开发。 1. Maven …...
c语言结构体
c语言结构体 1. 结构体的定义 在C语言中,结构体是一种用户自定义的数据类型,它允许你将不同类型的数据组合成一个单一的实体。结构体的定义以struct关键字开头,后面跟着结构体标签(可以省略,但为了方便后续引用&#…...
洛谷二分题
P1024 [NOIP2001 提高组] 一元三次方程求解 题目描述 有形如:𝑎𝑥3𝑏𝑥2𝑐𝑥𝑑0ax3bx2cxd0 这样的一个一元三次方程。给出该方程中各项的系数(𝑎,ᵄ…...
vue3的项目目录和关键文件
注意换插件 vue2的是 Vetur ;vue3的是volar 这里注意volar插件已更名为Vue - Official vite.config.js 放跟vite配置相关的内容 区别于vue2;vue2是vue.config.js;vue2是基于webpack的,vue3是基于vite的 main.js import { creat…...
rabbitmq原理及命令
目录 一、RabbitMQ原理1、交换机(Exchange)fanoutdirecttopicheaders(很少用到) 2、队列Queue3、Virtual Hosts4、基础对象 二、RabbitMQ的一些基本操作:1、用户管理2、用户角色3、vhost4、开启web管理接口5、批量删除队列 一、Ra…...
洛谷 P1308 [NOIP2011 普及组] 统计单词数 C语言
题目: https://www.luogu.com.cn/problem/P1308 复制Markdown 展开 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现…...
vue基础之5:vue数据代理、事件处理、事件修饰符、键盘事件
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...
RK3568平台开发系列讲解(PWM篇)sysyfs 操作 pwm 原理讲解
🚀返回专栏总目录 文章目录 一、高精度定时器介绍沉淀、分享、成长,让自己和他人都能有所收获!😄 📢使用 sysfs 和内核 API 函数对硬件 PWM 进行控制, 而当硬件 PWM 不够用的时候, 可以使用 GPIO 来模拟实现 PWM, 也可以称之为软件 PWM, 软件 PWM 是通过软件编程实…...
python 练习题
目录 1,输入三个整数,按升序输出 2,输入年份及1-12月份,判断月份属于大月,小月,闰月,平月,并输出本月天数 3,输入一个整数,显示其所有是素数因子 4&#…...
SprinBoot整合KafKa的使用(详解)
前言 1. 高吞吐量(High Throughput) Kafka 设计的一个核心特性是高吞吐量。它能够每秒处理百万级别的消息,适合需要高频次、低延迟消息传递的场景。即使在大规模分布式环境下,它也能保持很高的吞吐量和性能,支持低延…...
CSS学习记录03
CSS背景 CSS 背景属性用于定义元素的背景效果。 CSS background-color background-color属性指定元素的背景色。 页面的背景色设置如下: body {background-color: lightblue; } 通过CSS,颜色通常由以下方式指定: 有效的颜色名称-比如“…...
在Java中使用Apache POI导入导出Excel(二)
本文将继续介绍POI的使用,上接在Java中使用Apache POI导入导出Excel(一) 使用Apache POI组件操作Excel(二) 14、读取和重写工作簿 try (InputStream inp new FileInputStream("workbook.xls")) { //Inpu…...
Vue3学习宝典
1.ref函数调用的方式生成响应式数据,可以传复杂和简单数据类型 <script setup> // reactive接收一个对象类型的数据 import { reactive } from vue;// ref用函数调用的方式生成响应式数据,可以传复杂和简单数据类型 import { ref } from vue // 简…...
Unity开发FPS游戏之完结篇
这个系列的前几篇文章介绍了如何从头开始用Unity开发一个FPS游戏,感兴趣的朋友可以回顾一下。这个系列的文章如下: Unity开发一个FPS游戏_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个FPS游戏之二_unity 模仿开发fps 游戏-CSDN博客 Unity开发一个F…...
基于BM1684的AI边缘服务器-模型转换,大模型一体机(二)
目标追踪 注:所有模型转换都是在docker环境中的 先进入docker 这里我们是要在docker环境里编译的,所以先进入docker :~/tpu-nntc# docker run -v $PWD/:/workspace -it sophgo/tpuc_dev:latest初始化环境 root2bb02a2e27d5:/workspace/tpu-nntc# s…...
IDEA连接Apifox客户端
IDEA连接Apifox客户端 一、下载Apifox安装包二、IDEA配置三、配置Apifox和IDEA项目同步 一、下载Apifox安装包 Apifox官网,根据自己的操作系统下载对应的Apifox安装包,我是windows系统所以下载的是windows版。 下载 默认仅为我安装,点击下一…...
vue中引用svg图标
要在 Vue 项目中引用 SVG 图标,有几种常见的方法。这里我将介绍两种方法:一种是直接在组件中内联 SVG 代码,另一种是将 SVG 作为单独的文件引用。 方法一:内联 SVG 代码 你可以直接在 Vue 组件的模板中嵌入 SVG 代码。这种方法适…...
【Laravel】模型封装属性基础
文章目录 概要什么是封装模型属性?使用访问器和修改器封装属性访问器(Accessor)修改器(Mutator)测试业务实现 运行结果小结 概要 随着项目规模的扩大,模型中的属性和方法可能会变得越来越复杂,这…...