当前位置: 首页 > article >正文

【Redis】Zset 有序集合

文章目录

  • 常用命令
    • zadd
    • zcard
    • zcount
    • zrange && zrevrange
    • zrangebyscore
    • zpopmax && bzpopmax
    • zpopmin && zpopmax
    • zrank && zrevrank
    • zscore
    • zrem
    • zremrangebyrank
    • zremrangebyscore
    • zincrby
  • 集合间操作
    • 交集 zinterstore
    • 并集 zunionstore
  • 内部编码
  • 应用场景

在这里插入图片描述

有序集合和集合(Set)一样,不能有重复成员,但与之不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score),通过这个分数实现有序性

在这里插入图片描述
有序集合提供了获取指定分数和元素范围查找、计算成员排名等功能

有序集合中的元素是不能重复的,但分数可以相同。若分数相同,则按元素的字典序排序

常用命令

zadd

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

相关选项:

  • XX:当元素存在时才生效,即用于更新已经存在的元素,不会添加新元素
  • NX:当元素不存在时才生效,即用于添加新元素
  • CH:默认情况下,zadd 的返回值时本次新添加的元素个数,使用该选项,返回值还会包含本次操作更新的元素的个数
  • INCR:将元素的分数加上指定的分数,可正可负。此时只能指定一个元素和分数

zadd key [NX | XX] [CH] [INCR] score member [score member…]

返回值:本次添加成功的元素;如果使用了 INCR,则返回值为修改后的分数

示例:

127.0.0.1:6379> zadd key1 95 zhangsan 92 lisi 97 wangwu 77 zhaoliu
(integer) 4127.0.0.1:6379> zadd key1 94 zhangsan
(integer) 0 # 修改默认不计入返回值# 查看 zset 元素
127.0.0.1:6379> zrange key1 0 -1 withscores
1) "zhaoliu"
2) "77"
3) "lisi"
4) "92"
5) "zhangsan"
6) "94"
7) "wangwu"
8) "97"# 修改并将修改成功的元素个数计入返回值
127.0.0.1:6379> zadd key1 XX CH 99 zhangsan
(integer) 1
127.0.0.1:6379> zrange key1 0 -1 withscores
1) "zhaoliu"
2) "77"
3) "lisi"
4) "92"
5) "wangwu"
6) "97"
7) "zhangsan"
8) "99"# 减少分数
127.0.0.1:6379> zadd key1 incr -4 zhangsan
"95"

zcard

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

zcard key

返回值:zset 的元素个数

示例:

127.0.0.1:6379> zcard key1
(integer) 4

zcount

返回分数在 min 和 max 之间的元素个数,默认情况下,是包含 min 和 max,但可以通过( 排除

zcount key [(]min [(]max

返回值:满足条件的元素个数
时间复杂度:O(log(N))

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
1) "zhaoliu"
2) "77"
3) "lisi"
4) "92"
5) "zhangsan"
6) "95"
7) "wangwu"
8) "97"# 包含分数 7795
127.0.0.1:6379> zcount key1 77 95
(integer) 3
# 不包含分数 77
127.0.0.1:6379> zcount key1 (77 95
(integer) 2
# 不包含分数 7795
127.0.0.1:6379> zcount key1 (77 (95
(integer) 1

zrange && zrevrange

zrange

返回指定区间的元素,升序
withscores 选项可以把分数也返回

zrange key start stop [withscores]
[start, stop] 为闭区间,下标从0开始,支持负数,-1表示倒数第一个数,以此类推

时间复杂度:O(log(N) + M),N为元素总个数,M为区间元素个数

示例:

# 查询从下标0到最后一个
127.0.0.1:6379> zrange key1 0 -1
1) "zhaoliu"
2) "lisi"
3) "zhangsan"
4) "wangwu"
# 携带上分数
127.0.0.1:6379> zrange key1 0 -1 withscores
1) "zhaoliu"
2) "77"
3) "lisi"
4) "92"
5) "zhangsan"
6) "95"
7) "wangwu"
8) "97"
# 查询下标13
127.0.0.1:6379> zrange key1 1 3 withscores
1) "lisi"
2) "92"
3) "zhangsan"
4) "95"
5) "wangwu"
6) "97"

zrevrange

返回指定区间的元素,降序
withscores 选项可以携带分数返回

PS:该命令可能在 6.2.0后废弃,功能合并到 zrange 中

zrevrange key start stop [withscores]

时间复杂度:O(log(N) + M),N为元素总个数,M为区间元素个数

