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...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
