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

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 的紧凑存储优点,使得在进行队列操作(如 LPUSHRPUSHLPOPRPOP)时,既能保持高效的操作速度,又能节省内存。

2. Quicklist 和 Ziplist 的关系

在 quicklist 中,每个节点实际上是一个 ziplist。这种设计使得 quicklist 能够在存储和操作上实现高效性。具体而言:

  • 每个 quicklist 节点:包含一个 ziplist,用于存储多个数据项。
  • 节点数量quicklist 可以包含多个节点,每个节点的 ziplist 中可以存放一个或多个元素。

3. 数据的插入与读取

3.1 插入数据

当向 quicklist 中插入数据时,Redis 会按照以下步骤进行:

  1. 检查当前节点的 ziplist:首先检查当前节点的 ziplist 是否已满(达到配置的大小限制,例如通过 list-max-ziplist-size 控制)。
  2. 插入数据:如果没有满,直接将数据插入到当前节点的 ziplist 中。
  3. 创建新节点:如果当前 ziplist 达到大小限制,Redis 会创建一个新的 quicklist 节点,并在新节点中创建一个新的 ziplist,继续插入数据。

3.2 读取数据

读取 quicklist 中的数据时,Redis 会按照节点的顺序,将每个节点中的 ziplist 按顺序连接起来,形成一个完整的列表。具体流程如下:

  1. 遍历节点:从 quicklist 的头节点开始,依次遍历每个节点。
  2. 提取数据:从每个节点的 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)

原文标题&#xff1a;Domain Adaptive YOLO for One-Stage Cross-Domain Detection 中文标题&#xff1a;面向单阶段跨域检测的域自适应YOLO 1、Abstract 域转移是目标检测器在实际应用中推广的主要挑战。两级检测器的域自适应新兴技术有助于解决这个问题。然而&#xff0c;两级…...

面试题:描述在前端开发中,如何利用数据结构来优化页面渲染性能,并给出一个具体的示例。

在前端开发中&#xff0c;优化页面渲染性能是提升用户体验的关键之一。合理地使用数据结构可以有效地减少DOM操作的次数、提高数据处理的效率&#xff0c;从而加快页面的渲染速度。以下是一些策略&#xff0c;并给出一个具体的示例。 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 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

【WiFi帧结构】

文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成&#xff1a;MAC头部frame bodyFCS&#xff0c;其中MAC是固定格式的&#xff0c;frame body是可变长度。 MAC头部有frame control&#xff0c;duration&#xff0c;address1&#xff0c;address2&#xff0c;addre…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

【项目实战】通过多模态+LangGraph实现PPT生成助手

PPT自动生成系统 基于LangGraph的PPT自动生成系统&#xff0c;可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析&#xff1a;自动解析Markdown文档结构PPT模板分析&#xff1a;分析PPT模板的布局和风格智能布局决策&#xff1a;匹配内容与合适的PPT布局自动…...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件&#xff08;System Property Definition File&#xff09;&#xff0c;用于声明和管理 Bluetooth 模块相…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...