示例:

127.0.0.1:6379> zrevrange key1 0 -1 withscores
1) "wangwu"
2) "97"
3) "zhangsan"
4) "95"
5) "lisi"
6) "92"
7) "zhaoliu"
8) "77"
127.0.0.1:6379> zrevrange key1 1 3 withscores
1) "zhangsan"
2) "95"
3) "lisi"
4) "92"
5) "zhaoliu"
6) "77"

zrangebyscore

返回分数在 min 和 max 之间的元素,默认是闭区间,可以通过(排除
PS:该命令可能在6.2.0后废除,功能合并到 zrange 中

zrangebyscore key min max [withscores]

时间复杂度:O(log(N)+M)

示例:

127.0.0.1:6379> zrangebyscore key1 -inf +inf withscores
1) "zhaoliu"
2) "77"
3) "lisi"
4) "92"
5) "zhangsan"
6) "95"
7) "wangwu"
8) "97"
127.0.0.1:6379> zrangebyscore key1 (92 +inf withscores
1) "zhangsan"
2) "95"
3) "wangwu"
4) "97"

zpopmax && bzpopmax

zpopmax

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

zpopmax key [count]

时间复杂度:O(log(N) * M),删除一个元素为log(N),M为要删除的元素个数
返回值:分数和元素列表

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
1) "zhaoliu"
2) "77"
3) "lisi"
4) "92"
5) "zhangsan"
6) "95"
7) "wangwu"
8) "97"
127.0.0.1:6379> zpopmax key1 2
1) "wangwu"
2) "97"
3) "zhangsan"
4) "95"

bzpopmax

zpopmax 的阻塞版本

bzpopmax key [key…] timeout

时间复杂度:O(log(N));源码虽然有记录最大元素,但还是套用了删除一个元素的算法,所以时间复杂度不是O(1),而是O(log(N))
返回值:zset、元素、分数

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
1) "zhaoliu"
2) "77"
3) "lisi"
4) "92"
127.0.0.1:6379> zrange key2 0 -1 withscores
1) "wangwu"
2) "100"
127.0.0.1:6379> bzpopmax key1 key2 10
1) "key1"
2) "lisi"
3) "92"

按顺序检查有序集合是否有元素,有则删除最大,无则检查下一个有序集合,只要删除一个元素就结束,所以并不是删除所有有序结合的最大值,而是最先有元素的有序集合的最大值

zpopmin && zpopmax

zpopmin

大致与 zpopmax 相同,不过时删除最小元素

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

zpopmin key [count]

时间复杂度:O(log(N) * M)
返回值:分数和元素列表

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
1) "zhaoliu"
2) "77"
3) "zhangsan"
4) "88"
5) "lisi"
6) "99"
127.0.0.1:6379> zpopmin key1 2
1) "zhaoliu"
2) "77"
3) "zhangsan"
4) "88"

bzpopmin

zpopmin 的阻塞版本

bzpopmin key [key…] timeout

时间复杂度:O(log(N))
返回值:zset、元素、分数

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
(empty array)
127.0.0.1:6379> zrange key2 0 -1 withscores
1) "zhangsan"
2) "95"
3) "wangwu"
4) "100"
127.0.0.1:6379> bzpopmin key1 key2 10
1) "key2"
2) "zhangsan"
3) "95"

zrank && zrevrank

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

zrank key member

时间复杂度:O(log(N))

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
1) "lisi"
2) "48"
3) "wangwu"
4) "83"
5) "zhaoliu"
6) "92"
7) "zhangsan"
8) "94"
127.0.0.1:6379> zrank key1 zhangsan
(integer) 3
127.0.0.1:6379> zrank key1 lisi
(integer) 0

zrevrank

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

zrevrank key member

时间复杂度:O(log(N))

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
1) "lisi"
2) "48"
3) "wangwu"
4) "83"
5) "zhaoliu"
6) "92"
7) "zhangsan"
8) "94"
127.0.0.1:6379> zrevrank key1 zhangsan
(integer) 0
127.0.0.1:6379> zrevrank key1 lisi
(integer) 3

zscore

获取指定元素的分数

zscore key member

时间复杂度:O(1)

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
1) "lisi"
2) "48"
3) "wangwu"
4) "83"
5) "zhaoliu"
6) "92"
7) "zhangsan"
8) "94"
127.0.0.1:6379> zscore key1 zhangsan
"94"
127.0.0.1:6379> zscore key1 lisi
"48"

zrem

删除指定的元素

zrem key member [member…]

