redis高级篇之redis源码分析List类型quicklist底层演变 答疑159节
(1)ziplist压缩配置:list-compress-depth 0
表示一个quicklist两端不被压缩的节点个数。这里的节点是指quicklist双向链表的节点,而不是指ziplist里面的数据项个数参数list-compress-depth的取值含义如下: 0:是个特殊值,表示都不压缩。这是Redis的默认值。
1:表示quicklist两端各有1个节点不压缩,中间的节点压缩。
2:表示quicklist两端各有2个节点不压缩,中间的节点压缩。
3:表示quicklist两端各有3个节点不压缩,中间的节点压缩,
---压缩什么呢?怎么压缩?winzip?
在 Redis 中,`quicklist` 是一种优化后的链表结构,它结合了双向链表和压缩列表(ziplist)的优点,以提高内存效率和操作性能。`list-compress-depth` 配置参数用于控制 `quicklist` 中节点的压缩策略。
### 压缩什么?
在 `quicklist` 中,每个节点实际上是一个 `ziplist`。`list-compress-depth` 配置参数决定了 `quicklist` 中哪些节点会被压缩。具体来说:
- **节点**:这里指的是 `quicklist` 的节点,每个节点包含一个 `ziplist`。
- **压缩**:指的是对 `ziplist` 进行压缩,而不是对 `ziplist` 内部的每个数据项进行压缩。
### 压缩策略
- **0**:表示不压缩任何节点,这是 Redis 的默认值。
- **1**:表示 `quicklist` 两端各有 1 个节点不压缩,中间的节点会被压缩。
- **2**:表示 `quicklist` 两端各有 2 个节点不压缩,中间的节点会被压缩。
- **3**:表示 `quicklist` 两端各有 3 个节点不压缩,中间的节点会被压缩。
### 怎么压缩?
Redis 使用的是 LZF 压缩算法,而不是像 WinZip 那样的文件压缩工具。LZF 是一种轻量级的、快速的压缩算法,适合用于实时应用中。
### 压缩和解压缩的过程
1. **压缩**:
- 当一个 `quicklist` 节点需要被压缩时,Redis 会使用 LZF 算法对该节点中的 `ziplist` 进行压缩。
- 压缩后的数据存储在该节点中,并标记为压缩状态。
2. **解压缩**:
- 当需要访问一个被压缩的节点时,Redis 会首先解压缩该节点,然后再进行访问。
- 解压缩后的数据暂时保存在内存中,供当前操作使用。
### 为什么压缩?
压缩 `quicklist` 中间的节点可以显著减少内存使用量,尤其是在有大量数据的情况下。通过压缩那些不常访问的节点,可以在不影响访问性能的前提下,节省大量内存。
### 示例
假设你有一个 `quicklist`,并且 `list-compress-depth` 设置为 2:
- `quicklist` 的头部和尾部各有 2 个节点不被压缩。
- 中间的节点会被压缩。
这种配置适用于数据访问模式较为集中在两端的情况,例如队列操作(FIFO/LIFO),这样可以在保证性能的同时,最大限度地节省内存。
### 代码示例
以下是一个简单的示例,展示了如何设置 `list-compress-depth`:
```conf
# redis.conf 文件中
list-compress-depth 2
```
通过这种配置,你可以控制 `quicklist` 的压缩策略,从而在性能和内存使用之间找到最佳平衡点。
### 总结
`list-compress-depth` 是一个控制 `quicklist` 节点压缩策略的重要参数,通过合理设置这个参数,可以在保证性能的同时,显著减少内存使用。Redis 使用 LZF 算法进行压缩,适合实时应用中的压缩需求。
==============
(2)ziplist中entry配置:list-max-ziplist-size -2当取正值的时候,表示按照数据项个数来限定每个quicklist节点上的ziplist长度。比如,当这个参数配置成5的时候,表示每个quicklist节点的ziplist最多包含5个数据项。当取负值的时候,表示按照古用字节数来限定每个quicklist节点上的ziplist长度。这时,它只能取-1到-5这五个值,每个值含义如下:
(注:1kb=>1024 bytes)5:每个quicklist节点上的ziplist大小不能超过64 Kb。
-4:每个quicklist节点上的ziplist大小不能超过32 Kb.
-3:每个quicklist节点上的ziplist大小不能超过16 Kb,
-2:每个quicktist节点上的ziplist大小不能超过8 Kb.2是Redis给出的默认值)
-1:每个quicklist节点上的ziplist大小不能超过4 Kb
---什么叫quicklist节点上的ziplist长度,意思quicklist上有10个节点,就有10个ziplist吗,list里面套list不成了个二维数组?有必要吗?
你的理解基本正确,但稍微有些细节需要澄清。`quicklist` 是 Redis 中一种优化后的链表结构,它结合了双向链表和压缩列表(ziplist)的优点,以提高内存效率和操作性能。
### Quicklist 和 Ziplist 的关系
- **Quicklist**:是一个双向链表,每个节点(node)包含一个 `ziplist`。
- **Ziplist**:是一种紧凑的数据结构,用于存储多个小数据项,以节省内存。
所以,`quicklist` 的每个节点确实包含一个 `ziplist`。这样设计的目的是为了提高内存利用率和操作效率。
### 为什么使用这种设计?
1. **内存效率**:`ziplist` 是一种紧凑的数据结构,适合存储小数据项。通过将多个小数据项紧凑地存储在一个 `ziplist` 中,可以显著减少内存开销。
2. **操作效率**:`quicklist` 结合了双向链表的快速插入和删除操作,以及 `ziplist` 的紧凑存储优点。这样设计使得在进行队列操作(如 `LPUSH`, `RPUSH`, `LPOP`, `RPOP`)时,既能保持高效的操作速度,又能节省内存。
### `list-max-ziplist-size` 配置参数
这个参数用于控制每个 `quicklist` 节点中 `ziplist` 的大小,可以通过数据项个数或字节数来限制。
- **正值**:表示按照数据项个数来限定每个 `ziplist` 的长度。
- 例如,配置为 `5` 表示每个 `ziplist` 最多包含 5 个数据项。
- **负值**:表示按照字节数来限定每个 `ziplist` 的长度。
- -1:每个 `ziplist` 不超过 4 KB。
- -2:每个 `ziplist` 不超过 8 KB(默认值)。
- -3:每个 `ziplist` 不超过 16 KB。
- -4:每个 `ziplist` 不超过 32 KB。
- -5:每个 `ziplist` 不超过 64 KB。
### 具体示例
假设你有一个 `quicklist`,并且配置 `list-max-ziplist-size` 为 `-2`(默认值),表示每个 `ziplist` 的大小不能超过 8 KB。
- **插入数据**:当你向 `quicklist` 中插入数据时,Redis 会将数据插入到当前节点的 `ziplist` 中,直到该 `ziplist` 的大小达到 8 KB。
- **创建新节点**:一旦当前 `ziplist` 达到 8 KB,Redis 会创建一个新的 `quicklist` 节点,并在新的节点中创建一个新的 `ziplist`,继续插入数据。
### 是否有必要?
这种设计有其实际意义和必要性:
1. **内存优化**:通过将数据紧凑地存储在 `ziplist` 中,可以显著减少内存开销,特别是对于存储大量小数据项的场景。
2. **操作优化**:结合双向链表和 `ziplist` 的优点,使得插入、删除和访问操作都非常高效。
3. **灵活性**:通过配置参数,可以灵活地调整 `ziplist` 的大小,以适应不同的使用场景和性能需求。
### 总结
`quicklist` 结合了双向链表和 `ziplist` 的优点,通过配置参数 `list-max-ziplist-size` 可以灵活地控制每个 `ziplist` 的大小。每个 `quicklist` 节点包含一个 `ziplist`,这种设计既提高了内存利用率,又保证了操作效率。虽然看起来像是“list 套 list”,但实际上这种设计非常适合 Redis 的使用场景,特别是对于需要高效存储和操作大量小数据项的应用。
=============
意思是,quicklist有10个节点,每个节点有一个ziplist,每个ziplist里面可能存放一个或多个元素,把所有节点上的ziplist里面的元素首尾相连就能到所有的元素?
是的,你的理解是正确的。每个 `quicklist` 节点包含一个 `ziplist`,而每个 `ziplist` 里面可以存放一个或多个元素。所有节点上的 `ziplist` 里面的元素首尾相连,就形成了整个 `quicklist` 的完整数据。
### 具体流程
1. **插入数据**:
- 当你向 `quicklist` 中插入数据时,Redis 会将数据插入到当前节点的 `ziplist` 中。
- 如果当前 `ziplist` 达到配置的大小限制(通过 `list-max-ziplist-size` 控制),Redis 会创建一个新的 `quicklist` 节点,并在新节点中创建一个新的 `ziplist`,继续插入数据。
2. **读取数据**:
- 当你读取 `quicklist` 中的数据时,Redis 会按照节点的顺序,将每个节点中的 `ziplist` 按顺序连接起来,形成一个完整的列表。
### 具体示例
假设你有一个 `quicklist`,并且配置 `list-max-ziplist-size` 为 `-2`(即每个 `ziplist` 的大小不能超过 8 KB)。
- **插入数据**:
- 你插入了 20 个元素。
- 假设每个 `ziplist` 可以存放 5 个元素,那么 `quicklist` 会有 4 个节点,每个节点包含一个 `ziplist`,每个 `ziplist` 包含 5 个元素。
- **读取数据**:
- 当你读取 `quicklist` 中的数据时,Redis 会按照节点的顺序,将 4 个节点中的 `ziplist` 按顺序连接起来,形成一个包含 20 个元素的完整列表。
### 优点
- **内存效率**:通过将数据紧凑地存储在 `ziplist` 中,可以显著减少内存开销。
- **操作效率**:结合双向链表和 `ziplist` 的优点,使得插入、删除和访问操作都非常高效。
### 总结
`quicklist` 通过结合双向链表和 `ziplist` 的优点,既提高了内存利用率,又保证了操作效率。每个 `quicklist` 节点包含一个 `ziplist`,所有节点上的 `ziplist` 里面的元素首尾相连,就能得到整个 `quicklist` 的完整数据。这样设计非常适合 Redis 的使用场景,特别是对于需要高效存储和操作大量小数据项的应用。
Quicklist 与 Ziplist 详解:Redis 的高效数据结构
在 Redis 中,quicklist 是一种优化后的链表结构,它结合了双向链表和压缩列表(ziplist)的优点,以提高内存效率和操作性能。理解 quicklist 的内部结构和工作原理,可以帮助开发者更好地利用 Redis 的特性,优化存储和访问数据的方式。
1. Quicklist 的基本结构
quicklist 是一个双向链表,每个节点(node)包含一个 ziplist。这种设计的目的在于:
- 内存效率:
ziplist是一种紧凑的数据结构,适合存储多个小数据项。通过将多个小数据项紧凑地存储在一个ziplist中,可以显著减少内存开销。 - 操作效率:结合双向链表的快速插入和删除操作,以及
ziplist的紧凑存储优点,使得在进行队列操作(如LPUSH,RPUSH,LPOP,RPOP)时,既能保持高效的操作速度,又能节省内存。
2. Quicklist 和 Ziplist 的关系
在 quicklist 中,每个节点实际上是一个 ziplist。这种设计使得 quicklist 能够在存储和操作上实现高效性。具体而言:
- 每个
quicklist节点:包含一个ziplist,用于存储多个数据项。 - 节点数量:
quicklist可以包含多个节点,每个节点的ziplist中可以存放一个或多个元素。
3. 数据的插入与读取
3.1 插入数据
当向 quicklist 中插入数据时,Redis 会按照以下步骤进行:
- 检查当前节点的
ziplist:首先检查当前节点的ziplist是否已满(达到配置的大小限制,例如通过list-max-ziplist-size控制)。 - 插入数据:如果没有满,直接将数据插入到当前节点的
ziplist中。 - 创建新节点:如果当前
ziplist达到大小限制,Redis 会创建一个新的quicklist节点,并在新节点中创建一个新的ziplist,继续插入数据。
3.2 读取数据
读取 quicklist 中的数据时,Redis 会按照节点的顺序,将每个节点中的 ziplist 按顺序连接起来,形成一个完整的列表。具体流程如下:
- 遍历节点:从
quicklist的头节点开始,依次遍历每个节点。 - 提取数据:从每个节点的
ziplist中提取数据,并将其连接到一起,形成完整的数据序列。
4. Quicklist 配置参数
quicklist 的行为可以通过多个配置参数进行调整,以下是一些重要参数:
4.1 list-compress-depth
- 描述:控制
quicklist中节点的压缩策略。 - 取值:
- 0:不压缩任何节点。
- 1:两端各有 1 个节点不压缩,中间的节点会被压缩。
- 2:两端各有 2 个节点不压缩,中间的节点会被压缩。
- 3:两端各有 3 个节点不压缩,中间的节点会被压缩。
4.2 list-max-ziplist-size
- 描述:控制每个
quicklist节点中ziplist的大小。 - 取值:
- 正值:表示按照数据项个数来限定每个ziplist的长度。
- 负值:表示按照字节数来限定每个ziplist的长度。
- -1:每个ziplist不超过 4 KB。
- -2:每个ziplist不超过 8 KB(默认值)。
- -3:每个ziplist不超过 16 KB。
- -4:每个ziplist不超过 32 KB。
- -5:每个ziplist不超过 64 KB。
5. Quicklist 的优点
quicklist 的设计带来了多个优点:
- 内存优化:通过将数据紧凑地存储在
ziplist中,可以显著减少内存开销,尤其适合存储大量小数据项的场景。 - 操作效率:结合双向链表的快速操作特性,使得插入、删除和访问操作都非常高效。
- 灵活性:通过配置参数,可以灵活地调整
ziplist的大小,以适应不同的使用场景和性能需求。
6. Quicklist 的应用场景
quicklist 在 Redis 的许多应用场景中扮演着重要角色,以下是一些具体的应用示例:
6.1 队列操作
在实现队列操作(如 LPUSH 和 RPOP)时,quicklist 能够高效地处理大量数据项。由于 quicklist 的设计,队列的两端操作性能优越,适合高并发场景。
6.2 任务调度
在任务调度系统中,quicklist 可以用来存储待处理的任务。通过高效的插入和删除操作,可以快速地处理任务队列。
6.3 实时数据处理
在实时数据处理场景中,quicklist 能够快速存储和访问大量小数据项。它的高效性使得在数据流处理时能够保持良好的性能。
7. 反向遍历
如前所述,quicklist 的设计允许反向遍历。通过访问每个节点的 ziplist,可以从最后一个元素开始向前遍历。这在某些场景中非常有用,例如:
- 撤销操作:在文本编辑器中,用户可能希望从最后一个操作开始撤销。
- 历史记录:在浏览器或应用程序中,用户可能希望查看最近的操作历史。
8. 性能评估与优化
在实施 quicklist 时,进行性能评估是非常重要的。可以通过以下方式进行评估:
- 基准测试:对
quicklist的性能进行基准测试,记录不同数据量下的插入、删除和访问时间。 - 内存使用分析:监控内存的使用情况,确保在存储大量数据时不会出现过高的内存占用。
9. 未来的扩展与改进
随着技术的不断进步,quicklist 的实现和应用也在不断演变。未来可能出现以下趋势:
- 结合机器学习:通过结合机器学习技术,可以智能化地优化数据的存储和访问策略。
- 增强的可视化工具:开发更强大的可视化工具,使用户能够直观地理解
quicklist的内部结构和数据流动。
10. 总结
quicklist 是 Redis 中一种高效的数据结构,通过结合双向链表和 ziplist 的优点,既提高了内存利用率,又保证了操作效率。每个 quicklist 节点包含一个 ziplist,所有节点上的 ziplist 里面的元素首尾相连,形成整个 quicklist 的完整数据。这种设计非常适合 Redis 的使用场景,特别是对于需要高效存储和操作大量小数据项的应用。
希望这篇详细的分析能帮助你更全面地理解 quicklist 的工作原理及其在 Redis 中的重要性。如果你还有其他问题或想深入探讨的内容,请随时告诉我!
11. Quicklist 的实现细节
在深入了解 quicklist 的实现之前,我们需要关注其内部结构以及如何在内存中管理这些结构。quicklist 结合了双向链表和压缩列表(ziplist),其实现细节如下:
11.1 内部结构
quicklist 的每个节点实际上是一个 ziplist,它的结构大致如下:
c
Copy
typedef struct quicklistNode {struct quicklistNode *prev; // 指向前一个节点struct quicklistNode *next; // 指向下一个节点unsigned char *zl; // 指向 ziplistunsigned int sz; // ziplist 的大小unsigned int count; // ziplist 中的元素数量// 其他可能的元数据
} quicklistNode;typedef struct quicklist {quicklistNode *head; // 指向头节点quicklistNode *tail; // 指向尾节点unsigned long count; // quicklist 中的节点数量
} quicklist;
11.2 节点的创建与销毁
在 quicklist 的实现中,节点的创建和销毁是非常重要的操作,直接影响到内存的使用效率和性能。
- 创建节点:当需要插入数据时,如果当前节点的
ziplist达到大小限制,Redis 会创建一个新的quicklistNode,并在其中分配一个新的ziplist。
c
Copy
quicklistNode *createQuicklistNode() {quicklistNode *node = malloc(sizeof(quicklistNode));node->zl = createZiplist(); // 创建新的 ziplistnode->sz = 0;node->count = 0;node->prev = NULL;node->next = NULL;return node;
}
- 销毁节点:在移除节点时,需要确保释放内存并处理相关的清理工作。
c
Copy
void freeQuicklistNode(quicklistNode *node) {freeZiplist(node->zl); // 释放 ziplist 的内存free(node); // 释放节点本身的内存
}
12. Quicklist 的内存管理
内存管理是 quicklist 实现中的关键部分,合理的内存管理可以提高性能并减少内存碎片。
12.1 内存分配
Redis 通常使用自定义的内存分配器来管理内存,以提高性能。quicklist 的节点和 ziplist 都通过这个分配器进行管理。
12.2 内存释放
在操作 quicklist 时,确保及时释放不再使用的节点和 ziplist,以避免内存泄漏。Redis 的内存管理策略通常会在对象不再被引用时自动释放内存。
13. Quicklist 的性能优化
为了提高 quicklist 的性能,Redis 采用了一些优化策略:
13.1 节点合并
当多个 ziplist 节点的大小较小且相邻时,Redis 可能会将它们合并为一个节点,以减少节点数量和内存开销。
13.2 懒惰释放
在某些情况下,Redis 可能会延迟释放节点的内存,直到内存压力较大时才进行清理。这种策略可以减少频繁的内存分配和释放操作,提高性能。
14. Quicklist 的使用场景
quicklist 在许多实际应用中都有重要的作用,以下是一些具体的场景:
14.1 实时数据流处理
在需要处理大量实时数据流的应用中,quicklist 提供了高效的插入和删除操作,适合用于实时数据的收集和分析。
14.2 消息队列
在实现消息队列时,quicklist 可以有效地存储和管理消息。由于其高效的队列操作,适合用于高并发的消息处理场景。
14.3 数据缓存
在实现数据缓存时,quicklist 可以用于存储缓存数据,结合压缩和紧凑存储,可以有效地利用内存。
15. Quicklist 与其他数据结构的比较
在设计数据结构时,比较不同数据结构的优缺点是非常重要的。以下是 quicklist 与其他数据结构的比较:
15.1 Quicklist vs. Linked List
- 优点:
quicklist通过使用ziplist提高了存储效率,而普通的链表则需要为每个节点分配额外的内存。 - 缺点:
quicklist的访问速度可能略慢于普通链表,因为需要解压缩ziplist。
15.2 Quicklist vs. Array
- 优点:
quicklist支持动态大小,适合存储不确定数量的数据,而数组则需要预先定义大小。 - 缺点:随机访问速度较慢,因为需要遍历节点。
16. Quicklist 的未来发展
随着技术的不断进步,quicklist 的实现和应用也在不断演变。未来可能出现以下趋势:
16.1 更智能的压缩算法
未来的 Redis 版本可能会引入更智能的压缩算法,以进一步提高内存利用率和性能。
16.2 支持更复杂的数据类型
随着应用需求的变化,quicklist 可能会扩展以支持更复杂的数据类型,增强其灵活性和可用性。
17. 总结
quicklist 是 Redis 中一种高效的数据结构,通过结合双向链表和压缩列表的优点,既提高了内存利用率,又保证了操作效率。每个 quicklist 节点包含一个 ziplist,所有节点上的 ziplist 里面的元素首尾相连,形成整个 quicklist 的完整数据。这种设计非常适合 Redis 的使用场景,特别是对于需要高效存储和操作大量小数据项的应用。
希望这篇详细的分析能帮助你更全面地理解 quicklist 的工作原理及其在 Redis 中的重要性。如果你还有其他问题或想深入探讨的内容,请随时告诉我!
相关文章:
redis高级篇之redis源码分析List类型quicklist底层演变 答疑159节
(1)ziplist压缩配置:list-compress-depth 0 表示一个quicklist两端不被压缩的节点个数。这里的节点是指quicklist双向链表的节点,而不是指ziplist里面的数据项个数参数list-compress-depth的取值含义如下: 0:是个特殊值,表示都不压缩。这是Redis的默认值…...
Elasticsearch 与 Lucene 的区别和联系
Elasticsearch 与 Lucene 的区别和联系 Elasticsearch 与 Lucene 的区别和联系一、知识背景Elasticsearch 简介Lucene 简介 二、Elasticsearch 和 Lucene 的区别适用场景性能优势和劣势架构设计的异同点 三、Elasticsearch和Lucene的联系四、Elasticsearch和Lucene的应用案例及…...
OpenCV视觉分析之运动分析(5)背景减除类BackgroundSubtractorMOG2的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 基于高斯混合模型的背景/前景分割算法。 该类实现了在文献[320]和[319]中描述的高斯混合模型背景减除。 cv::BackgroundSubtractorMOG2 类是 O…...
【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据
【SAP Hana】X-DOC:数据仓库ETL如何抽取SAP中的CDS视图数据 1、无参CDS对应数据库视图2、有参CDS对应数据库表函数3、封装有参CDS为无参CDS,从而对应数据库视图 1、无参CDS对应数据库视图 select * from ZFCML_REP_V where mandt 300;2、有参CDS对应数…...
WPF的UpdateSourceTrigger属性
在WPF中,UpdateSourceTrigger属性用于控制数据绑定中何时将绑定目标(通常是UI元素)的值更新回绑定源(通常是数据对象)。这个属性有以下几个值: Default:这是默认值,对于不同的绑定目…...
2024-09-25 环境变量,进程地址空间
一、认识常见的环境变量 1. echo $HOME 输出当前用户对应的家目录 当用户登录系统时,流程如下: (1)用户登录系统后,系统启动Shell程序。 (2)启动bash shell,准备接收用户指令。 &a…...
中国移动机器人将投入养老场景;华为与APUS共筑AI医疗多场景应用
AgeTech News 一周行业大事件 华为与APUS合作,共筑AI医疗多场景应用 中国移动展出人形机器人,预计投入养老等场景 作为科技与奥富能签约,共拓智能适老化改造领域 天与养老与香港科技园,共探智慧养老新模式 中山大学合作中国…...
青少年编程能力等级测评CPA C++ 四级试卷(1)
青少年编程能力等级测评CPA C 四级试卷(1) 一、单项选择题(共15题,每题3分,共45分) CP4_1_1.在面向对象程序设计中,与数据构成一个相互依存的整体的是( )。 A. 对数据…...
树上任意两点的距离
题目描述 给出 n 个点的一棵树,多次询问两点之间的最短距离。 注意:边是双向的。 输入描述 第一行为两个整数 n 和 m。n 表示点数,m 表示询问次数; 下来 n−1 行,每行三个整数 x,y,k,表示点 x 和点 y 之间…...
【 thinkphp8 】00008 thinkphp8数据查询,常用table,name方法,进行数据查询汇总
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【 t…...
Git的命令合集
关于Git的一些命令合集,会慢慢更新! 20241024程序员节开始写的,记录一下~~ git查看log、查看详细提交记录 会显示之前的提交记录 , 排序由近及远 git log log按q退出 git回退到某个commit命令: 退到/进到指定commit的sha码&…...
博客搭建之路:hexo搜索引擎收录
文章目录 hexo搜索引擎收录以百度为例 hexo搜索引擎收录 hexo版本5.0.2 npm版本6.14.7 next版本7.8.0 写博客的目的肯定不是就只有自己能看到,想让更多的人看到就需要可以让搜索引擎来收录对应的文章。hexo支持生成站点地图sitemap 在hexo下的_config.yml中配置站点…...
创建Windows系统还原点
系统保护...
Linux等保测评需要用到的命令
三权设置 查看账户情况 cd /home/ ll 设置审计账户 useradd shenji passwd shenji 修改密码 passwd新密码 设置管理账户 useradd guanli passwd guanli compgen -u 查看用户 切换到root账户 su root 设置审计用户权限 vim /etc/sudoers shenji ALL (root) NOPASSWD:…...
PostgreSQL的学习心得和知识总结(一百五十六)|auto_explain — log execution plans of slow queries
目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...
数据结构模板代码合集(不完整)
P3368 【模板】树状数组 2 #include <bits/stdc.h> using namespace std; const int maxn 5e5 7;int n, m, s, t; int ans; int a[maxn]; struct node{int l, r;int num; }tr[maxn * 4];void build(int p, int l, int r){tr[p] {l, r, 0};if(l r){tr[p].num a[l];r…...
shell脚本语法详解
目录 shell语法基础 指定shell解析器 注释 运行 变量 定义变量 引用变量 清除变量值 从键盘获取值 输入单值 添加输入提示语 读取多值 编辑 定义只读变量 环境变量 设置环境变量与查看环境变量 特殊变量 三种引号的作用与区别 小括号与大括号 参数传递 位…...
2021亚洲机器学习会议:面向单阶段跨域检测的域自适应YOLO(ACML2021)
原文标题:Domain Adaptive YOLO for One-Stage Cross-Domain Detection 中文标题:面向单阶段跨域检测的域自适应YOLO 1、Abstract 域转移是目标检测器在实际应用中推广的主要挑战。两级检测器的域自适应新兴技术有助于解决这个问题。然而,两级…...
面试题:描述在前端开发中,如何利用数据结构来优化页面渲染性能,并给出一个具体的示例。
在前端开发中,优化页面渲染性能是提升用户体验的关键之一。合理地使用数据结构可以有效地减少DOM操作的次数、提高数据处理的效率,从而加快页面的渲染速度。以下是一些策略,并给出一个具体的示例。 1. 使用合适的数据结构 数组与对象&#…...
微积分复习笔记 Calculus Volume 1 - 3.2 he Derivative as a Function
3.2 The Derivative as a Function - Calculus Volume 1 | OpenStax...
【Python】 -- 趣味代码 - 小恐龙游戏
文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
