Redis Stack十部曲之三:理解Redis Stack中的数据类型
文章目录
- 前言
- String
- 字符串作为计数器
- 限制
- List
- 限制列表
- 阻塞列表
- 自动创建和删除聚合类型键
- 限制
- Set
- 限制
- Hash
- 限制
- Sorted Set
- 范围操作
- 字典操作
- 更新分数
- JSON
- 路径
- 限制
- BitMap
- Bitfield
- Probabilistic
- HyperLogLog
- Bloom filter
- Cuckoo filter
- t-digest
- Top-K
- Count-min sketch
- Configuration Parameters
- Time series
前言
由于Redis官方文档的编写水平实在是难以恭维,因此本文翻译难度极大。阅读本文前须知:
- 有一些类型会有标题占位,但不会有内容,因为实在是不常用,如果有一天用到了或者可以给我留言,我会补充上。
- 不会特意提供操作数据类型的API翻译,如有需要请查阅官网。
String
Redis的字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是您可以与Redis键关联的最简单类型的值。它们通常用于缓存,但它们还支持额外的功能,使您能够实现计数器并执行位操作。
由于Redis键是字符串,当我们将字符串类型用作值时,实际上是将一个字符串映射到另一个字符串。
> SET bike:1 Deimos
OK
> GET bike:1
"Deimos"
SET命令具有一些有趣的选项,这些选项作为附加参数提供。例如,我可以要求SET在键已经存在时失败,或者相反,只有在键已经存在时才成功:
> set bike:1 bike nx
(nil)
> set bike:1 bike xx
OK
在单个命令中设置或检索多个键的值的能力对于降低延迟也很有用。因此,有MSET和MGET命令:
> mset bike:1 "Deimos" bike:2 "Ares" bike:3 "Vanth"
OK
> mget bike:1 bike:2 bike:3
1) "Deimos"
2) "Ares"
3) "Vanth"
当使用MGET时,Redis返回一个值数组。
字符串作为计数器
即使字符串是Redis的基本值,您仍然可以执行一些有趣的操作。例如,其中之一是原子递增:
> set total_crashes 0
OK
> incr total_crashes
(integer) 1
> incrby total_crashes 10
(integer) 11
INCR命令将字符串值解析为整数,将其递增1,最后将得到的值设置为新值。还有其他类似的命令,如INCRBY、DECR和DECRBY。
什么是原子递增的含义呢?即使多个客户端针对相同的键发出INCR命令,它们也永远不会陷入竞态条件。
限制
默认情况下,单个Redis字符串的最大容量为512MB。
List
Redis lists是字符串值的链表,经常用于:
- 实现栈和队列。
- 为后台工作系统构建队列管理。
LPUSH 命令在 Redis 中将新元素添加到列表的左侧(头部),而 RPUSH 命令将新元素添加到列表的右侧(尾部)。最后,LRANGE 命令从列表中提取元素的范围:
> RPUSH bikes:repairs bike:1
(integer) 1
> RPUSH bikes:repairs bike:2
(integer) 2
> LPUSH bikes:repairs bike:important_bike
(integer) 3
> LRANGE bikes:repairs 0 -1
1) "bike:important_bike"
2) "bike:1"
3) "bike:2"
在Redis列表上定义的一个重要操作是弹出元素。弹出元素是从列表中检索元素并同时将其从列表中删除的操作。您可以从左侧和右侧弹出元素,类似于您可以在列表的两侧推送元素。我们将添加三个元素并弹出三个元素,因此在这系列命令结束时,列表将为空,不再有元素可以弹出:
> RPUSH bikes:repairs bike:1 bike:2 bike:3
(integer) 3
> RPOP bikes:repairs
"bike:3"
> LPOP bikes:repairs
"bike:1"
> RPOP bikes:repairs
"bike:2"
> RPOP bikes:repairs
(nil)
Redis返回一个NULL值,表示列表中没有元素。
限制列表
在许多用例中,我们只希望使用列表存储最新的项目,无论这些项目是什么:社交网络更新、日志或其他任何内容。
Redis 允许我们将列表用作有上限的集合,仅记住最新的 N 个项目,并使用 LTRIM 命令丢弃所有最旧的项目。
LTRIM 命令类似于 LRANGE,但它不是显示指定范围的元素,而是将此范围设置为新的列表值。给定范围之外的所有元素都将被移除。
例如,如果您将自行车添加到维修列表的末尾,但只关心列表中最久的前 3 辆自行车:
> RPUSH bikes:repairs bike:1 bike:2 bike:3 bike:4 bike:5
(integer) 5
> LTRIM bikes:repairs 0 2
OK
> LRANGE bikes:repairs 0 -1
1) "bike:1"
2) "bike:2"
3) "bike:3"
阻塞列表
列表具有一项特殊功能,使它们适用于实现队列,并且通常作为进程间通信系统的构建块:阻塞操作。
假设您希望使用一个进程将项目推送到列表中,并使用另一个进程实际处理这些项目。这是通常的生产者/消费者设置,可以以以下简单的方式实现:
- 要将项目推送到列表中,生产者调用
LPUSH。 - 要从列表中提取/处理项目,消费者调用
RPOP。
然而,有时可能列表是空的,没有可处理的内容,因此 RPOP 只会返回 NULL。在这种情况下,消费者被迫等待一段时间,然后使用 RPOP 再次重试。这被称为轮询,但在这个上下文中不是一个好主意,因为它有一些缺点:
- 强制 Redis 和客户端处理无用的命令(当列表为空时,所有请求都不会执行实际的工作,它们只会返回
NULL)。 - 在处理项目时添加了延迟,因为在工作进程收到
NULL后,它会等待一段时间。为了使延迟更小,我们可以在调用RPOP之间等待时间较短,这会放大问题 1,即对 Redis 的更多无用调用。
因此,Redis 实现了名为 BRPOP 和 BLPOP 的命令,它们是 RPOP 和 LPOP 的版本,如果列表为空,它们将阻塞:它们只在向列表添加新元素时或达到用户指定的超时时才向调用者返回。
请注意,您可以使用 0 作为超时,永远等待元素,并且还可以指定多个列表,而不仅仅是一个,以便同时等待多个列表,并在第一个列表接收到元素时得到通知。
关于 BRPOP 的一些要点:
- 客户端按顺序提供服务:等待列表的第一个客户端在其他客户端推送元素时首先得到服务,依此类推。
- 返回值与
RPOP不同:它是一个包含两个元素的数组,因为BRPOP和BLPOP还包括键的名称,因为它们能够等待来自多个列表的元素。 - 如果达到超时,则返回
NULL。
自动创建和删除聚合类型键
Redis会在列表为空时自动删除键,或者在尝试向空列表中添加元素时创建空列表。这适用于所有由多个元素组成的Redis数据类型。
这不仅适用于列表,还适用于由多个元素组成的所有 Redis 数据类型,包括 Streams、Sets、Sorted Sets 和 Hashes。
基本上,我们可以用三条规则总结这种行为:
- 当向聚合数据类型添加元素时,如果目标键不存在,则在添加元素之前创建一个空的聚合数据类型。
- 当从聚合数据类型中移除元素时,如果值保持为空,则键将自动销毁。Stream 数据类型是这一规则的唯一例外。
- 调用只读命令(例如返回列表长度的
LLEN命令)或删除元素的写命令,对于一个空键,总是产生与键持有的聚合类型为空相同的结果,该类型是命令期望找到的类型。
限制
Redis列表的最大长度是 2 32 − 1 2^{32} - 1 232−1个元素。
Set
Set是一组无序的唯一字符串。您可以使用Set来高效地:
- 跟踪唯一项(例如,跟踪访问特定博文的所有唯一 IP 地址)。
- 表示关系(例如,具有特定角色的所有用户的集合)。
- 执行常见的集合操作,如交集、并集和差集。
SADD 命令向集合添加新元素。还可以对集合执行许多其他操作,例如测试给定元素是否已存在,执行多个集合之间的交集、并集或差集等。
> SADD bikes:racing:france bike:1 bike:2 bike:3
(integer) 3
> SMEMBERS bikes:racing:france
1) bike:3
2) bike:1
3) bike:2
Redis 提供了用于测试集合成员身份的命令。这些命令可以用于单个项目以及多个项目:
> SISMEMBER bikes:racing:france bike:1
(integer) 1
> SMISMEMBER bikes:racing:france bike:2 bike:3 bike:4
1) (integer) 1
2) (integer) 1
3) (integer) 0
我们还可以找到两个集合之间的差异。例如,我们可能想知道哪些自行车在法国比赛,但不在美国比赛:
> SADD bikes:racing:usa bike:1 bike:4
(integer) 2
> SDIFF bikes:racing:france bikes:racing:usa
1) "bike:3"
2) "bike:2"
还有其他一些不太平凡的操作,仍然可以使用正确的 Redis 命令轻松实现。例如,我们可能想要列出在法国、美国和其他一些比赛中参赛的所有自行车。我们可以使用 SINTER 命令来执行不同集合之间的交集。除了交集之外,您还可以执行并集、差集等操作。例如,如果我们添加了第三场比赛,我们可以看到其中一些命令的实际效果:
> SADD bikes:racing:france bike:1 bike:2 bike:3
(integer) 3
> SADD bikes:racing:usa bike:1 bike:4
(integer) 2
> SADD bikes:racing:italy bike:1 bike:2 bike:3 bike:4
(integer) 4
> SINTER bikes:racing:france bikes:racing:usa bikes:racing:italy
1) "bike:1"
> SUNION bikes:racing:france bikes:racing:usa bikes:racing:italy
1) "bike:2"
2) "bike:1"
3) "bike:4"
4) "bike:3"
> SDIFF bikes:racing:france bikes:racing:usa bikes:racing:italy
(empty array)
> SDIFF bikes:racing:france bikes:racing:usa
1) "bike:3"
2) "bike:2"
> SDIFF bikes:racing:usa bikes:racing:france
1) "bike:4"
请注意,当所有集合之间的差异为空时,SDIFF 命令返回一个空数组。还要注意,传递给 SDIFF 的集合顺序很重要,因为差异不是可交换的。
当您想要从集合中删除项目时,您可以使用 SREM 命令从集合中移除一个或多个项目,或者您可以使用 SPOP 命令从集合中随机移除一个项目。您还可以使用 SRANDMEMBER 命令从集合中返回一个随机项目,而不将其删除:
> SADD bikes:racing:france bike:1 bike:2 bike:3 bike:4 bike:5
(integer) 5
> SREM bikes:racing:france bike:1
(integer) 1
> SPOP bikes:racing:france
"bike:3"
> SMEMBERS bikes:racing:france
1) "bike:2"
2) "bike:4"
3) "bike:5"
> SRANDMEMBER bikes:racing:france
"bike:2"
限制
Redis集合的最大大小是 2 32 − 1 个 2^{32} - 1个 232−1个成员。
Hash
Redis 哈希是一种记录类型,结构化为键值对的集合。您可以使用哈希来表示基本对象,以及存储计数器等内容的分组。
> HSET bike:1 model Deimos brand Ergonom type 'Enduro bikes' price 4972
(integer) 4
> HGET bike:1 model
"Deimos"
> HGET bike:1 price
"4972"
> HGETALL bike:1
1) "model"
2) "Deimos"
3) "brand"
4) "Ergonom"
5) "type"
6) "Enduro bikes"
7) "price"
8) "4972"
HSET 命令设置哈希的多个字段,而 HGET 检索单个字段。HMGET 类似于 HGET,但返回一个值数组:
> HMGET bike:1 model price no-such-field
1) "Deimos"
2) "4972"
3) (nil)
有些命令也能在单个字段上执行操作,比如 HINCRBY:
> HINCRBY bike:1 price 100
(integer) 5072
> HINCRBY bike:1 price -100
(integer) 4972
限制
每个哈希可以存储多达 2 32 − 1 2^{32} - 1 232−1个键值对。实际上,您的哈希受到托管 Redis 部署的 VM 上总内存的限制。
Sorted Set
Redis 有序集合是由关联分数排序的一组唯一字符串的集合。当多个字符串具有相同的分数时,字符串按词典顺序排序。一些有序集合的用例包括:
- 排行榜:您可以使用有序集合轻松地维护大型在线游戏中最高分的有序列表。
- 限流器:您可以使用有序集合构建滑动窗口限流器,防止过多的 API 请求。
有序集合通过一个双端口数据结构实现,包含跳表和哈希表,因此当我们要求排序元素时,Redis 实际上根本不需要做任何工作,它已经排序好了。
让我们从一个简单的例子开始,将所有参赛者及他们在第一场比赛中获得的分数添加到有序集合中:
> ZADD racer_scores 10 "Norem"
(integer) 1
> ZADD racer_scores 12 "Castilla"
(integer) 1
> ZADD racer_scores 8 "Sam-Bodden" 10 "Royce" 6 "Ford" 14 "Prickett"
(integer) 4
正如您所见,ZADD 与 SADD 类似,但多了一个额外的参数,即分数。ZADD 也是可变参数的,因此您可以自由指定多个分数-值对。
范围操作
让我们获取所有得分为 10 分或更少的赛车手。我们使用 ZRANGEBYSCORE 命令来完成:
> ZRANGEBYSCORE racer_scores -inf 10
1) "Ford"
2) "Sam-Bodden"
3) "Norem"
4) "Royce"
要删除一个元素,我们只需调用 ZREM 命令并提供赛车手的姓名。还可以删除一系列元素。让我们删除 Castilla 赛车手以及所有分数严格少于 10 分的赛车手:
> ZREM racer_scores "Castilla"
(integer) 1
> ZREMRANGEBYSCORE racer_scores -inf 9
(integer) 2
> ZRANGE racer_scores 0 -1
1) "Norem"
2) "Royce"
3) "Prickett"
对于有序集合元素,另一个非常有用的操作是获取排名。还可以使用 ZREVRANK 命令,以便按降序排列的方式获取排名:
> ZRANK racer_scores "Norem"
(integer) 0
> ZREVRANK racer_scores "Norem"
(integer) 3
字典操作
假设有序集合中的元素都以相同的分数插入,Redis允许按字典顺序获取范围。操作词典范围的主要命令包括 ZRANGEBYLEX、ZREVRANGEBYLEX、ZREMRANGEBYLEX 和 ZLEXCOUNT。
这个特性很重要,因为它允许我们将有序集合用作通用索引。例如,如果要按照 128 位无符号整数参数对元素进行索引,您只需将元素添加到具有相同分数的有序集合中,但带有一个由 128 位数字组成的大端字节序的 16 字节前缀。由于大端序的数字,在字典顺序排序时实际上也是按数值排序的,所以您可以在 128 位空间中请求范围,并且获取元素的值时舍弃前缀。
更新分数
可以对已包含在有序集合中的元素调用 ZADD来更新它们的分数。
由于这个特性,常见的用例是排行榜。典型的应用是 Facebook 游戏,其中您可以将按高分对用户进行排序的能力与获取排名操作结合使用,以显示前 N 个用户和用户在排行榜中的排名。
JSON
Redis Stack的JSON功能为Redis提供了对JavaScript对象表示法(JSON)的支持。它使您能够在Redis数据库中存储、更新和检索JSON值,就像处理其他Redis数据类型一样。Redis JSON还可以与搜索和查询无缝集成,使您能够有效地对JSON文档进行索引和查询。
第一个要尝试的JSON命令是JSON.SET,它使用JSON值设置Redis键。JSON.SET接受所有JSON值类型。以下是一个创建JSON字符串的示例:
> JSON.SET animal $ '"dog"'
"OK"
> JSON.GET animal $
"[\"dog\"]"
> JSON.TYPE animal $
1) "string"
请注意,命令中包含的美元符号字符$是JSON文档中值的路径(在这种情况下,它只是表示根)。
JSON.DEL命令使用路径参数删除指定的任何JSON值:
> JSON.SET example $ '[ true, { "answer": 42 }, null ]'
OK
> JSON.GET example $
"[[true,{\"answer\":42},null]]"
> JSON.GET example $[1].answer
"[42]"
> JSON.DEL example $[-1]
(integer) 1
> JSON.GET example $
"[[true,{\"answer\":42}]]"
您可以使用一组专用的JSON命令来操作数组:
> JSON.SET arr $ []
OK
> JSON.ARRAPPEND arr $ 0
1) (integer) 1
> JSON.GET arr $
"[[0]]"
> JSON.ARRINSERT arr $ 0 -2 -1
1) (integer) 3
> JSON.GET arr $
"[[-2,-1,0]]"
> JSON.ARRTRIM arr $ 1 1
1) (integer) 1
> JSON.GET arr $
"[[-1]]"
> JSON.ARRPOP arr $
1) "-1"
> JSON.ARRPOP arr $
1) (nil)
JSON对象也有自己的命令:
> JSON.SET obj $ '{"name":"Leonard Cohen","lastSeen":1478476800,"loggedOut": true}'
OK
> JSON.OBJLEN obj $
1) (integer) 3
> JSON.OBJKEYS obj $
1) 1) "name"2) "lastSeen"3) "loggedOut"
路径
路径帮助您在 JSON 文档中访问特定的元素。由于没有标准的 JSON 路径语法,Redis JSON 实现了自己的路径语法。JSON 的语法基于常见的最佳实践,且类似于 JSONPath。
返回的值是一个 JSON 字符串,其中包含顶级数组,数组中的元素是 JSON 序列化后的字符串。如果使用了多个路径,则返回值是一个 JSON 字符串,其中包含顶级对象,对象的值是序列化后的 JSON 值数组。
以下 JSONPath 语法表格是根据 Goessner 的路径语法比较进行调整的:
| 语法元素 | 描述 |
|---|---|
| $ | 根,最外层的JSON元素 |
| . or [] | 选择子元素 |
| .. | 递归地遍历JSON文档 |
| * | 通配符 |
| [] | 下标操作符,访问数组元素 |
| [,] | 联合,选择多个元素 |
| [start🔚step] | 数组切片,其中start、end和step是索引 |
| ?() | 过滤JSON对象或数组。支持比较运算符 (==, !=, <, <=, >, >=, =~), 逻辑运算符 (&&, |
| () | 表达式 |
| @ | 在过滤器或表达式中使用的当前元素 |
有关使用详情,请查阅官方文档。
限制
传递给命令的JSON值的深度最多可以为128。如果传递给命令的JSON值包含嵌套级别超过128的对象或数组,则命令将返回错误。
BitMap
Bitfield
Probabilistic
HyperLogLog
Bloom filter
Cuckoo filter
t-digest
Top-K
Count-min sketch
Configuration Parameters
Time series
相关文章:
Redis Stack十部曲之三:理解Redis Stack中的数据类型
文章目录 前言String字符串作为计数器限制 List限制列表阻塞列表自动创建和删除聚合类型键限制 Set限制 Hash限制 Sorted Set范围操作字典操作更新分数 JSON路径限制 BitMapBitfieldProbabilisticHyperLogLogBloom filterCuckoo filtert-digestTop-KCount-min sketchConfigurat…...
OneForAll安装使用
OneForAll简介 OneForAll是一款功能强大的子域收集工具 原项目地址:GitHub - shmilylty/OneForAll: OneForAll是一款功能强大的子域收集工具 gitee项目地址:OneForAll: OneForAll是一款功能强大的子域收集工具 # 安装Python Windows系统安装python参…...
【现代C++】线程支持库
现代C(C11及其之后的版本)引入了标准的线程支持库,使得多线程编程变得更加简单和可移植。这个库提供了线程管理、互斥量、条件变量和其他同步原语。 1. std::thread - 基本线程 std::thread允许创建执行特定任务的线程。 #include <ios…...
游戏引擎架构01__引擎架构图
根据游戏引擎架构预设的引擎架构来构建运行时引擎架构 ...
[Java、Android面试]_15_Android为什么使用Binder?
Android为什么使用Binder?用 Linux原有的IPC不行吗? 本人今年参加了很多面试,也有幸拿到了一些大厂的offer,整理了众多面试资料,后续还会分享众多面试资料。 整理成了面试系列,由于时间有限,每天…...
Python+Selenium+Unittest 之Unittest3(TestSuite()和TextTestRunner())
目录 1:addTest() 2、addTests() 3:discover() 上一篇说了Unittest的一个基本的执行顺序,那如果我们想要调整用例的执行先后顺序的话,可以用TestSuite()和TextTestRunner()了,可以这么理解,比如一个班级…...
3D桌面端可视化引擎HOOPS Visualize如何实现3D应用快速开发?
HOOPS Visualize是一个开发平台,可实现高性能、跨平台3D工程应用程序的快速开发。一些主要功能包括: 高性能、以工程为中心的可视化,使用高度优化的OpenGL或DirectX驱动程序来充分利用可用的图形硬件线程安全的C和C#接口,内部利用…...
Vue探索之Vue2.x源码分析(二)
一.Virtual Dom 虚拟DOM是一种轻量级的抽象,它允许我们在Javascript中创建、更新和删除DOM元素。它是React等现代Javascript框架的核心概念之一。 Vue的虚拟dom是一种抽象层的概念,它使得Vue可以高效地更新Dom。虚拟Dom是通过Javascript对象来表示DOM结…...
人工智能分类算法概述
文章目录 人工智能主要分类算法决策树随机森林逻辑回归K-均值 总结 人工智能主要分类算法 人工智能分类算法是用于将数据划分为不同类别的算法。这些算法通过学习数据的特征和模式,将输入数据映射到相应的类别。分类算法在人工智能中具有广泛的应用,如图…...
理解 Golang 变量在内存分配中的规则
为什么有些变量在堆中分配、有些却在栈中分配? 我们先看来栈和堆的特点: 简单总结就是: 栈:函数局部变量,小数据 堆:大的局部变量,函数内部产生逃逸的变量,动态分配的数据&#x…...
《QT实用小工具·二十四》各种数学和数据的坐标演示图
1、概述 源码放在文章末尾 该项目实现了各种数学和数据的坐标演示图,下面是demo演示: 项目部分代码如下: #ifndef FRMMAIN_H #define FRMMAIN_H#include <QWidget> class QAbstractButton;namespace Ui { class frmMain; }class fr…...
【S32K3 MCAL配置】-3.1-CANFD配置-经典CAN切换CANFD(基于MCAL+FreeRTOS)
"><--返回「Autosar_MCAL高阶配置」专栏主页--> 目录(共5页精讲,基于评估板: NXP S32K312EVB-Q172,手把手教你S32K3从入门到精通) 实现的架构:基于MCAL层 前期准备工作:...
IEC101、IEC103、IEC104、Modbus报文解析工具
一、概述 国际电工委员会第57技术委员会(IEC TC57)1995年出版IEC 60870-5-101后,得到了广泛的应用。为适应网络传输,2000年IEC TC57又出版了IEC 60870-5-104:2000《远东设备及系统 第5-104部分:传输规约-采…...
node res.end返回json格式数据
使用 Node.js 内置 http 模块的createServer()方法创建一个新的HTTP服务器并返回json数据,代码如下: const http require(http);const hostname 127.0.0.1; const port 3000;const data [{ name: 测试1号, index: 0 },{ name: 测试2号, index: 1 },…...
产品开发流程
产品开发流程 时间:2024年04月10日 作者:小蒋聊技术 邮箱:wei_wei10163.com 微信:wei_wei10 产品开发流程_小蒋聊技术_免费在线阅读收听下载 - 喜马拉雅欢迎收听小蒋聊技术的类最新章节声音“产品开发流程”。时间:…...
Python蓝桥杯赛前总结
1.进制转换 (1) 2进制转换为其他进制 # 2转10 int(n, 2) # 2转8 oct(int(n, 2)) # 2转16 hex(int(n, 2)) (2) 8进制转换为其他进制 #8转10 int(n, 8) #8转2 bin(int(n, 8)) #8转16 hex(int(n, 8)) (3) 10进制转换为其他进制 #10转2 bin(n) #10转8 oct(n) #10转16 hex(n) …...
20240326-1-KNN面试题
KNN面试题 1.简述一下KNN算法的原理 KNN算法利用训练数据集对特征向量空间进行划分。KNN算法的核心思想是在一个含未知样本的空间,可以根据样本最近的k个样本的数据类型来确定未知样本的数据类型。 该算法涉及的3个主要因素是:k值选择,距离度…...
【论文速读】| MASTERKEY:大语言模型聊天机器人的自动化越狱
本次分享论文为:MASTERKEY: Automated Jailbreaking of Large Language Model Chatbots 基本信息 原文作者:Gelei Deng, Yi Liu, Yuekang Li, Kailong Wang, Ying Zhang, Zefeng Li, Haoyu Wang, Tianwei Zhang, Yang Liu 作者单位:南洋理工…...
jvm运行情况预估
相关系统 jvm优化原则-CSDN博客 执行下面指令 jstat gc -pid 能计算出一些关键数据,有了这些数据,先给JVM参数一些的初始的,比堆内存大小、年轻代大小 、Eden和Srivivor的比例,老年代的大小,大对象的阈值,…...
Day105:代码审计-PHP原生开发篇SQL注入数据库监控正则搜索文件定位静态分析
目录 代码审计-学前须知 Bluecms-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-常规注入审计分析 emlog-CNVD-1Day-2次注入审计分析 知识点: 1、PHP审计-原生态开发-SQL注入&语句监控 2、PHP审计-原生态开发-SQL注入&正则搜索 3、PHP审计-原生态开发-SQ…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
基于stm32F10x 系列微控制器的智能电子琴(附完整项目源码、详细接线及讲解视频)
注:文章末尾网盘链接中自取成品使用演示视频、项目源码、项目文档 所用硬件:STM32F103C8T6、无源蜂鸣器、44矩阵键盘、flash存储模块、OLED显示屏、RGB三色灯、面包板、杜邦线、usb转ttl串口 stm32f103c8t6 面包板 …...