时间复杂度:O(log(N) * M),删除一个元素为O(log(N)),M为要删除的元素个数
返回值:本次操作删除的元素个数

示例:

127.0.0.1:6379> zrem key1 zhangsan lisi
(integer) 2

zremrangebyrank

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

zremrangebyrank key start stop

时间复杂度:O(log(N) + M)
返回值:本次操作删除的元素个数

示例:

127.0.0.1:6379> zrange key 0 -1
1) "zhaoliu"
2) "zhangsan"
3) "lisi"
4) "wangwu"
127.0.0.1:6379> zremrangebyrank key 0 1
(integer) 2
127.0.0.1:6379> zrange key 0 -1
1) "lisi"
2) "wangwu"

zremrangebyscore

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

zremrangebyrank key min max

时间复杂度:O(log(N) + M)
返回值:本次操作删除的元素个数

示例:

127.0.0.1:6379> zrange key 0 -1
1) "lisi"
2) "wangwu"
127.0.0.1:6379> zremrangebyscore key -inf +inf
(integer) 2

zincrby

给指定的元素添加指定分数,可正可负

zincrby key increment member

时间复杂度:O(log(N))
返回值:修改后元素的分数

示例:

127.0.0.1:6379> zadd key 88 zhangsan
(integer) 1
127.0.0.1:6379> zincrby key 8 zhangsan
"96"
127.0.0.1:6379> zincrby key -4 zhangsan
"92"

集合间操作

Zset 提供交集和并集操作

交集 zinterstore

交集时提取多个 Zset 共有的元素,但因为还是分数(score),所以需要指定提取后的分数如何取值。
同时 Zset 还提供权重(weight)

zinterstore destination numkeys key [key…] [weights weight] [aggregate sum | min | max]

  • destination:将并集的结果保存在目标 Zset 中
  • numkeys:并集的 Zset 个数
  • weight:权重,浮点类型,个数应和 numkeys 相同
  • aggregate:并集的分数组成,可选 sum | min | max,默认是 sum

在这里插入图片描述

时间复杂度:O(N * K) + O(M * log(M));N 是输入的有序集合中,最小的有序集合的元素个数;K是输入了几个有序集合;M是最终结果的有序集合的元素个数
返回值:并集的元素个数

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
1) "c"
2) "2"
3) "a"
4) "5"
5) "b"
6) "8"
7) "d"
8) "14"
127.0.0.1:6379> zrange key2 0 -1 withscores
1) "d"
2) "6"
3) "f"
4) "7"
5) "c"
6) "8"
7) "e"
8) "13"# 分数默认以 sum
127.0.0.1:6379> zinterstore key3 2 key1 key2
(integer) 2
127.0.0.1:6379> zrange key3 0 -1 withscores
1) "c"
2) "10"
3) "d"
4) "20"# 分数以 max
127.0.0.1:6379> zinterstore key4 2 key1 key2 aggregate max
(integer) 2
127.0.0.1:6379> zrange key4 0 -1 withscores
1) "c"
2) "8"
3) "d"
4) "14"# 分数乘以权重
127.0.0.1:6379> zinterstore key5 2 key1 key2 weights 4 6
(integer) 2
127.0.0.1:6379> zrange key5 0 -1 withscores
1) "c"
2) "56"
3) "d"
4) "92"

并集 zunionstore

zunionstore destination numkeys key [key…] [weights weight…] [aggregate sum | min | max]

在这里插入图片描述

时间复杂度:O(N) + O(M * log(M));N 是输入的有序集合总的元素个数;M是最终结果的有序集合的元素个数

示例:

127.0.0.1:6379> zrange key1 0 -1 withscores
1) "c"
2) "2"
3) "a"
4) "5"
5) "b"
6) "8"
7) "d"
8) "14"
127.0.0.1:6379> zrange key2 0 -1 withscores
1) "d"
2) "6"
3) "f"
4) "7"
5) "c"
6) "8"
7) "e"
8) "13"
127.0.0.1:6379> zunionstore key3 2 key1 key2
(integer) 6
127.0.0.1:6379> zrange key3 0 -1 withscores1) "a"2) "5"3) "f"4) "7"5) "b"6) "8"7) "c"8) "10"9) "e"
10) "13"
11) "d"
12) "20"
127.0.0.1:6379> zunionstore key4 2 key1 key2 aggregate min
(integer) 6
127.0.0.1:6379> zrange key4 0 -1 withscores1) "c"2) "2"3) "a"4) "5"5) "d"6) "6"7) "f"8) "7"9) "b"
10) "8"
11) "e"
12) "13"
127.0.0.1:6379> zunionstore key5 2 key1 key2 weights 0.2 0.5
(integer) 6
127.0.0.1:6379> zrange key5 0 -1 withscores1) "a"2) "1"3) "b"4) "1.6000000000000001"5) "f"6) "3.5"7) "c"8) "4.4000000000000004"9) "d"
10) "5.8000000000000007"
11) "e"
12) "6.5"

