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...

wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
基于Uniapp开发HarmonyOS 5.0旅游应用技术实践
一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架,支持"一次开发,多端部署",可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务,为旅游应用带来…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...