在这里插入图片描述

内部编码

有序集合的内部编码有两种:

  • ziplist(压缩列表):当有序集合的元素个数小于 zset-max-ziplist-entries,同时每个元素的值都小于 zset-max-ziplist-value 时,ziplist 为其内部实现,可以有效减少内存的使用
  • skiplist(跳表):不满足上述条件时,使用 skiplist 作为内部实现,因为此时 ziplist 的操作效率会下降

应用场景

有序集合比较典型的使用场景就是排行榜系统。例如常见的网站上的热榜信息,榜单的维度可能时多方面的:按照时间、阅读量、点赞量。

例如,通过点赞维护热榜

  1. 添加用户赞数
    例如用户 zhangsan 发布了一篇文章,获得了3个点赞,添加使用 zadd,后续获赞使用 zincrby
zadd user:ranking:2025-06-02 3 zhangsan
zincrby user:ranking:2025-06-02 2 zhangsan
  1. 取消用户赞数
    由于各种原因(如用户删除文章,作弊),此时需要将用户从榜单删除,使用 zrem
zrem user:ranking:2025-06-02 zhangsan
  1. 展示获赞数最多的10个用户,可以使用 zrevrange
zrevrangebyrank user:ranking:2025-06-02 0 9
  1. 展示用户信息以及用户分数
zscore user:ranking:2025-06-02 lisi
zrank user:ranking:2025-06-02 lisi

以上就是本篇博客的所有内容,感谢你的阅读
如果觉得本篇文章对你有所帮助的话,不妨点个赞支持一下博主,拜托啦,这对我真的很重要。
在这里插入图片描述

相关文章:

【Redis】Zset 有序集合

文章目录 常用命令zaddzcardzcountzrange && zrevrangezrangebyscorezpopmax && bzpopmaxzpopmin && zpopmaxzrank && zrevrankzscorezremzremrangebyrankzremrangebyscorezincrby 集合间操作交集 zinterstore并集 zunionstore 内部编码应用场…...

manus对比ChatGPT-Deep reaserch进行研究类论文数据分析!谁更胜一筹?

目录 没有账号,只能挑选一个案例 1、manus的效果 Step-1:直接看结果 Step-2:看看其他文件的细节 Step-3:看最终报告 2、Deep reaserch 3、Deep reaserch进行行业分析 总结一下: 大家好这里是学术Anan&#xff…...

【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解

【 HarmonyOS 5 入门系列 】鸿蒙HarmonyOS示例项目讲解 一、前言:移动开发声明式 UI 框架的技术变革 在移动操作系统的发展历程中,UI 开发模式经历了从命令式到声明式的重大变革。 根据华为开发者联盟 2024 年数据报告显示,HarmonyOS 设备…...

AWS Transit Gateway实战:构建DMZ隔离架构,实现可控的网络互通

在企业云网络架构中,如何实现不同VPC之间的安全互通是一个常见挑战。本文将通过AWS Transit Gateway实战,展示如何构建一个DMZ隔离架构,使DMZ可以与Test和Production环境互通,而Test和Production环境之间相互隔离。 1. Transit Gateway架构设计概述 在开始实践前,让我们先…...

用提示词写程序(3),VSCODE+Claude3.5+deepseek开发edge扩展插件V2

edge扩展插件;筛选书签,跳转搜索,设置背景 链接: https://pan.baidu.com/s/1nfnwQXCkePRnRh5ltFyfag?pwd86se 提取码: 86se 导入解压的扩展文件夹: 导入扩展成功: edge扩展插件;筛选书签,跳转搜索,设置背景...

栈与队列:数据结构的有序律动

在数据结构的舞台上,栈与队列宛如两位优雅的舞者,以独特的节奏演绎着数据的进出规则。它们虽不像顺序表与链表那般复杂多变,却有着令人着迷的简洁与实用,在众多程序场景中发挥着不可或缺的作用。今天,就让我们一同去探…...

初识PS(Photoshop)

初识PS(Photoshop) 1、Photoshop界面 2、常用快捷键...

go语言的GMP(基础)

1.概念梳理 1.1线程 通常语义中的线程,指的是内核级线程,核心点如下: (1)是操作系统最小调度单元; (2)创建、销毁、调度交由内核完成,cpu 需完成用户态与内核态间的切…...

电路图识图基础知识-高、低压供配电系统电气系统的继电自动装置(十三)

电气系统的继电自动装置 在供电系统中为保证系统的可靠性,保证重要负荷的不间断供电,常采用自动重合闸装置和备用电源自动投入装置。 1 自动重合闸装置 供配电系统多年运行实践表明,架空线路发生的故障多属于暂时性故障,如雷击…...

JDK21深度解密 Day 9:响应式编程模型重构

【JDK21深度解密 Day 9】响应式编程模型重构 引言:从Reactor到虚拟线程的范式转变 在JDK21中,虚拟线程的引入彻底改变了传统的异步编程模型。作为"JDK21深度解密"系列的第91天,我们将聚焦于响应式编程模型重构这一关键主题。通过…...

在 Linux 服务器上无需 sudo 权限解压/打包 .7z 的方法(实用命令)

7z的压缩比很高,可以把100G的文件压到3-5G,在大文件传输上很有优势但是一般服务器上是只有tar解压,用户没法(没有权限)直接安装7z工具来解压因此使用conda安装p7zip库可以很好地解决这个问题~ 关于7z的相关背景知识&am…...

微信小程序(uniapp)实现腾讯云 IM 消息撤回

uniapp 实现腾讯云 IM 消息撤回功能实战指南 一、功能实现原理 腾讯云 IM 的消息撤回功能通过 消息修订(Message Revision) 机制实现,核心流程如下: 发送方调用撤回 API 删除指定消息云端生成撤回通知消息(类型为 T…...

设计学生管理系统的数据库

在设计学生管理系统的数据库时,需要考虑多个实体及其关系。以下是一个基本的学生管理系统表结构设计,涵盖了核心实体和关系: 1. 用户表 (user) 存储所有系统用户的基本信息,包括学生、教师和管理员。 sql CREATE TABLE user (u…...

ArcGIS Pro 3.4 二次开发 - 图形图层

环境:ArcGIS Pro SDK 3.4 + .NET 8 文章目录 图形图层1.1 创建图形图层1.2 访问GraphicsLayer1.3 复制图形元素1.4 移除图形元素2 创建图形元素2.1 使用CIMGraphic创建点图形元素2.2 使用CIMGraphic创建线图元素2.3 使用 CIMGraphic 的多边形图形元素2.4 使用CIMGraphic创建多…...

Linux配置DockerHub镜像源配置

个人博客地址:Linux配置DockerHub镜像源配置 | 一张假钞的真实世界 因为某些原因,DockerHub官方镜像源已不可用,国内一些镜像源也已不可用,大家可以搜索可用的镜像源并修改配置。推荐一篇良心博文:https://zhuanlan.z…...

JDK21深度解密 Day 11:云原生环境中的JDK21应用

【JDK21深度解密 Day 111】云原生环境中的JDK21应用 本文是《JDK21深度解密:从新特性到生产实践的全栈指南》专栏的第11天内容,聚焦云原生环境中的JDK21应用。我们将深入探讨如何在容器化、微服务、Serverless等云原生架构中充分发挥JDK21的技术优势,提升Java应用的性能、稳…...

如何学习才能更好地理解人工智能工程技术专业和其他信息技术专业的关联性?

要深入理解人工智能工程技术专业与其他信息技术专业的关联性,需要跳出单一专业的学习框架,通过 “理论筑基 - 实践串联 - 跨学科整合” 的路径构建系统性认知。以下是分阶段、可落地的学习方法: 一、建立 “专业关联” 的理论认知框架 绘制知…...

Qt实现的水波进度条和温度进度条

一.效果 二.原理 1.水波 要模拟波浪,就要首先画出一条波浪线,正弦余弦曲线就很适合。 y=A*sin(ω*x+φ)+k y=A*cos(ω*x+φ)+k 这是正弦余弦曲线的公式,要想实现水波效果,那需要两条曲线,一条曲线的波峰对着另外一条曲线的波谷,要实现这样的曲线效果,只有让正弦曲线前移…...

3516cv610在sample_aiisp上多创一路编码流,方法

3516cv610在sample_aiisp上多创一路编码流,方法 首先确保 vpss grp0有视频流 最好保证 已经有一路视频流能推出来 多创一路编码流思路为 将 vpss grp0又绑定给 vpss_chn1 vpss_chn1有绑定给 venc_chn1 这样我们就多创了一路视频流。 这里思路完全正确 可以实现…...

WEBSTORM前端 —— 第3章:移动 Web —— 第4节:移动适配-VM

目录 一、适配方案 二、VM布局 ​编辑 三、vh布局 四、案例—酷我音乐 一、适配方案 二、VM布局 三、vh布局 四、案例—酷我音乐...

Android第十一次面试补充篇

Livedata内存泄漏解决​ 1. 未正确绑定 LifecycleOwner​ ​原因​: 使用 observe() 时未传入正确的 LifecycleOwner(如 Activity/Fragment),或误用 Application 等长生命周期对象,导致观察者无法自动解除绑定。 ​…...

【Zephyr 系列 3】多线程与调度机制:让你的 MCU 同时干多件事

好的,下面是Zephyr 系列第 3 篇:聚焦 多线程与调度机制的实践应用,继续面向你这样的 Ubuntu + 真板实战开发者,代码清晰、讲解通俗、结构规范,符合 CSDN 高质量博客标准。 🧠关键词:Zephyr、线程调度、k_thread、k_sleep、RTOS、BluePill 📌适合人群:想从裸机开发进…...

Kotlin-特殊类型

文章目录 数据类型枚举类型匿名类和伴生对象单例类伴生对象 数据类型 声明一个数据类非常简单: //在class前面添加data关键字表示为一个数据类 data class Student(var name: String, var age: Int)数据类声明后,编译器会根据主构造函数中声明的所有属性自动为其生成以下函数…...

nssctf第二题[SWPUCTF 2021 新生赛]简简单单的逻辑

这是题目&#xff0c;下载后得到一个python文件,打开 解读代码&#xff1a; for i in range(len(list)):key (list[i]>>4)((list[i] & 0xf)<<4)result str(hex(ord(flag[i])^key))[2:].zfill(2)list[i]>>4&#xff1a;从列表中取数字同时高4位向右位…...

《Discuz! X3.5开发从入门到生态共建》第3章 Discuz! X3.5 核心目录结构解析-优雅草卓伊凡

《Discuz! X3.5开发从入门到生态共建》第3章 Discuz! X3.5 核心目录结构解析-优雅草卓伊凡 3.1 系统核心目录结构 Discuz! X3.5采用模块化设计&#xff0c;主要目录结构如下&#xff1a; discuz_root/ ├─ api/ // API接口目录 ├─ config/ …...

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能

【HarmonyOS 5】鸿蒙应用实现发票扫描、文档扫描输出PDF图片或者表格的功能 一、前言 图(1-1) HarmonyOS 系统提供的核心场景化视觉服务,旨在帮助开发者快速实现移动端文档数字化功能。 其核心能力包括:扫描合同、票据、会议记录并保存为 PDF 分享。拍摄课堂 PPT、书籍章…...

Python_day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 进阶&#xff1a;并拆分成多个文件 关于 Dataset 从谷歌图片中抓取了 1000 多张猫和狗的图片。问题陈述是构建一个模型&#xff0c;该模型可以尽可能准确地在图像…...

STM32CubeDAC及DMA配置

STM32CubeDAC及DMA配置 一&#xff0c;问题1二&#xff0c;解决11&#xff0c;宏观思路CubeMX配置2&#xff0c;HAL_TIM_Base_Start(&htim6) 的作用1&#xff0c;作用1&#xff1a;使能TIM6的时钟并让它开始计数2&#xff0c;作用2&#xff1a;当 TIM6 溢出时&#xff0c;会…...

SQL快速入门【转自牛客网】

来源:牛客网 1、SQL 基础查询 在 SQL 中,SELECT 语句是最基本的查询语句,用于从数据库表中检索数据。通过 SELECT 语句,可以选择表中的所有列或特定列,并根据需要进行过滤和排序。 基本语法 SELECT 语句的基本语法如下: SELECT column1, column2, ... FROM table_na…...

行业案例 | OPPO借助Azure AI Speech国际服务实现音频文件智能转录

OPPO是全球领先的智能终端与移动互联网服务提供商&#xff0c;业务覆盖50余国&#xff0c;通过超40万销售网点和2500个服务中心与全球用户共享科技。作为软硬服一体化科技公司&#xff0c;OPPO以ColorOS为核心优化软件平台&#xff0c;为4.4亿月活用户打造智能操作系统&#xf…...