diff --git "a/articles/general/dl/10-\346\267\261\345\272\246\345\255\246\344\271\240\357\275\234\346\240\207\345\207\206\345\261\202\357\274\232\346\234\272\345\231\250\345\255\246\344\271\240\346\241\206\346\236\266\344\271\213\345\247\213.md" "b/articles/general/dl/10-\346\267\261\345\272\246\345\255\246\344\271\240\357\275\234\346\240\207\345\207\206\345\261\202\357\274\232\346\234\272\345\231\250\345\255\246\344\271\240\346\241\206\346\236\266\344\271\213\345\247\213.md" index 560f2d872..ae9a744b5 100644 --- "a/articles/general/dl/10-\346\267\261\345\272\246\345\255\246\344\271\240\357\275\234\346\240\207\345\207\206\345\261\202\357\274\232\346\234\272\345\231\250\345\255\246\344\271\240\346\241\206\346\236\266\344\271\213\345\247\213.md" +++ "b/articles/general/dl/10-\346\267\261\345\272\246\345\255\246\344\271\240\357\275\234\346\240\207\345\207\206\345\261\202\357\274\232\346\234\272\345\231\250\345\255\246\344\271\240\346\241\206\346\236\266\344\271\213\345\247\213.md" @@ -1,13 +1,14 @@ --- id: standard-layer sidebar_position: 10 -title: 标准层:机器学习框架之始 -description: 深度学习|标准层:机器学习框架之始 +title: 标准层:深度学习模型拆解 +description: 深度学习|标准层:深度学习模型拆解 last_update: author: Aurelius date: 2024-09-30 tags: - 深度学习 + - 模型拆解 - 标准层 - 机器学习框架 - 网络结构 @@ -15,11 +16,13 @@ tags: ## 引言 -前文「深度学习|误差逆传播:梯度速解」中我们以 AddLayer 和 MulLayer 为例,引入了神经网络`标准层`封装的实现方式。神经网络中每一层的运算都可以以相同的接口封装成标准层的形式,每一层通过一个具体实现类实现,这样可以通过调用同一接口的不同实现,只需要经过简单的组装或者切换,就可以完成“任意”新网络结构的构建、学习、推理等复杂的工作。 +前文「深度学习|误差逆传播:梯度速解」中我们以 AddLayer 和 MulLayer 为例,引入了神经网络`标准层`封装的实现方式,又以 SoftmaxWithLoss 层为例讲解了其前后向的计算推导过程,并给出了其标准层的实现。 -## 常见运算的层 +不难看出,神经网络中每一层的运算都可以以相同的接口封装成标准层的形式,每一层通过一个具体实现类实现,这样可以通过调用同一接口的不同实现,只需要经过简单的组装、切换、嵌套等,就可以完成“任意”新网络结构的构建、学习、推理等复杂的工作。 -我们之前的演示大多是为了走通简单的学习与推理流程,并没有都遵守标准层的实现。后文的演示将以标准层的接口为基准,对神经网络中涉及的计算过程进行统一封装,达到一个通用的 DeepLearning 框架的效果。 +## 运算的层封装 + +我们之前的演示大多是为了走通简单的学习与推理流程,并没有都遵守标准层的实现。后文的演示将以标准层的接口为基准,对神经网络中涉及的计算过程进行统一封装,对深度学习模型的层中逻辑做拆解和封装,最终达到一个通用的 DeepLearning 框架的效果。 参照 AddLayer 和 MulLayer,我们发现可以将神经网络的标准层抽象成包含了如下三个方法的抽象类: @@ -29,22 +32,7 @@ tags: | forward(self, args) | 正向传播的计算,用于计算推理结果; | | backward(self, dout) | 逆传播的计算,用于计算梯度; | -我们只需要根据不同层的具体计算逻辑是指这三个方法的不同实现,就可以实现各种网络层次的封装,从而实现一个通用的神经网络框架。 - -神经网络中常见的层如: - -- **全连接层(Fully Connected Layer)**:如 `Affine 层`,每个输入与每个输出节点相连。 -- **激活层(Activation Layer)**:如 `ReLU 层`、`Sigmoid 层`、`Tanh 层`等,用于神经元输出,增加非线性表达能力。 -- `Softmax-with-Loss 层`:用于输出层的正规化和损失计算。 -- **卷积层(Convolutional Layer)**:如 `Conv2D`、`Conv2DTranspose`、`SeparableConv2D` 等,用于以卷积操作提取特征,常用于图像数据处理。 -- **池化层(Pooling Layer)**:如 `Max Pooling`、`Average Pooling` 等,在池化窗口内采样,用于减少特征维度,增强模型的局部不变形。 -- **归一化层(Normalization Layer)**:如 `Batch Normalization`、`Layer Normalization`、`Instance Normalization` 等,用于加速训练,提高模型的稳定性与泛化能力。 -- **丢弃层(Dropout Layer)**:用于防止过拟合,随机丢弃一部分神经元。 -- **嵌入层(Embedding Layer)**:用于将稀疏的输入转换为稠密的向量表示。 -- **递归层(Recurrent Layer)**:如 `SimpleRNN`、`LSTM`、`GRU` 等,用于处理存在时间依赖关系的序列数据。 -- **自注意力层(Self-Attention Layer)**:用于处理序列数据,提取序列中的重要信息。 - -只要以标准层的方式提供了所有计算逻辑的标准层封装,我们在应对具体繁杂的业务场景时,搭建不同的网络模型就可以不去太过关注这些计算逻辑的实现,只需摘取我们想要的层进行简单的组合,轻易就能够组装成自己想要的复杂网络。接下来我们以标准层的方式来做一些演示。 +只需要根据不同层的具体计算逻辑是指这三个方法的不同实现,就可以实现各种网络层次的封装,从而实现一个通用的神经网络框架。接下来我们以标准层的方式来做一些演示。 ### Affine 层 @@ -56,7 +44,12 @@ $$ Y = X \cdot W + B \tag{1} $$ -其中 X 是矩阵表示的输入(上一层的输出),W 是当前层的权重,B 是当前层的偏置,Y 是输出。 +其中: + +- $X$ 是输入矩阵(或上一层的输出)。 +- $W$ 是当前层的权重矩阵。 +- $B$ 是当前层的偏置向量。 +- $Y$ 是当前层的输出。 根据链式法则,损失函数 L 关于 Y 的梯度为:$\frac{\partial{L}}{\partial{Y}}$。 @@ -74,39 +67,22 @@ $$ \frac{\partial{L}}{\partial{B}} = \frac{\partial{L}}{\partial{Y}} \cdot \frac{\partial{Y}}{\partial{B}} = \frac{\partial{L}}{\partial{Y}} \tag{4} $$ ---- - -### Affine 层的数学式 - -给定 Affine 层的输出公式: - -$$ - Y = X \cdot W + B -$$ - -其中: - -- $X$ 是输入矩阵(或上一层的输出)。 -- $W$ 是当前层的权重矩阵。 -- $B$ 是当前层的偏置向量。 -- $Y$ 是当前层的输出。 - -### 梯度计算过程 +Affine 层梯度推算过程 在反向传播过程中,我们需要计算损失函数 $L$ 关于输入 $X$、权重 $W$ 和偏置 $B$ 的梯度。这可以通过链式法则完成。 -#### 1. 梯度关于 $X$ 的推导 +1. 梯度关于 X 的推导 根据链式法则,损失函数 $L$ 关于 $Y$ 的梯度为 $\frac{\partial{L}}{\partial{Y}}$。我们需要计算: $$ -\frac{\partial{L}}{\partial{X}} = \frac{\partial{L}}{\partial{Y}} \cdot \frac{\partial{Y}}{\partial{X}} + \frac{\partial{L}}{\partial{X}} = \frac{\partial{L}}{\partial{Y}} \cdot \frac{\partial{Y}}{\partial{X}} $$ 首先计算 $Y$ 关于 $X$ 的导数: $$ -Y = X \cdot W + B + Y = X \cdot W + B $$ 在这个公式中, $B$ 是常数项,所以它对 $X$ 的导数为 0。我们只关心 $X \cdot W$。 @@ -114,89 +90,88 @@ $$ 对 $Y$ 求导: $$ -\frac{\partial{Y}}{\partial{X}} = W + \frac{\partial{Y}}{\partial{X}} = W $$ 因此, $$ -\frac{\partial{L}}{\partial{X}} = \frac{\partial{L}}{\partial{Y}} \cdot W^T + \frac{\partial{L}}{\partial{X}} = \frac{\partial{L}}{\partial{Y}} \cdot W^T $$ (右乘 $W^T$ 是因为 $X$ 和 $Y$ 常常是多维矩阵的情况下需要转置。) -### 2. 梯度关于 $W$ 的推导 +2. 梯度关于 W 的推导 同样,我们需要计算: $$ -\frac{\partial{L}}{\partial{W}} = \frac{\partial{L}}{\partial{Y}} \cdot \frac{\partial{Y}}{\partial{W}} + \frac{\partial{L}}{\partial{W}} = \frac{\partial{L}}{\partial{Y}} \cdot \frac{\partial{Y}}{\partial{W}} $$ 计算 $Y$ 关于 $W$ 的导数: $$ -Y = X \cdot W + B + Y = X \cdot W + B $$ 因此,$Y$ 对 $W$ 的导数: $$ -\frac{\partial{Y}}{\partial{W}} = X + \frac{\partial{Y}}{\partial{W}} = X $$ 将其代入公式中,我们得到: $$ -\frac{\partial{L}}{\partial{W}} = X^T \cdot \frac{\partial{L}}{\partial{Y}} + \frac{\partial{L}}{\partial{W}} = X^T \cdot \frac{\partial{L}}{\partial{Y}} $$ -### 3. 梯度关于 $B$ 的推导 +3. 梯度关于 $B$ 的推导 最后,我们需要计算: $$ -\frac{\partial{L}}{\partial{B}} = \frac{\partial{L}}{\partial{Y}} \cdot \frac{\partial{Y}}{\partial{B}} + \frac{\partial{L}}{\partial{B}} = \frac{\partial{L}}{\partial{Y}} \cdot \frac{\partial{Y}}{\partial{B}} $$ 计算 $Y$ 关于 $B$ 的导数: $$ -Y = X \cdot W + B + Y = X \cdot W + B $$ 这样,$\frac{\partial{Y}}{\partial{B}}$ 将是一个单位矩阵或 1(因为偏置 $B$ 对 $Y$ 的影响是直接的): $$ -\frac{\partial{Y}}{\partial{B}} = 1 + \frac{\partial{Y}}{\partial{B}} = 1 $$ 因此, $$ -\frac{\partial{L}}{\partial{B}} = \frac{\partial{L}}{\partial{Y}} + \frac{\partial{L}}{\partial{B}} = \frac{\partial{L}}{\partial{Y}} $$ -### 总结 - 最终的梯度推导公式为: 1. 关于 $X$ 的梯度: - $$ +$$ \frac{\partial{L}}{\partial{X}} = \frac{\partial{L}}{\partial{Y}} \cdot W^T - $$ +$$ 2. 关于 $W$ 的梯度: - $$ +$$ \frac{\partial{L}}{\partial{W}} = X^T \cdot \frac{\partial{L}}{\partial{Y}} - $$ +$$ 3. 关于 $B$ 的梯度: - $$ - \frac{\partial{L}}{\partial{B}} = \frac{\partial{L}}{\partial{Y}} - $$ + +$$ + \frac{\partial{L}}{\partial{B}} = \frac{\partial{L}}{\partial{Y}} +$$ 这些公式是反向传播过程中用于更新权重和偏置的重要基础,确保了网络能够有效地学习。 @@ -293,3 +268,26 @@ $$ Softmax-with-Loss 层的代码实现参见 [Notebook](https://github.com/AfterShip/all-staff-writing-plan.deep-learning-basic/blob/master/runtime/Deep%20Learning.ipynb) 1.3.4 - 4。 使用标准层实现方式组装新的神经网络的代码参见 [runtime/standard-framework/simple_net.py](https://github.com/AfterShip/all-staff-writing-plan.deep-learning-basic/blob/master/runtime/standard-framework/simple_net.py)。其中 [trainer](https://github.com/AfterShip/all-staff-writing-plan.deep-learning-basic/blob/master/runtime/standard-framework/trainer.py) 模块实现了用标准层组装的 SimpleNet 进行手写数字识别任务的学习、推理、效果评估的过程。 + +## 层的使用 + +## 常见的层 + +- **全连接层(Fully Connected Layer)**:如 `Affine 层`,每个输入与每个输出节点相连。 +- **激活层(Activation Layer)**:如 `ReLU 层`、`Sigmoid 层`、`Tanh 层`等,用于神经元输出,增加非线性表达能力。 +- `Softmax-with-Loss 层`:用于输出层的正规化和损失计算。 +- **卷积层(Convolutional Layer)**:如 `Conv2D`、`Conv2DTranspose`、`SeparableConv2D` 等,用于以卷积操作提取特征,常用于图像数据处理。 +- **池化层(Pooling Layer)**:如 `Max Pooling`、`Average Pooling` 等,在池化窗口内采样,用于减少特征维度,增强模型的局部不变形。 +- **归一化层(Normalization Layer)**:如 `Batch Normalization`、`Layer Normalization`、`Instance Normalization` 等,用于加速训练,提高模型的稳定性与泛化能力。 +- **丢弃层(Dropout Layer)**:用于防止过拟合,随机丢弃一部分神经元。 +- **嵌入层(Embedding Layer)**:用于将稀疏的输入转换为稠密的向量表示。 +- **递归层(Recurrent Layer)**:如 `SimpleRNN`、`LSTM`、`GRU` 等,用于处理存在时间依赖关系的序列数据。 +- **自注意力层(Self-Attention Layer)**:用于处理序列数据,提取序列中的重要信息。 + +只要以标准层的方式提供了所有计算逻辑的标准层封装,我们在应对具体繁杂的业务场景时,搭建不同的网络模型就可以不去太过关注这些计算逻辑的实现,只需摘取我们想要的层进行简单的组合,轻易就能够组装成自己想要的复杂网络。 + +## 结语 + +--- + +**PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!** diff --git "a/articles/perception/intellection/_\344\270\203\344\270\252\344\271\240\346\203\257.md" "b/articles/perception/intellection/_\344\270\203\344\270\252\344\271\240\346\203\257.md" new file mode 100644 index 000000000..f12cd9bfe --- /dev/null +++ "b/articles/perception/intellection/_\344\270\203\344\270\252\344\271\240\346\203\257.md" @@ -0,0 +1,804 @@ +# 高效能人士的七个习惯 + +史蒂芬·柯维 +296 个笔记 + +## 由内而外全面造就自己 + +◆ 近 50 年来讨论成功术的著作都很肤浅,谈的都是有关如何树立社会形象的技巧和如何成功的捷径。但这种用“阿司匹林”和“创可贴”来治疗心灵痛苦的方法,往往是头痛医头,脚痛医脚,治标而不治本。有时似乎取得了暂时的效果,但是深层次的问题没有解决,不时又会重新浮现 + +◆ 2025/05/18 发表想法 + +对象、态度、动机、行为。 + +原文:我们也自觉地改变了自己的动机,培育了内在的安全感,不再用孩子的表现来判断自己的价值。 + +◆ 2025/05/18 发表想法 + +这个比喻真好,技巧之于品德,就是临时抱佛脚之于循序渐进、厚积薄发。 + +原文:只重技巧就好似考前临时抱佛脚,纵使有时顺利过关,甚至成绩还不错,但没有日积月累的付出,绝对无法学得精通。 + +◆ 根本问题不在于你的行为和态度,而在于那张错误的“地图”。 + +◆ 10 秒钟都能产生如此这般的影响,更何况一生中的条件作用呢?家庭、学校、教堂、单位、朋友、同事以及流行思潮(如个人魅力论等),都在不知不觉中影响着我们,左右着我们的思维方式——我们的地图。 + +◆ 仅仅改变表面上的行为与态度,却忽略作为源头的思维方式,那么改变的成效一定有限 + +◆ 这个实验还让我们体会到思维方式对人际交往的影响。以前我们总以为只有自己清楚而客观地看到了事物的本质,但这个实验却让我们开始认识到,别人的观点虽然有差异,但也是清楚而客观的。“立场决定观点。 + +◆ 对自己的思维方式负责,懂得审视它,在现实中检验它,并乐于聆听和接受别人的看法,从而获得更广阔的视野和更客观的看法 + +◆ 如果我们只想让生活发生相对较小的变化,那么专注于自己的态度和行为即可,但是实质性的生活变化还是要靠思维的转换 + +◆ 思维方式之所以强大,是因为这构成了我们观察世界的窗口。而思维转换的力量也正是定式改变必需的力量,无论这种转变是立即发生的,还是经过计划缓慢进行的。 + +◆ 有人根据自己的经历建立思维方式或者绘制地图,然后借此观察自己的生活与人际关系。但是地图不等于地域本身,它只是一种“主观的事实”,是对某一地域的描述。 +只有“灯塔”式指引人类成长和幸福的原则才是“客观的事实”,是地域本身 + +◆ 一个人的思维方式越符合这些原则或者自然法则,就越能正确而高效地生活。比起为改变态度和行为所做出的努力,正确的思维方式对于个人和人际关系效能的影响要大得多 + +◆ 个人魅力论之所以让大家趋之若鹜,就是因为它号称能够让人们跨过事物成长的自然过程,迅速而轻松地实现个人效能和人际关系成果丰硕的圆满人生 + +◆ 如果学生不肯发问,不肯暴露自己的无知,不肯让老师知道他的真正水平,那么绝对学不到东西,也就不能有长进。而且伪装实非长久之计,总有被拆穿的一天。承认自己的无知往往是求知的第一步。梭罗曾说:“如果我们时时忙着展现自己的知识,将何从忆起成长所需的无知? + +◆ 忽略了玩弄权术会让信任度降低的事实 + +◆ 如果你力量的来源——体型、力气、职位、权威、学历、地位、身份、外表或是过去的成就——发生变化甚至不复存在,那该怎么办呢? + +◆ 在关系和气氛紧张的时候,教导会被视为一种评判与否定;关系融洽的时候,在私下里对孩子循循善诱效果会加倍 + +◆ 面对老板如此不忠的举动,员工们会质疑老板有没有为自己利益着想,他们会不会觉得被当作机器对待?这种想法并非空穴来风 + +◆ 那些高瞻远瞩的主管都对满足庸俗论调的所谓的“励志”故事和演讲避而远之 + +◆ 原则为中心,以品德为基础,要求“由内而外”地实现个人效能和人际效能 + +◆ “由内而外”的意思是从自身做起,甚至更彻底一些,从自己的内心做起,包括自己的思维方式、品德操守和心理动机 + +◆ 由内而外的观点认为个人领域的成功必须先于公众领域的成功;只有先信守对自己的承诺,才能信守对他人的承诺。把个人魅力置于品德之上,妄图在自我完善之前完善人际关系都将徒劳无功 + +◆ 我们看到的世界并非客观世界本身,而是我们在条件限制之下所看到的世界 + +◆ 我们越能意识到自己的思维方式或推测能力的局限,意识到我们在多大程度上受到自己过去经验的影响,我们就越能直面自己的思维方式,用现实来检验它们、测试它们,必要时改变它们,而且心胸开阔,乐于听取他人的意见。 + +◆ 如果我们只想让生活发生相对较小的变化,我们可以把注意力集中于自己的态度和行为。但是,如果我们想让生活发生实质性的变化,我们必须关注自己的思维方式——我们观察自己和周围世界的方式。 + +## 七个习惯概论 + +◆ 思想决定行动,行动决定习惯,习惯决定品德,品德决定命运 + +◆ “起飞”需要极大的努力,然而一旦脱离了引力的束缚,就会迎来广阔的自由天地,创造出高效能生活所必需的凝聚力和秩序 + +◆ 知识是理论范畴,指点“做什么”及“为何做”;技巧告诉我们“如何做”;意愿促使“想要做”。要养成一种习惯,三者缺一不可。 + +◆ 面向未来牺牲当下的意愿才能促进改变 + +◆ 我们所处的环境的确需要改进,但依赖问题源自个人的成熟度,与环境无关。即使身处较好的环境,也可能是扶不起的阿斗。 + +◆ 真正独立的品德能够让我们行事主动,摆脱对环境和他人的依赖,是值得追求的自由目标,但仍非高效能生活的终极目标。 + +◆ 生理上互赖的人,可以自力更生,但也明白合作会比单干更有成效;情感上互赖的人,能充分认识自己的价值,但也知道爱心、关怀以及付出的必要性;智力上互赖的人懂得取人之长,补己之短 + +◆ 真正的效能应该包含两个要素:一是“产出”,即金蛋;二是“产能”——生产的资产或能力,即下金蛋的鹅。 + +◆ 在生活中“重蛋轻鹅”的人,最终会连这个产金蛋的资产也保不住。反之,“重鹅轻蛋”的人,最后自己都可能会被活活饿死,更不用说鹅了 + +◆ 急功近利常常会毁掉宝贵的物质资产。保持产出与产能的平衡会帮助你更有效地利用物质资产 + +◆ 本金与利息就相当于产能与产出 + +◆ 如果不能持续投资以增进自己的产能,眼光就会受到局限,只能在现有的职位上踏步,每天忙忙碌碌,就怕老板对自己的印象不佳,既在经济上受制于人,又担心职位不保。这同样称不上效能 + +◆ 化解差异,加强了我们之间的纽带和维系 + +◆ 产出与产能平衡的原则告诉我们:你希望员工怎样对待顾客,就要怎样对待员工。 + +◆ 太过维护产能,就如同一个每天长跑三四个小时的人,宣称可以因此多活十年,却不知大好时光都在跑步中流逝。又好像那些只知念书,不肯生产的人,坐享别人的金蛋,自己永远不敢面对现实。 + +◆ 2025/05/19 发表想法 + +事情对错与别人的认知是无关的。inner peace。 + +原文:前三个有关个人成功的习惯,可以大幅提高你的自信心。你将更能认清自己的本质、内心深处的价值观以及个人独特的才干与能耐。秉持自己的信念而活,就能产生自尊自重与自制力,并且内心平和。你会以内在的价值标准,而不是旁人的好恶或与别人比较的结果,来衡量自己。这时候,事情对错与别人是否发现无关 + +◆ 你还会意外地发现,当你不再介意别人怎样看你时,反而会去关心别人对他们自身、他们所处环境以及与你关系的看法。你不再让别人影响情绪,反而更能接受改变,因为你发现支撑现实的内在规律是恒久不变的 + +◆ 。对自己的改变要有耐心,因为自我成长是神圣的,同时也是脆弱的,是人生中最大的投资 + +◆ 2025/05/20 发表想法 + +通过资讯、力量、认可、报酬等的分享,创造更多机会、财富、资源,双赢思维是打破“零和”,将蛋糕做大的基本原则。 + +原文:双赢思维是一种基于互敬、寻求互惠的思考框架与心意,目的是分享更多的机会、财富及资源,而非敌对式竞争。 + +◆ 知彼需要仁慈心,解己需要勇气,能平衡两者,则可大幅提升沟通的效率 + +◆ 统合综效谈的是创造第三种选择,即非按照我的方式,亦非遵循你的方式,而是创造第三种更好的办法 + +◆ 实践统合综效的人际关系和团队会扬弃敌对的态度(1+1 = 1/2),不以妥协为目标(1+1 = 11/2),也不仅仅止于合作(1+1 = 2),他们要的是创造式的合作(1 + 1 > 2) + +◆ 个人领域成功的习惯在根部,表示这些习惯属于个人,别人无法看到。公众领域的成功在地面上展示,每个人都能看到。习惯七不断更新最接近太阳和雨水,代表我们需要不断滋养。 + +◆ 最重要的习惯就是你生活最艰难的时候采用的那个习惯 + +◆ 七个习惯是提高效能的习惯。真正的效能基于符合自然规律的永恒不变的原则。 + +◆ 习惯是知识、技巧和意愿的交叉点。知识是做什么和为何做,技巧是如何做,而意愿是动力——想做。所有这三者必须集合在一起才能形成一个习惯。 + +## 习惯一 积极主动——个人愿景的原则 + +◆ 要让人们充分认识到自己有责任创造条件 + +◆ 我们如果不能客观地考虑看待自己的方式,也就不能理解他人感知他们自己和世界的方式。因此我们无意间就会把个人意愿强加在别人身上,内心却还觉得已经很客观了。 + +◆ 在遭遇(刺激)与对遭遇的回应之间,他有选择回应方式的自由或能力。 + +◆ 选择的自由包括人类特有的四种天赋。除自我意识(Self-awareness)外,我们还拥有“想象力(Imagination)”,即超越当前现实而在头脑中进行创造的能力;“良知(Conscience)”,即明辨是非,坚持行为原则,判断思想、言行正确与否的能力;“独立意志(Independent Will)”,即基于自我意识、不受外力影响而自行其是的能力。 + +◆ 责任感(Responsible),从构词法来说是能够回应(Response-able)的意思,即选择回应的能力。所有积极主动的人都深谙其道,因此不会把自己的行为归咎于环境、外界条件或他人的影响。他们根据价值观,有意识地选择待人接物的方式,不会因为外界因素或一时情绪而冲动行事。 + +◆ 2025/05/21 发表想法 + +很多国人都会有根据别人的态度好坏来给出态度上的反应或“反击”的思想,所谓“人不犯我,我不犯人;人若犯我,虽远必诛”,其实这种态度上的转变是没必要写在脸上的,如此就如同被别人的弱点控制了自己。我们可以理智(风轻云淡)地做很多事情。 + +原文:消极被动的人还会受到“社会天气”的影响。别人以礼相待,他们就笑脸相迎,反之则摆出一副自卫的姿态。心情好坏全都取决于他人的言行,任由别人的弱点控制自己。 + +◆ 根据自己的价值观来选择对外界物质、心理与社会刺激的回应方式 + +◆ 可见最刻骨铭心的伤害并非悲惨遭遇本身,而是我们竟然会放任这些伤害戳在我们心上 + +◆ 2025/05/21 发表想法 + +我的确可以选择不痛苦。 + +原文:承认是自己选择了痛苦之后,我渐渐认识到我的确可以选择不痛苦 + +◆ 伤害我们的并非悲惨遭遇本身,而是我们对于悲惨遭遇的回应。尽管这些事的确会让人身心受创或者经济受损,但是品德和本性完全可以不受影响。事实上越痛苦的经历,越能磨炼意志,开发潜能,提升自如应对困境的能力,甚至还可能感召他人争取同样的自由。 + +◆ 弗兰克尔曾指出人生有三种主要的价值观:一是经验价值观(Experiential Value),来自自身经历;二是创造价值观(Creative Value),源于个人独创;三是态度价值观(Attitudinal Value),即面临绝症等困境时的回应。这三种价值观中,境界最高的是态度价值观。 + +◆ 不妨做几个关于兴趣和能力的测验,研究自己心仪行业的状况,甚至思考自己的求职单位正面临何种难题,然后以有效的表达方式,向对方证明自己能够协助他们解决问题。这就是“解决方案式的推销(自己)”(Solution Selling),是事业成功的重要诀窍之一。 + +◆ 甘于被动,就会受制于人,面临截然不同的发展与机遇。 + +◆ 我,我知道我也会选择网球巡回比赛,但千万不要说你是被迫这么做的 + +◆ 所有进步的社会中,爱都是代表动作,但消极被动的人却把爱当作一种感觉。好莱坞式的电影就常灌输这种不必为爱负责的观念——因为爱只是感觉,没有感觉,便没有爱。事实上,任由感觉左右行为是不负责任的做法。 + +◆ 后来我们聚焦于影响圈,着眼于自己的思维方式,结果真的有效。结论是我们不必担忧外界条件,只要先从自己做起,就可以化阻力为助力。 + +◆ 我们面对的问题可以分为三类:可直接控制的(问题与自身的行为有关),可间接控制的(问题与他人的行为有关)和无法控制的(我们无能为力的问题,例如我们的过去或现实的环境)。对于这三类问题,积极主动的人都是由影响圈着手,加以解决。 + +◆ 可间接控制的问题:可以通过改进施加影响的方法来解决,例如采取移情方式而不是针锋相对,以身作则而不是口头游说。这在第三部分“公众领域的成功”的习惯四、五、六中有所论述。 + +◆ 2025/05/21 发表想法 + +理应不被问题左右。 + +原文:无法控制的问题:我们要做的就是改变面部曲线,以微笑、真诚与平和来接受现实。纵使有再多不满,也要学着泰然处之,这样才不至于被问题左右。 + +◆ 我们可以改变习惯、手段和看法,而这些都属于影响圈范围。 + +◆ 他并非不了解顶头上司的缺点,但他的回应不是批评,而是设法弥补这些缺失。上司颐指气使,他就加以缓冲,减轻属下的压力,又设法配合上司的远见、才能、创造力。 + +◆ 对他们而言,唯有推卸责任才能立于不败之地,因为肯负责,就得不怕失败,为了免于为自己的错误负责,有人干脆把责任推得一干二净。这种人以尽量挑剔别人的错误为能事,借此证明“错不在我”。 + +◆ 把外在环境视作问题症结的想法本身就成问题,应该说是我们给了外部环境控制自己的权力 + +◆ 人人都应该对自己的人生负责,应该为自己营造有利环境,而不是坐等好运或噩运的降临 + +◆ 对力所不能及之事处之泰然,对能够改变的则全力以赴。 + +◆ 对于已经无法挽回的错误,积极主动的人不是悔恨不已,而是承认往日错误已属关注圈的事实,那是人力无法企及的范畴,既不能从头来过,也不能改变必然后果 + +◆ 实际上伤我们最深的,既不是别人的所作所为,也不是自己所犯的错误,而是我们对错误的回应。就仿佛被毒蛇咬后,一心忙着抓蛇只会让毒性发作更快,倒不如尽快设法排出毒液。 + +◆ 影响圈的核心就是做出承诺与信守诺言的能力。积极主动的本质和最清晰的表现就是对自己或别人有所承诺,然后从不食言。 + +◆ 两种能够直接掌控人生的途径:一是做出承诺,并信守诺言;二是确立目标,并付诸实践。 + +◆ 做出承诺与信守诺言正是培养高效能习惯的根本力量 + +◆ 这期间请把全部精力投放到影响圈内,从各种小事开始,许下承诺并予以兑现。学会做照亮他人的蜡烛,而不是评判对错的法官;以身作则,而不是吹毛求疵;解决问题,而不是制造事端 + +◆ 选择的自由加以善用 + +◆ 那些对人性一无所知的人总是妄图通过改变外在而不是内在性情来追求幸福,结果必是徒劳无功,而本来想摆脱的痛苦却会与日俱增 + +◆ 人类的本能就是伪装受害者。除非时刻注意,否则这种倾向就会悄悄潜入,你就会开始因为自己的问题抱怨外界的力量,父母、配偶、上司、天气、政府、环境,以及无论是谁的“那个人” + +◆ 要想获得幸福应该关注你能控制的事情 + +◆ 如何使用资源和主动性“R & + +◆ 放下往事、吸取教训并继续向前,就是展现积极主动最好的方式之一 + +◆ 人类的四种天赋:自我意识(我们能够置身自己之外思考并观察我们的好恶的能力),良知(判断对错的能力),想象力(我们设想新机遇的能力)和独立意志(跳出所有影响因素之外行动的能力)。 + +◆ 只有能够有意识脱离自我,并且审视它,仔细思考你的想法、感觉和情绪,才能有基础用全新的方法去使用想象力、良知和独立意志。你才能真正超脱。你超脱了自己的背景、过去、心理负担 + +◆ 我们的基因、成长环境和苦难影响着我们,但是我不认为它们能决定我们 + +◆ 积极主动还有两个表现。首先,对人生负责;其次,采取行动。就是如此简单,要成为主导者,而不是受害者。不要等着生活对你下手,要对生活出手。成为生活的掌控者,而不是一个乘客。根据设想而活,而不是跟着过去而活。 + +## 习惯二 以终为始——自我领导的原则 + +◆ 许多人拼命埋头苦干,到头来却发现追求成功的梯子搭错了墙,但是为时已晚,所以说忙碌的人未必出成果。 + +◆ 2025/05/24 发表想法 + +先计划再行动,慢不可怕,反覆才最是蹉跎人一生。 + +原文:“以终为始”的一个原则基础是“任何事都是两次创造而成”。我们做任何事都是先在头脑中构思,即智力上的或第一次的创造(Mental/First Creation),然后付诸实践,即体力上的或第二次的创造(Physical/Second Creation)。 + +◆ 设计蓝图代表愿景,整个建筑过程均以它为准绳,因此宁可事先追求尽善尽美,也不要亡羊补牢。 + +◆ 培养出既自律又有责任感的子女,在日常相处中牢记这个目标,不要做出任何有损他们自律或自尊的举动。 + +◆ 2025/05/24 发表想法 + +想要真正摆脱沦为一粒任凭摆布的棋子,甚至弃子的宿命,就需要有搅弄棋局的智慧。 + +原文:有些人自我意识薄弱,不愿主动设计自己的生活,结果就让影响圈外的人或事控制了自己,其生活轨迹屈从于家庭、同事、朋友或环境的压力。 + +◆ 审视各种第一次的创造,并掌控自己的那一部分,即自己撰写自己的剧本。换句话说,习惯一谈的是“你是创造者”,习惯二谈的是“第一次创造”。 + +◆ 2025/05/26 发表想法 + +管理是有效地顺着成功的梯子往上爬,领导则判断这个梯子是否搭在了正确的墙上。管理是正确地做事,领导则是做正确的事。 + +原文:领导与管理就好比思想与行为。管理关注基层,思考的是“怎样才能有效地把事情做好”;领导关注高层,思考的是“我想成就的是什么事业”。 + +◆ 领导与管理就好比思想与行为。管理关注基层,思考的是“怎样才能有效地把事情做好”;领导关注高层,思考的是“我想成就的是什么事业”。 + +◆ 一个人的应变能力取决于他对自己的本性、人生目标以及价值观的不变信念 + +◆ 2025/05/26 发表想法 + +影响圈的四大核心:安全感、人生方向、智慧、力量。智慧需要以安全感与明确的人生方向为基础,力量需要智慧的激发。 + +原文:安全感”(Security):代表价值观、认同、情感的归属、自尊自重与拥有个人的基本能力。 +“人生方向”(Guidance):是“地图”和内心的准绳,人类以此为解释外界事物的理据以及决策与行为的原则和内在标准。 +“智慧”(Wisdom):是人类对生命的认知、对平衡的感知和对事物间联系的理解,包括判断力、洞察力和理解力,是这些能力的统一体。 +“力量”(Power):则指采取行动、达成目标的能力,它是做出抉择的关键性力量,也包括培育更有效的习惯以替代顽固旧习的能力。 +它们相辅相成——安全感与明确的人生方向可以带来真正的智慧,智慧则能激发力量。若四者全面均衡,且协调发展,便能培养高尚的人格、平和的性格与完美的个体。 + +◆ 安全感”(Security):代表价值观、认同、情感的归属、自尊自重与拥有个人的基本能力。 +“人生方向”(Guidance):是“地图”和内心的准绳,人类以此为解释外界事物的理据以及决策与行为的原则和内在标准。 +“智慧”(Wisdom):是人类对生命的认知、对平衡的感知和对事物间联系的理解,包括判断力、洞察力和理解力,是这些能力的统一体。 +“力量”(Power):则指采取行动、达成目标的能力,它是做出抉择的关键性力量,也包括培育更有效的习惯以替代顽固旧习的能力。 +它们相辅相成——安全感与明确的人生方向可以带来真正的智慧,智慧则能激发力量。若四者全面均衡,且协调发展,便能培养高尚的人格、平和的性格与完美的个体。 + +◆ 一个人的安全感一定介于极度不安全和极度安全之间,前者说明你的生活总是被变化莫测的外力所干扰和左右,后者说明你对于自己的真正价值有着清晰而深刻的认识;人生方向也有两个极端,一个是以“社会之镜”及其他不确定的变化性因素为基础,一个是以坚实的内在方向为基础;智慧则一端是完全扭曲事实的错误地图,一端是所有事物和原则都适度关联的正确地图;就力量来说,最低层次是成为别人手中的提线木偶,事事由人,最高层次就是完全依照自己的价值观行事,不受外人和外界的干扰。 + +◆ 为了保护自己,便更加退缩及排斥对方,于是,冷嘲热讽代替了真实的感受。一方总在等待对方采取主动,如果自己没有等到预期的结果,则会确信之前的指责是合理的 + +◆ 以金钱为中心:谁也无法否认金钱的重要性,经济上的安全感也是人类最基本的需求之一。人类的需求等级中,生存基本需要和经济安全感排在第一,如果得不到满足,那么人类的其他需要便难以实现 + +◆ 这些要说明的是,以金钱为中心会给我和我爱的人带来危机 + +◆ 必须靠名利与物质来肯定自我的那些人,必定终日忧心忡忡,患得患失。面对名气、地位或者条件好过自己的人就觉得相形见绌,面对稍逊自己的人又趾高气扬。自我评价和自我认识如此飘忽不定,起落频繁,却还要固执地守住自己的资产、所有物、有价证券、地位和名誉不放 + +◆ 休太长的假,看太多的电影或电视,打太多的电子游戏,长期无所事事,都等于浪费生命,无益于增长智慧,激发潜能,增进安全感或指引人生,只不过制造更多的空虚而已。 + +◆ 敌人为中心的情况似乎闻所未闻,实则相当普遍,只是往往本人不易觉察罢了。当一个人觉得遭到某个在社会或情感层面十分重要的人物(如主管)的不公平待遇后,很容易对其耿耿于怀,并处处作对,这就是以敌人为生活中心。 + +◆ 听任别人控制自己的生活,削弱自己的信心并危害到自己重要的人际关系。 + +◆ 因为没有正确对待自己的责任,才成了一个不负责任的人。 + +◆ 以朋友或敌人为中心的人没有内在的安全感,自我价值变化无常,受制于他人的情绪和行为;人生方向也取决于他人的回应,时时揣摩如何反击;他们的智慧受限于以敌人为中心的偏执心理;毫无力量可言,总是被别人牵着鼻子走 + +◆ 他们的人生方向并非来自良知,而是随波逐流。他们喜欢给别人贴标签,比如说这些人是“积极的”,是“自由派”,那些人是“消极的”,是“保守派”。 + +◆ 宗教也不能长期为人指引人生方向。以宗教为中心的人在礼拜日和工作日的思考或行为方式完全不同,这种不完整的人格会威胁到他们的安全感,需要进一步给别人贴标签和给自己辩护。 + +◆ 市面上盛行的个人成功术无一不是以个人为中心,鼓吹只索取、不付出,却不知狭隘的自我中心观会使人缺乏安全感和人生方向,也不会有智慧及行动力量。这就像是以色列的死海,只有流入,没有流出,于是变得死水一潭。唯有以造福人群、无私奉献为目的追求自我成长,才能在这四方面不断长进 + +◆ 原则是深刻的、实在的、经典的真理,是人类共有的财富。它们准确无误,始终如一,完美无瑕,强而有力,贯穿生活的方方面面。 + +◆ 唯一能制约力量的是原则本身的必然后果。前面说过,我们可以自由选择行动,但无法选择行动的后果——“拾起手杖的一头,也就拾起了手杖的另一头”。 + +◆ 以原则为生活中心的人总是见解不凡,思想与行为也独具一格,而坚实、稳定的内在核心赐予他们的高度安全感、人生方向、智慧与力量,会让他们度过积极而充实的一生。 + +◆ 善用榔头的人往往认为所有东西都是钉子 + +◆ 尽管心灵演练威力无穷,但也必须以品德和原则,而不是以性格魅力为基础才行,否则就会被误用或滥用,尤其容易被用来谋取个人名利。 + +◆ 我的任务是帮助企业建立强大的集体特征和团队文化。 + +◆ 很多次都发现员工的目标和企业目标完全不同。我经常看到奖励系统和声明的价值体系完全不同。 + +◆ 没有参与,就不会投入。 + +◆ 创造一份企业使命宣言需要时间、耐心、参与、技巧和同理心 + +◆ 一份企业使命宣言要真正地反映企业里每个人最大程度的共同愿景和价值,要创造一个伟大的集体和员工巨大的投入。员工的心里和头脑里会有一套参考框架,一套标准或者指导原则,他们就可以自我管理。他们不需要别人的指导、控制、批评或者鄙视。他们已经完全认可企业不变的核心。 + +◆ 100%坚定原则比 98%的时候坚定原则更简单。他总结道,“决定你要代表什么。永远坚定立场。” + +◆ 不要一心想着攀登成功之梯,等爬到顶层才发现这个梯子靠在错误的墙上。 + +◆ 2025/05/27 发表想法 + +永远不要尝试去改变一个人,即便是你的配偶、父母、子女。正确的做法在于发掘对方的潜能,激发对方的自驱力,让对方自己看得明白并有所作为。 + +原文:领导力就是清楚地告诉对方他们的价值和潜力,直到对方能受到鼓舞并自己看到这一点 + +◆ 头脑里出现的你所擅长的事情(自我意识),你感觉自己需要做的事情(良知),如果没有限制你会做的事情(想象力) + +◆ 我们的家是充满欢乐、舒适、学习、朋友、成长和秩序的地方,我们在这里要不断提高自己,成为对世界做出贡献的人。 + +◆ 我们想让他们与别人愉快相处,学会制定目标,解决问题,平衡生活,遵守时间,化解冲突,还能在公园里玩耍。 + +## 习惯三 要事第一 ——自我管理的原则 + +◆ 一旦确定了人生方向,你就应该对自己进行有效的管理,让生活与设想一致 + +◆ 自我管理的实质就是自律和条理,是对计划的实施 + +◆ 2025/05/27 发表想法 + +独立意志 -> 自律和条理 -> 高效 -> 自由。 + +原文:如果你能够成为高效率的自我管理者,那么你的自律就是由内而外形成的,是独立意志的具体表现,你所信奉与追随的就是内在的价值观及在此基础上形成的人生要旨。有了独立意志和诚信人格,你就可以控制自己的感情、冲动以及情绪,服从这些价值观的约束。 + +◆ 克服这种心理还需要有独立意志,愿意为自己所不愿为之事,能够做到在特定时刻始终坚持自己的既定价值观,不屈服于一时的冲动和欲望。 + +◆ 如何分辨轻重缓急与培养组织能力,是时间管理的精髓 + +◆ 2025/05/27 发表想法 + +第四代时间管理法:个人管理。 +所有的时间与事务的安排法则都是为了进一步提升产出与产能,何不直接将重心放在维持产出与产能的平衡上? + +原文:第四代理论出现。与以往截然不同之处在于,它根本否定“时间管理”这个名词,主张关键不在于时间管理,而在于个人管理。与其着重于时间与事务的安排,不如把重心放在维持产出与产能的平衡上 + +◆ 高效能人士总是避免陷入第三和第四象限事务,因为不论是否紧急,这些事情都是不重要的,他们还通过花费更多时间在第二象限事务来减少第一象限事务的数量。 + +◆ 高效能人士的脑子里装的不是问题,而是机会。他们不会在各种各样的问题上浪费时间和精力,他们的思维方式是预防型的,总是能够做到防患于未然。 + +◆ 因为重要,才会使生活大为改观,却因为不够紧急,所以受到忽略。但是只要我们立即着手进行,效能便会大为增进。 + +◆ 只要能确定自己的第二象限事务,而且即知即行,一样可以事半功倍。在时间管理领域称之为帕雷托原则(Pareto Principle) ——以 20%的活动取得 80%的成果。 + +◆ 2025/05/27 发表想法 + +老大的敌人是老二,而非老幺。 + +原文:“最好”的敌人其实是“不错”。 + +◆ 功能决定外观。同样道理,领导决定管理。 + +◆ 第四代理论便在旧有基础上,开创新局面。以原则为中心,配合个人对使命的认知,兼顾重要性与急迫性;强调产出与产能齐头并进,着重第二象限事务的完成。 + +◆ 2025/05/28 发表想法 + +管理时间的目的是管理好生活,不可本末倒置,做一个有原则的人,兼顾重要与紧急,平衡产出与产能。使命必达。 + +原文:以第二象限事务为生活中心的时间管理方法只有一个目标,那就是有效地管理生活。这需要我们有完善的原则,对个人使命有明确的认识,能兼顾重要的和紧急的事情,能平衡产出和产能的关系 + +◆ 2025/05/28 发表想法 + +做事讲“进度”,做人讲“程度”。事做好了,未必对人就好了。不管什么时候人总是比事重要,莫要舍本逐末。 + +原文:对人不可讲效率,对事才可如此。对人应讲效用,即某一行为是否有效。 + +◆ 挫折多来自有所期望,而这期望反映的却是社会价值观,不是个人的价值观 + +◆ 将时间用于第二象限事务,根据原则去认识你的生活,将你的生活建立在原则的基础上,明确表达出你的目标和价值观,并且用这些目标和价值观来指导自己的日常决定。 + +◆ 指令型授权是让别人“去做这个,去做那个,做完告诉我”。 + +◆ 2025/05/28 发表想法 + +责任型授权较之指令型授权的不同之处。 + +原文:充分认可他人的自我意识、想象力、良知以及独立意志。 + +◆ 2025/05/28 发表想法 + +责任型授权要求双方就预期成果、指导方针、可用资源、责任归属、明确奖惩等方面达成清晰、坦诚的共识。以“结果”为中心,而非以“方法”为中心。 + +原文:责任型授权的关注重点是最终的结果。它给人们自由,允许自行选择做事的具体方法,并为最终的结果负责。 + +◆ 责任型授权的关注重点是最终的结果。它给人们自由,允许自行选择做事的具体方法,并为最终的结果负责。 + +◆ 信任是促使人进步的最大动力,因为信任能够让人们表现出自己最好的一面。但这需要时间和耐心,而且还有可能需要对人员进行必要的培训,让他们拥有符合这种信任水平的能力。 + +◆ 因为分得工作的人成为自己的老板,受自己内心良知的指引,努力兑现自己的诺言,达到既定的目标。同时,这种方法还能释放其创造能力,激励他在正确原则的基础上尽一切可能达到既定的目标。 + +◆ 建立以第二象限事务为中心的思维方式,就能提高安排生活的能力,能够真正做到要事为先,言出必行。从此,就可以有效管理自己的生活,不必再求助于其他任何人或任何事情。 + +◆ 从整个历史角度而言,社会地位总是根据你有多少空闲时间决定的 + +◆ 工厂生产车间、农场里很容易衡量工作效率,但是却没有很好的衡量脑力劳动者工作效率的标准。因此很大程度上要依靠工作时间和办公室里的见面时间去衡量工作的努力程度 + +◆ 第一象限是拖延症。在这里花费太多时间的结果就是压力、焦虑、精疲力尽、工作表现欠佳 + +◆ 第三象限我称之为“来者不拒”。就是面对以下这些情况时总是很难说不,比如任何紧急的需要做的事情、会让人忙得不可开交但是却没有什么重要成果的事情 + +◆ 第四象限里的人数应该很多。请来看看“懒惰”。任何一种事做得太多都会成为第四象限里的人。是的,放松休息或者看看好的电影都是健康的生活方式。但是如果看完一部又接着看第二部、第三部,就是浪费时间,而且会造成负罪感和消极 + +◆ 第二象限代表着高质量。这里都是“优先处理” + +◆ 2025/05/28 发表想法 + +划下道道,不要狡辩了。 + +原文:花在第二象限的时间,回报指数非常高,花在第一象限的时间只能收支平衡,花在第三和第四象限的时间则是血本无归。 + +◆ 弥补第三象限的损失就是开始说不。学会不要立即回复每一封发给你的邮件和信息。学会不要填写没人会看的报告。学会说不的关键是内心有一个大大的肯定,能够不断激励自己。区分你擅长做的几件事,然后对别的事情说不。请记住,“最好的”敌人就是“还不错”。 + +◆ 我希望你能够成功地说不,这样你就能对重要的人和事情说“可以”。 + +## 人际关系的本质 + +◆ 独立是互赖的基础。缺乏独立人格,却一味玩弄人际关系的技巧,纵使得逞于一时,也不过是运气罢了。处顺境之中,还可任你为所欲为,但天有不测风云,一旦面临逆境,技巧便不可靠了。 + +◆ 反之,粗鲁、轻蔑、威逼与失信等等,会减少情感账户的余额,到最后甚至透支,人际关系就得拉警报了 + +◆ 牢记一点:速战速决是不切实际的,建立和维护关系都需要时间。如果因为他反应冷淡或者不以为然就不耐烦起来,那就是前功尽弃。 + +◆ 如果你重视一个人,那么必须同样重视他所重视的事情 + +◆ 如果没有明确的期望,人们就会变得感情用事,原本简单的小误会也会变得很复杂,原本很小的事情也会导致严重的冲突和人身攻击,最终不欢而散。 +正确的做法是一开始就提出明确的期望,让相关的每一个人都了解。要做到这一点需要投入很多的时间和精力,不过事实会向你证明,这样做会省去你将来更多的麻烦和周折。 + +◆ 每当我对他人反应过激或者不耐烦、不客气的时候,他就会一脸无辜,亲昵地看着我的眼睛问:“爸爸,你爱我吗?”他想知道爸爸的这种一反常态会不会也发生在他身上 + +◆ 诚信还意味着不欺骗、不使诈和不冒犯 + +◆ 2025/05/28 发表想法 + +这里该如何防止人得寸进尺?内心足够强大,并让他感受到你的强大,而非虚张声势的软弱。 + +原文:这种勇气并非人人具备,只有坚定自持、深具安全感的人能够做到。缺乏自信的人唯恐道歉会显得软弱,让自己受伤害,使别人得寸进尺 + +◆ 真诚的道歉是一种感情投资,但是一再道歉就显得不真诚,会消耗你的情感账户,最终会通过人际关系的质量反映出来。一般来说,人们可以容忍错误,因为错误通常是无心之过。但动机不良,或企图文过饰非,就不会获得宽恕 + +◆ 2025/05/28 发表想法 + +高尚的人格是维系一对一关系的基础,玩弄技巧是将人当傻瓜的表现。 + +原文:一对一的关系是人生最基本的要素,有赖高尚的人格来维系,只有管理众人的技巧是不够的。 + +◆ 在互赖关系中,问题就代表机会——增加情感账户存款的机会 + +◆ 在相互依赖的环境里,如果认识到产出/产能平衡是效能的要素,我们就可以把问题看作是提高产能的机会 + +◆ 写出三件你觉得对方会认可为存款的事情,确定你怎样去完成这些存款 + +## 习惯四 双赢思维——人际领导的原则 + +◆ 寄希望于一些技巧、计划或者措施。 +结果是治标不治本,只关注态度和行为无异于隔靴搔痒,关键是要建立一种能突出合作价值的信息和奖励机制,激励个人和部门创造佳绩。 + +◆ 秉持这种信念的人习惯于利用地位、权势、财力、特权或个性来达到目的。 + +◆ 诚然,在竞争激烈和信任薄弱的环境里,我们需要赢/输模式。但是竞争在生活中只居少数,我们不需要每天都和配偶、孩子、同事、邻居、朋友竞争。“你和爱人谁说了算(谁是赢家)?”这是一个很荒唐的问题,如果没有人赢,那就是两个都输 + +◆ 现实生活需要相互依赖,而不是单枪匹马,你的很多梦想都需要通过与他人合作才能实现,而赢/输模式是这种合作的最大障碍。 + +◆ 2025/05/29 发表想法 + +要有稳住局面保持双赢的心智,而非一味放任,或是无法忍受时的强势“利己”。 + +原文:当他们无法忍受混乱无序、缺乏目标、纪律松散的状态的时候,就会倾向于赢/输模式,之后随着内疚感日增,又会回到输/赢模式,而新一轮的愤怒与挫败感再次将他们推向赢/输模式 + +◆ 如果他真的抱着双赢的态度,就会多与业主交流,听取意见,并有勇气表达自己的观点,直到结果让双方都满意。 + +◆ 心中留有退路,顿觉轻松无比,更不必耍手段、施压力,迫使对方就范。坦诚相见,更有助于发掘及解决问题。即使买卖不成,仁义尚在,或许日后还有合作的机会 + +◆ 2025/05/29 发表想法 + +退出机制,如非双赢,好聚好散。 + +原文:经验表明,在家族式或者建立在友谊基础上的生意启动之前,最好先就“不能双赢就好聚好散”这一点达成协议,这样事业的繁荣才不会导致关系的破裂 + +◆ 经验表明,在家族式或者建立在友谊基础上的生意启动之前,最好先就“不能双赢就好聚好散”这一点达成协议,这样事业的繁荣才不会导致关系的破裂 + +◆ 2025/05/29 发表想法 + +敢作敢为与善解人意之间的平衡状态。 + +原文:成熟就是在表达自己的情感和信念的同时又能体谅他人的想法和感受的能力。 + +◆ 如果你认真研究那些用于招聘、升职以及培训的心理测试,就会发现不管它们的主题是个人意志/同理心平衡,还是自信/尊重他人平衡,亦或是关心人/关心任务平衡,其目的都是考察成熟度;而那些沟通分析和管理方式训练术语或评语也是在衡量一个人在敢作敢为与善解人意之间的平衡能力。 + +◆ 2025/05/29 发表想法 + +双赢的品格基础:成熟。 + +原文:双赢模式要求你不但要温和,还要勇敢,不但要善解人意,还要自信,不但要体贴敏感,还要勇敢无畏。做到这些,在敢作敢为与善解人意之间找到平衡点,才是真正的成熟,这是双赢的基础。 + +◆ 因为我们彼此信任,所以才能坦诚相待,不管看法是否一致。不论哪一方阐述什么样的观点,另一方都会洗耳恭听,力求知彼解己(习惯五)后共同寻找第三条道路,这种协作的解决办法让彼此都受益。 + +◆ 2025/05/29 发表想法 + +转换式领导:坚持真诚、积极投入 -> 扩大影响圈 -> 转换人际关系;这是「交易式领导」的升华。 + +原文:你对双赢的态度越坚持,越真诚,越积极,越投入,你对他人的影响力就越大。这是对人际领导能力的真正考验,它超越了交易式(Transactional)领导的范畴,升华至转换式(Transformational)领导的层面,后者能让个人和关系发生转变。 + +◆ “恶意服从”——依你指示行事,但绝不多做,对结果毫不负责。 + +◆ 没有双赢品德和双赢关系作为后盾,书面协议就形同虚设。只有真诚的感情投资,才能有助于实现双赢。 + +◆ 关系确立之后,就需要有协议来说明双赢的定义和方向,这种协议有时被称为“绩效协议”或“合作协议”,它让纵向交往转为水平交往,从属关系转为合作关系,上级监督转为自我监督 + +◆ 2025/05/29 发表想法 + +这是责任型授权的完整执行逻辑:在具备双赢品格与双赢关系的基础上,拟定双赢协议,即预期结果、指导方针、可用资源、任务考核、奖惩机制。 +接下来只要扮演好协助与考核的角色就好。 + +原文:在双赢协议中,对以下五要素应该有明确的规定: +预期结果:确认目标和时限,方法不计。 +指导方针:确认实现目标的原则、方针和行为限度。 +可用资源:包括人力、财力、技术或者组织资源。 +任务考核:建立业绩评估标准和时间。 +奖惩制度:根据任务考核确定奖惩。 + +◆ 自我评估更能激励人上进。在高度信任的文化氛围里,自我评估的结果更精确,因为当事人往往最清楚实际进度,自我洞察远比旁人的观察和测量要准确 + +◆ ,由受训者本人掌握具体的培训过程(可称之为“由受训者控制的培训”)。这就是一种双赢协议,必须首先确认培训的目标和标准,管理人员可以根据这些目标和标准来评判受训人员的成绩。管理人员还必须明确指导方针、可用资源、任务考核和奖惩制度。 + +◆ 其实领导者所要做的就是放手,让有责任心、积极处世以及具有自我领导能力的人独立完成任务 + +◆ 说明个人表现对集体的影响也很重要,例如迟到早退、拒绝合作、违反协议、打压下属、赏罚不明等给公司带来的损失。 + +◆ 双赢必须有相应体系支撑,包括培训、规划、交流、预算、信息、薪酬等,而且所有体系都要建立在双赢原则的基础上。 + +◆ 通常情况下,问题都源于体系,而不是人。再好的人置身于一个糟糕的体系中,也不会有好结果。想赏花就要先浇水。 + +◆ 如果妈妈还不快来叫我们起床的话,我们就要迟到了。 + +◆ 谈判中坚持“原则”,而不是“立场” + +◆ 双赢过程: +首先,从对方的角度看问题。真正理解对方的想法、需要和顾虑,有时甚至比对方理解得更透彻。 +其次,认清主要问题和顾虑(而非立场)。 +再次,确定大家都能接受的结果。 +最后,找到实现这种结果的各种可能路径。 + +◆ 双赢来自诚信、成熟和知足的人格,是高度互信的结果;它体现在能有效阐明并管理人们的期望和成就的协议中;在起支持作用的双赢体系里蓬勃生长;经由必要的双赢过程来实现。 + +◆ 骄傲就是拥有东西不会感到快乐,只有比别人拥有更多才会感到快乐…… + +◆ 在他的领导下,整个公司重新回到这个城市,说:“如果我们在铺设电缆的时候,同时也为其他两三个公司铺设电缆呢?我们可以跟他们收取比平时要少的费用。整个城市也只需要翻开一次。 + +## 习惯五 知彼解己——移情沟通的原则 + +◆ 你的影响力在于你的榜样作用和引导能力,前者源于你的品德,是你的真我,别人的评论或者你希望别人如何看你都没有意义,我在同你的交往中已经清楚了解了你 + +◆ 首先你要有能让他人信任和开怀的人格,在此基础上培养移情聆听(Empathic Listening)的技巧,然后建立情感账户来实现心与心的交流。 + +◆ 大部分人在聆听时并不是想理解对方,而是为了做出回应。这种人要么说话,要么准备说话,不断地用自己的模式过滤一切,用自己的经历理解别人的生活。 + +◆ 我们的聆听通常有层次之分。一是充耳不闻,压根就不听别人说话;二是装模作样,“是的!嗯!没错!”;三是选择性接收,只听一部分,通常学龄前儿童的喋喋不休会让我们采取这种方式;四是聚精会神,努力听到每一个字。但是,很少有人会达到第五个层次,即最高层次——移情聆听。 + +◆ 主动型和回应型聆听是一种技巧,本质是以自我为中心,就算行为没有显露出,动机已经不言而喻,会让说话的人有受辱的感觉。回应型聆听技巧的目的不过是要做出回应,操控对方。 + +◆ 移情聆听是指以理解为目的的聆听,要求听者站在说话者的角度理解他们的思维方式和感受 + +◆ 2025/05/30 发表想法 + +首先让这段关系从情感上得到对方的认同,否则“真情”也只会被看作一种控制、自利、胁迫、屈就。 + +原文:移情聆听还是感情投资的关键,因为只有对方认同,你的投资才有意义,否则就算你费尽心机,对方也只会把它看作是一种控制、自利、胁迫和屈就,结果是情感账户被支取。 + +◆ 请先听听看我是不是真正理解您的立场和对我的提案的顾虑,如果是,再来看一下我的提案是否合适。 + +◆ 要做到先理解别人,先诊断,后开方并不容易。 + +◆ 如果别人感觉不到被你真正理解,你就不具备人际关系的产能,即高额情感账户。 + +◆ 在影响对方之前,你必须先被影响,即真正理解对方 + +◆ 所以说习惯一、二和三是基础,帮你保持核心不变,即以原则为中心,从而平和而有力地应对坚实内心之外的脆弱。 + +◆ 如果你对诊断本身没什么信心,那么也就不会对据此开的药方有信心。 + +◆ 2025/05/31 发表想法 + +四种"自传式回应",阻断人际沟通中的四个坑。 + +原文:价值判断——对旁人的意见只有接受或不接受。 +追根究底——依自己的价值观探查别人的隐私。 +好为人师——以自己的经验提供忠告。 +自以为是——根据自己的行为与动机衡量别人的行为与动机。 + +◆ 2025/05/31 发表想法 + +理解阶段用理性的左脑做逻辑翻译。 + +原文:第二阶段加入解释,完全用自己的词句表达,但仍用左脑的逻辑思维去理解。 + +◆ 第三阶段掺入个人的感觉,右脑发挥作用。此时听者所注意的已不止于言语,也开始体会对方的心情。 + +◆ 运用这四个阶段的方式沟通,不仅能了解对方,更能帮助对方认清自己,勇于表达。再以前面的例子说明。 + +◆ 儿子终于吐露真言,原来他担心阅读程度不如人。此时才是父亲发挥影响力,提供意见的时刻。不过在开导过程中,依然要注意孩子言谈间所传达的信息。若是合理的反应不妨顺其自然,但情绪性反应出现时,必须仔细聆听。 + +◆ 品德指的是你个人的可信度,是人们对你的诚信和能力的认可,是人们对你的信任,是你的情感账户。感情指的是你的移情能力,是感性的,说明你能通过交流迅速理解他人的情感。理性是你的逻辑能力,即合理表达自己的能力。 + +◆ 习惯五会帮助你提升表达的准确度和连贯性。人们会明白,你对介绍的内容十分有把握,而且把显而易见的事实和感知都考虑在内,想要双方都获益。 + +◆ 2025/06/01 发表想法 + +把握能干预的部分,也就是影响圈的事;问题、分歧、环境、他人行为大多是我们干预不到的,勿要被这些耗费了心神。 + +原文:相互依赖环境的很多因素都属于你的关注圈范围,如问题、分歧、环境、他人行为等。如果把精力都放在这些方面,你很快就会精疲力尽,而且收效甚微。 + +◆ 当我们真正做到深入了解彼此的时候,就打开了通向创造性解决方案和第三条道路的大门。我们之间的分歧不再是交流和进步的障碍,而是通往协同效应的阶梯。 + +◆ 当你觉得自己是对的,就很难听进去别人的话。 + +◆ 解决冲突其实并不是同理心倾听的目标,理解对方才是。 + +◆ 习惯四双赢思维是高效关系的基础,或者说是根部。到达终点的路径就是练习习惯五:知彼解己。你练习习惯四和习惯五收获的结果就是习惯六的统合综效。 + +◆ 如果你真正想寻求理解,就要丢掉诡计和伪善。 + +## 习惯六 统合综效——创造性合作的原则 + +◆ 统合综效的基本心态是:如果一位具有相当聪明才智的人跟我意见不同,那么对方的主张必定有我尚未体会的奥妙,值得加以了解。 + +◆ 与所见略同的人沟通,益处不大,要有分歧才有收获。 + +◆ 统一和团结意味着互补,而不是相同。相同毫无创造性可言,而且沉闷乏味。统合综效的精髓就是尊重差异。 + +◆ 动力通常是积极、合理、自觉、符合经济效益的力量;相反地,阻力多半消极、负面、不合逻辑、情绪化、不自觉,具社会性与心理性因素。 + +◆ 2025/06/01 发表想法 + +调解员的身份也挺重要。 + +原文:前一个半小时,由我讲述双赢思维、知彼解己与统合综效等观念 + +◆ 虽然你无法在相互依赖的交往中和统合综效的过程中控制他人的行为模式,但还是有很多事情都在你的影响圈范围内。你自身的统合综效就完全处于你的影响圈内。 + +◆ 不要在意别人的无礼行径,避开那些消极力量,发现并利用别人的优势,提高自己的认识,扩展自己的视野。你应该在相互依赖的环境中勇敢而坦率地表达自己的观点、情感和经历,借此鼓励他人同样地坦诚相待。 + +◆ 尊重人与人之间的差异,当有人不同意你的观点的时候,你应该说:“你跟我有不一样的看法,这很好。” + +◆ 如果你只能看到两种解决问题的途径或道路——你的和“错误”的,那么你可以试着寻找统合综效的第三条道路,一般情况下它总是存在的。如果你坚持双赢模式,确实愿意努力理解对方,你就能找到一种让每一个人都受益更多的解决方案。 + +◆ 不要把你的情绪建立在另一个人的弱点上,与他的强项合作,试着弥补他的弱势,弥补他。 + +◆ 每件激怒我们的事情都能成为让我们理解自己的契机。让我们最烦恼的人也往往是我们最好的老师!凝聚团队是进步,共同合作是成功。 + +## 习惯七 不断更新——平衡的自我提升原则 + +◆ 工作本身并不能带来经济上的安全感,具备良好的思考、学习、创造与适应能力,才能立于不败之地。拥有财富,并不代表经济独立,拥有创造财富的能力才真正可靠。 + +◆ 2025/06/02 发表想法 + +自我提升就是从身体、精神、智力、社会/情感四个方面的正向更新,以便优化自我产能。 + +原文:习惯七就是个人产能。它保护并优化你所拥有的最重要的资产——你自己。它从四个层面更新你的天性,那就是:身体、精神、智力、社会/情感。 + +◆ 2025/06/02 发表想法 + +锻炼时的理想心率状态。 + +原文:最理想的是尝试将心率至少提高到最高脉搏频率的 60%。最高脉搏频率是全身供血时心跳的最高速度,通常等于 220 减去你的年龄。 + +◆ 当你远离城市的喧嚣与混乱,尽情享受过大自然的和谐与韵律,再回到城市时会感到耳目一新 + +◆ 如果我们能够用心把握生活的方向和生命的真谛,就如同得到了一把遮挡风雨的大伞,源源不断地使我们获得新的力量。如果能够持之以恒,效果会更加明显。 + +◆ 2025/06/02 发表想法 + +Inner peace· + +原文:如果你能够在这些战争中获胜,将内心的矛盾和冲突平息下来,就会感到一片祥和,并领悟到生命的真谛。自然而然地,你会取得公众领域的成功,即秉持着合作精神,为他人造福,由衷地为他们的成功感到快乐。 + +◆ 不再认真读书,不再探索身外的新世界,不再用心思考,也不再写作,至少是不再重视写作,不再把它当作对我们准确、扼要表达自己的能力的考验。 + +◆ 积极处世的人有能力摸索出无数种自我教育的方法。 + +◆ “不读书的人跟文盲没什么两样。” + +◆ 磨砺心智的另一种有效方式是写作。通过不断记录自己的想法、经历、深刻见解和学习心得,我们的思路就会更加明晰、准确和连贯。 + +◆ 每天“磨刀”一小时,身体力行,坚持不懈。 + +◆ 每个人都是社会的一面小镜子,反映出身边人的想法、判断和模式,每个人都从镜中获知自己在周围人眼中的形象,而社会之镜是由周围人的舆论、认知和思维决定的。 + +◆ 我们可以选择清晰而真实地反映出他人的形象,肯定他们的积极性和责任心,帮助他们改变行为模式,成为讲原则、懂判断、独立自主、有价值的个体。知足心态让我们意识到,反映他人的正面形象并不会贬低我们自己,反而会使我们更强大,因为它增加了我们与其他积极主动者有效交往的机会。 + +◆ 教师的想法变成了自我实现的预言。 + +◆ 歌德(Goethe)说:“以一个人的现有表现期许之,他不会有所长进。以他的潜能和应有成就期许之,他定能不负所望。” + +◆ 企业的体质就是财务状况;心智涉及人力资源的开发、培养与运用;社会/情感指公关与员工待遇;精神则反映出目标宗旨与原则。企业健全在于这四方面的平衡发展,否则原本有益的助力也有可能成为阻力。 + +◆ 人生的四个层面休戚相关:身体健康有助于心智发展,精神提升有益于人际关系的完满。因此,平衡才能产生最佳的整体效果。 + +◆ 身体层面的自我更新等同于强化个人愿景(习惯一)。它帮助我们增强积极性、自我意识和独立意志,让我们知道自己是自由的,不需要被动地承受他人的行为后果。这也许是锻炼身体的最大好处。 +精神层面的更新等同于强化自我领导(习惯二)。它帮助我们更好地按照想象力和良知(而不只是回忆)行事,深入理解个人思维和价值观,确定核心的正确原则,明确自己在生活中的独特使命,改变思维和行为模式,以及坚持正确原则并利用个人的资源优势。精神层面的更新让个人生活变得更加丰富。 +智力层面的更新等同于强化自我管理(习惯三)。它帮助你在做计划的时候确定属于第二象限事务的重要活动,优先安排能够有效利用时间和精力的目标与活动,然后围绕这些组织并开展活动。不断接受教育帮助你巩固知识基础,增加选择范围。稳定的经济基础并非来自工作,而是来自个人的产能(思考、学习、创造、调整)。真正的经济独立指的不是家财万贯,而是拥有创造财富的能力,这是内在的。 + +◆ 在相互依赖的环境中专注于自己的影响圈,即以知足的心态对待他人,真诚尊重彼此的差异,为他们的成功而感到高兴。 + +◆ 2025/06/02 发表想法 + +一念成佛,一念成魔。 + +原文:一旦具备了自我意识,我们就必须选择自己需要遵循的目标与原则,否则就如真空被慢慢填满一样,自我意识存在的空间会越来越小,并最终消失,而我们就会变成只为生存和繁衍而活着的行尸走肉。这个层次上的人只是在“生存”,而不是“生活”,这种被动消极的状态会让人们意识不到内心深藏和有待开发的独特潜质。 + +◆ 2025/06/02 发表想法 + +让习惯成为自然,而不是一种自我胁迫。 + +原文:请记住,偶尔放纵一下实际上对你有利无害。它会激发内啡肽,可以缓解痛感并对情绪产生有利的影响。它是一种满足,你不必放下自律的武器,只是放松一下。放纵一下有助于控制自己的渴望,而不至于让渴望变为一次狂欢。 + +◆ 我将在周末休息日以外的每个夜晚和我的孩子一起阅读 10 到 15 分钟。 + +◆ 如果你足够勇敢,可尝试寻求反馈意见。询问别人的看法来反思自己的进步。 + +## 再论由内而外造就自己 + +◆ 刺激与回应之间存在一段距离,成长和幸福的关键就在于我们如何利用这段距离。 + +◆ 向子女和他人赠予“翅膀”意味着赠予他们自由,让他们摆脱上一代传承下来的消极的行为模式 + +◆ 在我们的不懈努力下,事情变得可以迎刃而解,这并不是因为任务的性质发生了变化,而是因为我们的能力增强了 + +◆ 绝不要停止探索,因为其目的是回到起点,重新认识。 + +◆ 思维方式是基础。我们花了太多时间修剪态度和行为的叶子,但是很少有时间去打理根部,我们的思维方式、看待世界的角度。你一定要从根本层面解决问题,才能带来真正的改变。 + +◆ 我们不是主宰,原则才是。 + +◆ 无论你能做什么,或者梦想做什么,着手开始吧。 +大胆就是天赋、能量和魔力的代名词。 + +◆ 选择合适和建设性的情绪:愤怒、勇敢、幽默、同情、悲伤或其他。只要你仍能控制自己,仍能勉强应付局面,那任何情绪都没关系。 + +◆ 要避免平庸、停滞和自满,需要强大的积极性、愿景和自律,而且只有当你愿意付出必要的努力达成个人的成功之后,才可能做到。 + +◆ 家庭中的成功与和谐要高于其他-一切 + +## 后记 答读者问 + +◆ 正直是比忠诚更高层次的价值观。 + +◆ “七”并不神圣,只不过先有三个个人领域成功的习惯(选择的自由、选项的自由、行动的自由),然后是三个公众领域成功的习惯(尊重、理解、创造),接着是一个补充性的习惯,加起来就是七个。 + +◆ 习惯一指的是你可以拥有和选择一个价值观体系;习惯二指的是价值观体系的备选项或具体内容;习惯三指的是遵循这些价值观。它们是非常基本、普遍和相互联系的。 + +◆ 真正形成比较一致的、全面而合理的双赢契约。 + +◆ 一是以身作则,二是建立充满关怀和欣赏的关系,三是用孩子的语言教给他们这些习惯中蕴含的简单理念——帮助他们掌握七个习惯的基本含义和词汇,告诉他们怎样利用原则来分析自己的经历,让他们识别生活中出现的特定原则和习惯。 + +◆ 只有当他们知道你对他们有多关心时,他们才会关心你知道的有多多。请以可信赖的人格榜样为基础,和他们建立信任、坦诚的关系,然后和他们分享“七个习惯”对你的帮助。让他们在你的生活中看到鲜活的“七个习惯” + +◆ 围绕一套有序而均衡的原则创办有关领导和管理才能的综合培训项目 + +◆ 首先,如果他们所说的内容以原则或自然法则为基础,我就愿意向他们求教,并且加以推介;其次,我要说,我们也许是在用不同的措辞表述相同的基本原则或自然法则。 + +## 附录 + +◆ 大多数“产出”活动属于第一象限事务的范畴,大多数“产能”活动属于第二象限事务的范畴。管理好第一象限事务的唯一途径就是重视第二象限事务,而最重要的就是未雨绸缪和抓住机遇,同时要有勇气对第三和第四象限事务的活动说“不”。 + +◆ 这些会议通常是会而不议,议而不决,只有负责人的虚荣心得到了满足 + +◆ 发言的主题是:每次会议须制订明确的目标与完善的议程,让所有与会者有机会献言献策。 + +◆ 因为涉及的对方可能具有第一象限事务的文化,找你的人可能想要你本人(而不是代办者)回电话 + +◆ 致力于解决长期性的隐痛,同时用第一象限事务的方法解决眼下的问题。 + +◆ 从第二象限事务为中心的思维出发,你还可以训练秘书与销售部门联系,有要事才向你报告。或许你有必要让销售经理及其主要下属明白,你的首要职责是领导而不是管理。他们慢慢会明白,与秘书打交道,其实能更妥善地解决问题。这样你就能解放出来,专注于第二象限事务的领导工作。 + +◆ 第一类的事件可由此而大幅减少,变得比较易于处理。这样你就不会时时处于压力过大的危机氛围,也就不会对你的判断力和健康造成消极影响。 + +柯维家族致一位高效能的父亲 + +◆ 在生命的长河中,个人或者企业想要保持成功,唯一的方法就是以原则为中心地生活。 + +◆ 生活是使命而不是职业 + +◆ 领导力就是清晰地指出别人的价值和潜力,使对方受到鼓舞从而有所意识 diff --git "a/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232Bigtable \345\272\224\347\224\250\350\256\276\350\256\241.md" "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232Bigtable \345\272\224\347\224\250\350\256\276\350\256\241.md" new file mode 100644 index 000000000..9485a7711 --- /dev/null +++ "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232Bigtable \345\272\224\347\224\250\350\256\276\350\256\241.md" @@ -0,0 +1,136 @@ +## 使用 Bigtable(HBase) 做一款云笔记的存储介质,存储表(结构)应该如何设计? + +设计一个云笔记的存储表(结构)时,使用 Bigtable(基于 HBase 的技术)时需考虑数据的读写模式、查询需求及数据架构。以下是一个基本的设计方案。 + +### 1. 表结构设计 + +#### 表名 + +假设你的表名为 `notes`。 + +#### 列族 + +可以定义一列族,如下: + +- **content**:用于存储笔记的主要内容。 +- **metadata**:用于存储笔记的元数据(如标题、创建时间、最后修改时间、标签等)。 + +### 2. 行键 + +行键的设计非常重要,它会影响数据检索的效率。可以使用以下设计: + +- `user_id#note_id`(比如 `user123#note456`):这样做可以确保每个用户的笔记是有序的,同时通过 `user_id` 可以快速检索某个用户的所有笔记。 + +### 3. 列设计 + +以下是具体的列设计示例: + +- **列族:content** + + - `text`:存储笔记的内容。 + +- **列族:metadata** + - `title`:存储笔记的标题。 + - `created_at`:存储笔记创建时间(可以使用时间戳)。 + - `updated_at`:存储笔记最后更新时间(可以使用时间戳)。 + - `tags`:存储与笔记相关的标签(可以用逗号分隔的字符串或其他数据结构)。 + +### 4. 示例表结构 + +如下所示的表结构定义: + +``` +Table: notes + +Row Key: user_id#note_id +----------------------------------------------- +| Column Family: content | +----------------------------------------------- +| text: "My first note..." | +----------------------------------------------- + +----------------------------------------------- +| Column Family: metadata | +----------------------------------------------- +| title: "First Note" | +| created_at: "2023-10-01T10:00:00Z" | +| updated_at: "2023-10-02T10:00:00Z" | +| tags: "personal, work" | +----------------------------------------------- +``` + +### 5. 查询模式 + +#### 常见查询场景: + +1. 获取特定用户的所有笔记。 +2. 根据标题或标签搜索笔记。 +3. 获取特定笔记的详细信息。 + +### 6. 数据模型迭代 + +根据使用需求和用户反馈,你可能需要对表结构进行迭代。例如,增加新的列族,或者对现有列进行更改。 + +### 总结 + +Bigtable(HBase)的设计应该根据访问模式来优化。在云笔记的例子中,上述设计可以支持高效的读写操作,并能满足常见查询需求。在实际设计时,需要依据具体的业务需求可能会对结构进行调整。 + +## Bigtable(HBase) 的 rowkey 使用 Hash 值合适吗? + +使用 Hash 值作为 Bigtable (HBase) 的 row key 有其优缺点,适合某些场景,但也存在潜在的风险。以下是一些考虑因素: + +### 优点 + +1. **均匀分布**:Hash 值通常能够提供数据均匀分布,避免了热点(hotspot)问题。在某些情况下,如果行键是顺序引入的,可能会导致大量写入集中在特定的区域,妨碍写入性能。 + +2. **快速查找**:如果你知道要查询的具体数据,Hash 值能提供快速的查找能力。 + +### 缺点 + +1. **不易理解**:Hash 值通常是不可读的,调试和人工检查困难。对于需要手动管理或排查问题的场景,使用可读的行键更有利。 + +2. **群组查询问题**:如果业务逻辑需要基于某种字段(例如用户 ID 或时间戳)进行范围查询,使用 Hash 值会破坏这些逻辑的可行性。由于 Hash 值并不能保持任何特定顺序,多维度的查询或聚合会变得复杂。 + +3. **重复 Hash 碰撞**:在特定情况下,哈希算法可能会导致碰撞,这意味着不同的输入可能会生成相同的输出。这可能会导致数据丢失或覆盖。 + +### 适合的使用场景 + +- 如果你面对的是高写入频率且不引入顺序的场景(例如日志数据),使用 Hash 值作为行键是合适的。 +- 如果你的查询主要是基于行键的精确查找,Hash 值可取。 + +### 结论 + +总的来说,是否使用 Hash 值作为 row key 需根据具体的应用场景和需求来决定。如果你的应用主要侧重于高效的写入和查询,且不需要顺序查询,使用 Hash 值可能是合适的。但如果你的应用需要明晰的业务逻辑和顺序查询,可能需要考虑其他形式的 row key 设计。 + +## Bigtable 中一个列族可以有多个不同列的好处是? + +在 Google Cloud Bigtable 中,一个列族可以有多个不同的列,具有多方面的好处: + +### 1. 数据组织灵活性 + +- **动态列**:Bigtable 的列是动态的,您可以在同一个列族中存储不同的列。这种灵活性使得数据模型能够根据需要演变,而不必进行严格的模式定义。 +- **自定义结构**:这使得设计更贴合您的业务需求,可以方便地对数据进行不同方式的组织。 + +### 2. 提高存储效率 + +- **节省空间**:将不同的列放在同一个列族中,可能会减少存储开销,因为在同一列族内,可以共享存储结构和元数据。 +- **数据压缩**:同一列族中的数据特性相似,有助于进行更有效的压缩,进一步减少存储需求。 + +### 3. 查询性能 + +- **列族级别的读写优化**:因为同一列族的列通常会一起被读取或写入,Bigtable 可以优化对同一列族的访问,从而提高性能。 +- **选择性查询**:用户只需查询特定列族中的相关列,而不必扫描整个表,这样可以提高查询速度和效率。 + +### 4. 隔离和权限管理 + +- **权限控制**:列族可以根据业务需求进行权限控制,确保只有经过授权的用户才能访问某些列,从而加强数据安全性。 +- **逻辑分组**:将相关的数据放在同一列族中,有助于实现更好的逻辑分层和文档化。 + +### 5. 支持复杂的用例 + +- **多版本数据**:Bigtable 支持为同一列保留多个版本,这使得在同一列族中存储不同列成为一种容易实现的解决方案,适用于历史记录和版本跟踪的场景。 +- **丰富的数据模型**:通过同一列族中的不同列,您可以实现更加复杂的数据模型,轻松适应不同的数据类型和关系。 + +### 总结 + +在 Bigtable 中,一个列族可以有多个不同列的设计提供了数据组织的灵活性、存储效率的提升、查询性能的优化和安全性的增强。这种灵活性使得 Bigtable 特别适合处理大规模、变化频繁的数据,尤其是在大数据和实时分析的应用中。 diff --git "a/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232Database \350\203\275\345\212\233\350\257\204\344\274\260.md" "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232Database \350\203\275\345\212\233\350\257\204\344\274\260.md" new file mode 100644 index 000000000..152acf90d --- /dev/null +++ "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232Database \350\203\275\345\212\233\350\257\204\344\274\260.md" @@ -0,0 +1,18 @@ +## 在 PostgreSQL 中,对于经常需要进行小批量读写操作的表,以单表进行支持的数据量瓶颈一般是多少? + +在 PostgreSQL 中,单表支持的数据量瓶颈受到多个因素的影响,具体包括: + +1. **表的大小**: PostgreSQL 默认限制单个表的最大大小为 32 TB(TB = Terabyte),但可以通过配置调整。 +2. **行数**: 虽然没有明确的行数限制,但行数会影响查询性能。随着行数增加,性能可能下降,尤其是依赖于索引的查询。 +3. **查询性能**: 随着表的增长,数据检索、插入或更新的速度可能会减慢。这通常与数据页的 I/O 操作有关。 +4. **索引**: 索引的数量和类型会影响性能。过多的索引可能会导致插入和更新操作变慢,但良好的索引可以加速查询。 +5. **硬件**: 硬件配置(如 CPU、内存和存储类型)对处理能力有直接影响。SSD 通常提供更好的性能。 +6. **并发操作**:PostgreSQL 支持高并发,但过多的并发读写操作可能会导致性能瓶颈,尤其是在高争用的环境中。 +7. **VACUUM 和 ANALYZE**:数据的插入、更新和删除会产生死元组,使用 `VACUUM` 命令定期清理和优化表可以改善性能。 + +### 总结 + +- **一般建议**:当数据接近几百万到几千万行时,考虑分片、分区或归档旧数据以维护性能。如果单表大小不断增加并导致性能下降,建议进行索引优化、查询重构或考虑表的分区。 +- **性能监测**:建议在实际场景中进行性能监测和负载测试,以确定系统的实际瓶颈和限制。 + +综合来说,虽然 PostgreSQL 在理论上支持数 TB 数据量的单表,但在处理高并发、频繁的小批量读写操作时,性能瓶颈和维持高效率往往取决于具体的使用模式和数据库的配置。 diff --git a/articles/practice/working/_temp.md "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232\345\205\250\346\226\207\346\243\200\347\264\242\357\274\210PostgreSQL\357\274\211.md" similarity index 77% rename from articles/practice/working/_temp.md rename to "articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232\345\205\250\346\226\207\346\243\200\347\264\242\357\274\210PostgreSQL\357\274\211.md" index ca50f406f..6893d2928 100644 --- a/articles/practice/working/_temp.md +++ "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232\345\205\250\346\226\207\346\243\200\347\264\242\357\274\210PostgreSQL\357\274\211.md" @@ -323,4 +323,90 @@ FROM ### 结论 -开窗函数在分析数据、计算排名、生成累计和等方面非常有用。如果需要对数据进行更复杂的分析,开窗函数提供了灵活且强大的方式来实现。 \ No newline at end of file +开窗函数在分析数据、计算排名、生成累计和等方面非常有用。如果需要对数据进行更复杂的分析,开窗函数提供了灵活且强大的方式来实现。 + +## 详解 PostgreSQL 中的 to_tsquery() + +`to_tsquery()` 是 PostgreSQL 中的一个函数,用于将输入的文本查询转换为一种可以在全文搜索中使用的查询格式。它是全文搜索功能的关键组成部分,允许用户执行复杂的搜索操作。下面详细介绍其功能、语法和使用示例。 + +### 1. 功能 + +`to_tsquery()` 用于创建一个可以与全文搜索数据类型(如 `tsvector`)进行比较的查询表达式。它的主要功能包括: + +- 支持与布尔运算符(如 AND、OR、NOT)结合使用。 +- 自动处理词干提取(stemming),比如将 "running" 和 "run" 视为相同的词。 +- 支持支持通配符查询。 + +### 2. 语法 + +```sql +to_tsquery(query_string) +``` + +- **`query_string`**:传入的文本字符串,表示搜索条件。此字符串可以包含词语和布尔操作符。 + +### 3. 查询操作符 + +- **`&`**:AND 操作符,表示必须匹配两个词。 +- **`|`**:OR 操作符,表示至少匹配一个词。 +- **`!`**:NOT 操作符,用于排除某个词。 +- **`'`**(单引号):用于指定要搜索的具体词(或词组)。 + +### 4. 示例 + +以下是一些使用 `to_tsquery()` 的示例: + +#### 示例 1:基本搜索 + +```sql +SELECT * FROM documents +WHERE to_tsvector(text_column) @@ to_tsquery('hello'); +``` + +这个查询将返回所有包含单词 "hello" 的文档。 + +#### 示例 2:布尔搜索 + +```sql +SELECT * FROM documents +WHERE to_tsvector(text_column) @@ to_tsquery('hello & world'); +``` + +此查询将返回同时包含 "hello" 和 "world" 的文档。 + +#### 示例 3:使用 OR 运算符 + +```sql +SELECT * FROM documents +WHERE to_tsvector(text_column) @@ to_tsquery('hello | world'); +``` + +这个查询将返回包含 "hello" 或 "world" 的文档。 + +#### 示例 4:使用 NOT 运算符 + +```sql +SELECT * FROM documents +WHERE to_tsvector(text_column) @@ to_tsquery('hello & !world'); +``` + +此查询将返回包含 "hello" 但不包含 "world" 的文档。 + +#### 示例 5:词干提取和通配符 + +```sql +SELECT * FROM documents +WHERE to_tsvector(text_column) @@ to_tsquery('run:*'); +``` + +这个查询将返回包含任意以 "run" 开头的词(如 "running", "runner")的文档。 + +### 5. 注意事项 + +- `to_tsquery()` 需要与 `to_tsvector()` 一起使用,以便比较搜索条件和文档内容。 +- 对于复杂的查询,输入字符串的格式需要正确。例如,`to_tsquery('a & b')` 意味着同时包括 "a" 和 "b"。 +- 如果输入字符串中包含空格,PostgreSQL 会将其视为布尔操作符的边界,可能会影响查询结果。 + +### 总结 + +`to_tsquery()` 是 PostgreSQL 中进行全文搜索的重要工具,提供了强大的功能来支持复杂查询。通过适当的使用,您可以实现灵活而高效的文档搜索。 diff --git "a/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232\345\217\202\346\225\260\345\214\226\345\244\204\347\220\206\357\274\210PostgreSQL\357\274\211.md" "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232\345\217\202\346\225\260\345\214\226\345\244\204\347\220\206\357\274\210PostgreSQL\357\274\211.md" new file mode 100644 index 000000000..5ff4896ea --- /dev/null +++ "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232\345\217\202\346\225\260\345\214\226\345\244\204\347\220\206\357\274\210PostgreSQL\357\274\211.md" @@ -0,0 +1,232 @@ +## SQLAlchemy 中 cursor.execute 如何参数化给 SQL 传参(参数可能存在特殊字符) + +在 SQLAlchemy 中,使用参数化查询来防止 SQL 注入,同时处理特殊字符是非常重要的。通常情况下,您应该使用占位符 (`?` 或 `:param`) 进行参数绑定,而不是直接拼接字符串。这样可以确保查询的安全性。 + +以下是如何在 SQLAlchemy 中使用 `cursor.execute` 进行参数化查询的示例: + +### 1. 创建数据库连接和游标 + +首先,您需要创建一个数据库连接和游标: + +```python +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +# 创建数据库引擎 +engine = create_engine('your_database_url') + +# 创建会话工厂 +Session = sessionmaker(bind=engine) +session = Session() +``` + +### 2. 使用参数化的查询 + +然后,您可以使用参数化的方式来执行查询。例如: + +```python +query = "SELECT * FROM your_table WHERE column_name = :value" +value = "some_value_with_special_characters'" + +# 使用 session.execute 执行参数化查询 +result = session.execute(query, {'value': value}) + +for row in result: + print(row) +``` + +### 3. 使用事务(可选) + +如果您在执行写操作(如 INSERT、UPDATE)时,应确保使用事务: + +```python +with session.begin(): # 开始一个事务 + update_query = "UPDATE your_table SET column_name = :new_value WHERE id = :id" + new_value = "new_value_with_special_characters'" + id_value = 1 + + session.execute(update_query, {'new_value': new_value, 'id': id_value}) +``` + +### 4. 关闭会话 + +执行完查询后,确保关闭会话: + +```python +session.close() +``` + +### 总结 + +通过使用占位符和参数字典,SQLAlchemy 能够安全地处理特殊字符,防止 SQL 注入。这种参数化的方法不仅提高了代码的安全性,还使得代码在处理动态查询时更加清晰和易于维护。 + +## 如何对 query 进行参数化处理 + +对查询进行参数化处理是确保 SQL 查询安全性和有效性的关键步骤,通常可以通过以下方法实现: + +### 1. 使用占位符 + +SQLAlchemy 和大多数数据库库支持使用占位符对参数进行安全描述。在这个过程中,可以使用 `%s`(对于 PostgreSQL)或 `?`(对于 SQLite)来表示参数。这些占位符将会被用户提供的输入安全地替换。 + +### 示例 + +以下是如何处理参数化查询的示例: + +#### PostgreSQL 示例 + +```python +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +# 创建数据库引擎 +engine = create_engine('postgresql://user:password@localhost/mydatabase') + +# 创建会话工厂 +Session = sessionmaker(bind=engine) +session = Session() + +query = "your search term with special characters" + +# 参数化查询 +sql = """ +SELECT meta, text +FROM your_table +WHERE to_tsvector(text) @@ plainto_tsquery(%s) +ORDER BY ts_rank(to_tsvector(coalesce(text, '')), to_tsquery(%s)) DESC +LIMIT 10 +""" + +# 执行参数化查询 +with session.begin(): + result = session.execute(sql, (query, query)) + +for row in result: + print(row) + +session.close() +``` + +#### SQLite 示例 + +```python +import sqlite3 + +# 创建数据库连接 +conn = sqlite3.connect('your_database.db') +cur = conn.cursor() + +query = "your search term with special characters" + +# 参数化查询 +sql = """ +SELECT meta, text +FROM your_table +WHERE text LIKE ? +""" + +# 执行参数化查询 +cur.execute(sql, (f"%{query}%",)) + +rows = cur.fetchall() +for row in rows: + print(row) + +conn.close() +``` + +### 2. 特殊字符处理 + +通常情况下,使用占位符和参数绑定会安全地处理输入中的特殊字符(如引号、百分号等),防止 SQL 注入攻击。 + +### 3. 额外措施 + +如果需要处理特定的 SQL 特性(如全局匹配、通配符等),确保在参数化时使用正确的格式。例如,对于 LIKE 查询,可以在参数字符串中添加通配符。 + +### 总结 + +通过参数化查询,您可以有效地保护您的数据库安全,防止 SQL 注入,并确保即使输入中有特殊字符也能正常工作。确保使用占位符和参数元组是一个最佳实践。这样不但提高了安全性,也使得代码更加简洁易读。 + +## 异常处理 + +`Exception: syntax error at or near ":" LINE 1: ...\_rank(to_tsvector(coalesce(text, '')), to_tsquery(:query)) AS ...` + +```sql +with self._get_cursor() as cur: + cur.execute( + f"""SELECT meta, text, ts_rank(to_tsvector(coalesce(text, '')), to_tsquery(:query)) AS score + FROM {self.table_name} + WHERE to_tsvector(text) @@ plainto_tsquery(:query) + ORDER BY score DESC + LIMIT {top_k}""", + # f"'{query}'" is required in order to account for whitespace in query + # (f"'{query}'", f"'{query}'"), + {"query": query}, + ) +``` + +您的问题出现在 SQL 查询中,PostgreSQL 不支持用命名参数(如 `:query`)直接在字符串中使用。相反,您应该使用占位符 `%s` 来进行参数化。具体来说,您可以通过以下方式修复问题: + +### 修复后的代码 + +```python +with self._get_cursor() as cur: + cur.execute( + f"""SELECT meta, text, ts_rank(to_tsvector(coalesce(text, '')), to_tsquery(%s)) AS score + FROM {self.table_name} + WHERE to_tsvector(text) @@ plainto_tsquery(%s) + ORDER BY score DESC + LIMIT {top_k}""", + (query, query), + ) +``` + +### 关键修改点 + +1. **占位符**: + + - 将 `:query` 替换为 `%s`。这是用于参数化查询的标准占位符。 + +2. **参数传递**: + - 将参数以元组的形式传递给 `execute` 方法 `(query, query)`。 + +### 注意事项 + +- 确保 `query` 的内容经过适当处理(例如,转义特殊字符),以防止 SQL 注入攻击。 +- 如果需要在 SQL 查询字符串中进行动态插值(如表名或其他结构),确保这部分代码是安全的,不会导致 SQL 注入。如果这个动态内容是用户输入的,那么还是应该谨慎处理。 + +通过这个修改,您的查询应该可以正常执行,而不会引发语法错误。 + +## to_tsquery 的参数中存在单引号,该如何传参? + +在 PostgreSQL 中,如果您在 `to_tsquery()` 的参数中需要包含单引号(`'`),可以通过使用双单引号(`''`)来转义单引号。这个方法可以让 PostgreSQL 正确解析包含单引号的字符串。 + +### 示例 + +假设您想要搜索包含 "it's" 的文档,您可以这样传递参数: + +```sql +SELECT * FROM documents +WHERE to_tsvector(text_column) @@ to_tsquery('it''s'); +``` + +在这个例子中, + +- `it''s` 表示单词 "it's"。 +- 将单引号进行了转义。 + +### 参数化查询示例 + +如果您在使用参数化查询(比如使用 Python 的 SQLAlchemy),您可以这样做: + +```python +query = "it''s" # 用双单引号表示 +sql = "SELECT * FROM documents WHERE to_tsvector(text_column) @@ to_tsquery(%s)" + +# 执行查询 +cur.execute(sql, (query,)) +``` + +### 总结 + +- 在 `to_tsquery()` 中使用单引号时,使用双单引号(`''`)来转义。 +- 用参数化方式传递时,确保在 Python 字符串中正确转义,紧接着将其角色正确传递给 SQL 查询。 diff --git "a/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232\345\274\202\345\270\270\345\244\204\347\220\206.md" "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232\345\274\202\345\270\270\345\244\204\347\220\206.md" new file mode 100644 index 000000000..7f28f6f10 --- /dev/null +++ "b/articles/practice/database/_\346\225\260\346\215\256\345\272\223\346\240\270\345\277\203\346\212\200\346\234\257\357\274\232\345\274\202\345\270\270\345\244\204\347\220\206.md" @@ -0,0 +1,127 @@ +## 什么是会话泄露 + +会话泄露(Session Leak)指的是在应用程序中,由于未能正确释放或关闭数据库会话(Session),导致这些会话长时间未被回收,从而引发多个问题,包括可用会话耗尽、性能下降和错误等。 + +### 会话泄露的典型表现 + +1. **错误提示**:在使用数据库时,可能会出现诸如 "Session Pool Exceeded" 或 "Leaked Session" 这样的错误提示。 +2. **性能问题**:应用程序响应时间延长,执行查询或者事务的延迟增加。 +3. **资源耗尽**:会话池会用尽资源,导致无法再创建新的会话,从而影响应用程序的正常运作。 + +### 会话泄露的原因 + +1. **未释放会话**:在操作完成后,没有调用方法(如 `close()`)将会话返回到池中。 +2. **长时间持有会话**:执行复杂查询或事务时,长时间占用会话,导致其他请求无法获取可用会话。 +3. **异常处理**:在异常发生时未能捕获并释放会话,比如在数据库操作中出现错误但没有使用 `finally` 块或 `try-with-resources`。 +4. **不合理的会话池配置**:当会话池的大小设置过小,无法满足应用程序的需求。 +5. **逻辑错误**:代码中的逻辑错误可能导致意外的路径不释放会话。 + +### 如何避免会话泄露 + +1. **正确释放会话**:确保在每次数据库操作之后都能关闭会话,最好的做法是使用 `try-with-resources` 或者 `finally` 块。 + +```java +try (DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of("instance", "database"))) { + // 执行数据库操作 +} // 会话会在这里自动关闭 +``` + +2. **异常处理**:在操作中捕获异常,并在发生异常时确保会话被合理释放。 +3. **监控和日志**:通过监控会话的创建和使用,及时识别和修复会话泄露。 +4. **合理配置会话池**:根据应用负载合理设置会话池的最大大小。 +5. **故障排查**:使用日志记录相关信息,便于故障排查,识别会话未释放的原因。 + +### 总结 + +会话泄露是一个影响应用程序性能和稳定性的重要问题,通过有效的资源管理和代码结构,可以避免和减少会话泄露的发生。 + +## Spanner + +> 使用 Spanner 时,遇到如下报错提示:com.google.cloud.spanner.SessionPool$LeakedSessionException: Session was checked out from the pool at xxx,之后的读 Spanner 操作都超时了,是什么原因?该怎么解决? +> +> 使用 Spanner 时,遇到如下报错提示:com.google.cloud.spanner.SessionPool$LeakedSessionException: Session was checked out from the pool at xxx +> +> 之后的读 Spanner 操作出现如下一次:Cause: com.google.cloud.spanner.jdbc.JdbcSqlExceptionFactory$JdbcSqlTimeoutException: DEADLINE_EXCEEDED: Operation did not complete in the given time + +`com.google.cloud.spanner.SessionPool$LeakedSessionException: Session was checked out from the pool at xxx` 这一错误表示,Spanner 会话在使用后未能正确释放回会话池,从而导致会话泄漏。后续的读取操作超时可能是由于可用会话不足。 + +### 可能的原因 + +1. **会话未释放**:在获取会话后,未能调用 `close()` 方法或者未能将会话返回池中。 + +2. **长时间持有会话**:在执行某些操作时,长时间持有会话导致其他请求无法获取会话,从而造成超时。 + +3. **并发性过高**:如果您的应用程序并发性太高,而会话池的大小无法满足,需要更多的会话支持。 + +4. **网络问题**:会话连接可能因为网络问题而失去。如果未能捕获到此类异常,可能导致会话未释放。 + +### 解决方法 + +1. **确保正确释放会话**:确保在所有数据库操作后都调用 `close()` 方法,或使用 `try-with-resources` 语句来确保会话自动关闭。例如: + +```java +try (DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of("instance", "database"))) { + // 执行数据库操作 +} // 会话会在这里被释放 +``` + +2. **调整会话池配置**:检查您应用中的会话池大小配置,可以增加它以支持更高的并发请求: + +```java +SpannerOptions options = SpannerOptions.newBuilder() + .setSessionPoolOptions(SessionPoolOptions.newBuilder() + .setMaxSessions(20) // 根据需要调整大小 + .build()) + .build(); +``` + +3. **监控和日志**:启用更详细的日志记录,以监控会话的创建、使用和释放。监控这些信息可以帮助识别漏掉会话情况。 +4. **使用长时间的事务小心**:避免在一个事务中长时间持有会话。如果需要执行多个操作,请考虑拆分事务。 +5. **异常处理**:确保异常处理得当,以便在获得会话时发生问题时返回到池中。 +6. **排查网络问题**:如果有频繁的网络波动,考虑进行网络优化以降低与 Cloud Spanner 的通信延迟或不稳定性。 + +### 总结 + +会话泄漏通常是由于错误的会话管理和不当的资源释放所引起的。通过确保每个会话的正确管理,适当调整会话池设置,以及增强监控和日志,可以有效解决或降低此类问题的发生率。 + +--- + +遇到 `com.google.cloud.spanner.SessionPool$LeakedSessionException: Session was checked out from the pool at xxx` 这样的错误时,说明您的 Spanner 会话出现了泄漏,即会话在使用后未能正常释放回会话池。这会导致可用会话减少,从而引起后续 `JdbcSqlTimeoutException: DEADLINE_EXCEEDED` 错误,表示操作在给定时间内未完成。 + +### 可能原因 + +1. **会话未释放**:在一个会话使用后,未调用 `close()` 或其他释放方法,导致会话未能返回池中。 +2. **长时间持有会话**:某些操作(如复杂查询或长时间运行的事务)可能导致会话长时间占用,从而使后续请求无法获取可用会话。 +3. **会话池配置不足**:如果会话池的大小配置得太小,无法支持并发请求的数量,会迅速耗尽可用会话。 +4. **异常处理不当**:如果在进行数据库操作时发生异常,但没有正确地释放会话,可能会导致泄漏。 +5. **网络或延迟问题**:网络延迟或不稳定可能导致操作超时。 + +### 解决方法 + +1. **确保正确释放会话**:确保在每次获取会话后,无论操作是否成功,都能调用 `close()` 方法释放会话。可以使用 `try-with-resources` 语句: + +```java +try (DatabaseClient client = spanner.getDatabaseClient(DatabaseId.of("instance", "database"))) { + // 执行数据库操作 +} // 会话自动关闭并返回池中 +``` + +2. **调整会话池大小**:根据应用负载的需要,增加会话池的最大大小: + +```java +SpannerOptions options = SpannerOptions.newBuilder() + .setSessionPoolOptions(SessionPoolOptions.newBuilder() + .setMaxSessions(20) // 根据需要进行调整 + .build()) + .build(); +``` + +3. **监控和调试**:启用详细的日志记录,监控会话的使用情况和池的状态,帮助识别问题所在。 +4. **优化长查询和事务**:避免在单一会话中长时间进行复杂操作。如果需要,可以将大事务拆分为多个小事务。\ +5. **增加超时时间**:如果操作经常超时,可以考虑增加超时时间,但这通常是权宜之计,更好的解决方案是优化查询和会话管理。 +6. **处理异常**:确保在发生异常时能捕获并适当处理,以便释放会话。 +7. **检查网络连接**:验证与 Google Cloud Spanner 之间的网络连接是否稳定,确保配置没有问题。 + +### 总结 + +会话泄漏和超时通常是由于会话管理不当或资源配置不足导致的。通过合理管理会话、调整会话池大小、监控使用情况和优化查询,可以有效解决这些问题,保持系统的稳定性与响应性。 diff --git a/articles/practice/info/_news.md b/articles/practice/info/_news.md new file mode 100644 index 000000000..f51ffb777 --- /dev/null +++ b/articles/practice/info/_news.md @@ -0,0 +1,143 @@ +如何将每天动态的最新火爆新闻收集并串联起来,以故事线和组成故事线的事件进行叙事? + +--- + +# 动态新闻收集与叙事线构建指南 + +要将每日火爆新闻收集并通过故事线形式进行叙事,你需要建立一个系统性工作流程,包括信息收集、分析、组织和叙事呈现。下面是一个完整的方法论: + +## 一、新闻收集阶段 + +### 1. 建立多元化信息源 + +- **传统媒体**:主流报纸、电视台网站、权威新闻机构 +- **社交媒体**:微博热搜榜、Twitter 趋势、Reddit 热门话题 +- **聚合平台**:今日头条、Google News、Feedly 等 RSS 聚合器 +- **垂直领域平台**:根据兴趣方向选择特定行业媒体 + +### 2. 自动化收集工具 + +- **RSS 订阅器**:Feedly、Inoreader 等,订阅主流媒体源 +- **API 调用**:使用新闻 API 如 NewsAPI、GDELT 项目 +- **爬虫程序**:针对无 API 的网站建立简单爬虫(Python + BeautifulSoup/Scrapy) +- **社交媒体监测工具**:如 BuzzSumo、CrowdTangle 等 + +### 3. 建立筛选机制 + +- **关键词过滤**:设置与你关注领域相关的关键词组合 +- **热度指标**:阅读量、转发量、评论量等量化指标 +- **时间过滤**:聚焦最近 24 小时内的内容 +- **信息源权重**:对不同渠道设置可信度权重 + +## 二、故事线识别与构建 + +### 1. 新闻聚类与关联 + +- **主题聚类**:使用 NLP 技术将相关新闻聚合(如基于 TF-IDF 或词嵌入的文本相似度) +- **时间序列分析**:按时间顺序排列相关事件 +- **因果关系识别**:分析事件间的因果、触发关系 +- **关键人物/实体追踪**:识别贯穿多个新闻的关键角色 + +### 2. 故事线模式识别 + +- **传统叙事结构**:起因-发展-高潮-结局 +- **多线并行结构**:多个相关但独立发展的故事线 +- **循环/递归结构**:周期性出现的议题与进展 +- **冲突解决模式**:问题-矛盾-对抗-解决方案 + +### 3. 核心故事线提取 + +- **寻找叙事主干**:识别最具影响力的核心事件链 +- **分支事件梳理**:相关的次要事件如何围绕主干发展 +- **叙事空白填补**:对时间线上的信息缺口进行合理推测或标注 +- **多角度验证**:交叉对比不同来源信息,确保故事线准确性 + +## 三、叙事呈现方法 + +### 1. 叙事结构设计 + +- **时间线叙事**:按时间顺序严格组织内容 +- **主题式叙事**:围绕核心议题组织,不严格遵循时间顺序 +- **人物中心叙事**:以关键人物行动与经历为线索 +- **问题解决型叙事**:围绕问题的提出、复杂化与解决过程 + +### 2. 叙事技巧运用 + +- **强有力的开场**:以最引人入胜的元素开始 +- **悬念设置**:保留关键信息,创造阅读期待 +- **场景构建**:用细节和背景丰富关键事件描述 +- **多元视角融合**:展示不同立场对同一事件的解读 + +### 3. 媒体形式选择 + +- **文本叙事**:新闻简报、深度分析文章、时事通讯 +- **视觉呈现**:信息图表、时间线图、关系网络图 +- **多媒体整合**:结合文字、图片、视频、数据可视化 +- **互动式体验**:允许读者在故事线上自由探索不同分支 + +## 四、技术实现方案 + +### 1. 基础技术栈 + +- **编程语言**:Python(数据收集与处理) +- **数据库**:MongoDB(非结构化新闻数据存储) +- **NLP 库**:NLTK、spaCy、Transformers(文本分析) +- **Web 框架**:Flask/Django(如需构建展示平台) + +### 2. 自动化流程示例 + +```python +# 简化的工作流程示意代码 +def daily_news_narrative_pipeline(): + # 1. 收集新闻 + raw_news = collect_news_from_sources() + + # 2. 预处理与过滤 + filtered_news = filter_by_relevance_and_impact(raw_news) + + # 3. 主题聚类 + news_clusters = cluster_by_topic(filtered_news) + + # 4. 故事线提取 + storylines = extract_storylines(news_clusters) + + # 5. 叙事构建 + narratives = build_narratives(storylines) + + # 6. 发布/展示 + publish_narratives(narratives) +``` + +### 3. 半自动化工作流 + +- **自动收集与初筛**:系统自动执行 +- **人工审核与故事线确认**:编辑审核系统建议的故事线 +- **叙事创作**:结合 AI 辅助与人工创作 +- **发布与反馈收集**:监测读者反应,优化后续叙事 + +## 五、实用建议与注意事项 + +### 1. 建立明确的编辑原则 + +- **事实核查机制**:多源验证每个重要事件 +- **叙事公正性**:避免单一立场,呈现多元观点 +- **信息完整性**:确保故事线不缺失关键环节 +- **更新机制**:针对发展中事件的持续跟踪策略 + +### 2. 常见陷阱与规避方法 + +- **过度简化复杂事件**:保留必要的背景与复杂性 +- **错误关联无关事件**:严格基于证据建立因果关系 +- **叙事偏见**:邀请不同背景的人审核内容 +- **信息过载**:设定合理的故事线数量与复杂度上限 + +### 3. 持续优化建议 + +- **读者反馈收集**:建立互动机制了解读者需求 +- **A/B 测试**:测试不同叙事结构的效果 +- **分析工具应用**:追踪哪些故事线获得更多关注 +- **叙事模式库**:积累有效的故事线模式作为模板 + +--- + +通过以上系统性方法,你可以将碎片化的热点新闻转化为连贯的、有深度的叙事内容,既满足读者获取信息的需求,也提供更有价值的背景理解和思考框架。核心在于将技术手段与人文理解相结合,既保证信息的准确性和全面性,又赋予其叙事的生命力。 diff --git a/articles/practice/java/_jdk.md b/articles/practice/java/_jdk.md new file mode 100644 index 000000000..79d289385 --- /dev/null +++ b/articles/practice/java/_jdk.md @@ -0,0 +1,31 @@ +## 问题处理 + +> JDK 21 应用程序启动时遇到如下提示应该如何处理: +> +> OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended + +遇到提示 `OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended` 时,这通常与 Java 的类加载机制有关,尤其是与类共享和引导类路径(bootstrap classpath)相关。 + +### 解释 + +这个警告表示您正在尝试启用类共享(class sharing),但由于引导类路径已被附加,因此只支持引导加载器类的共享。这可能导致某些功能(如 `-Xshare:dump` 和 `-Xshare:off` 选项)不能如预期工作。 + +### 处理建议 + +1. **检查 JVM 启动参数**: 确保您没有在启动 JVM 时使用了不必要的类路径或引导类路径选项。例如,检查是否使用了 `-Xbootclasspath/a` 或 `-Xbootclasspath/p` 等参数。 +2. **类共享选项**: 如果启用了类共享,尝试使用 `-Xshare:off` 关闭它,看看是否仍然会抛出该警告。 + +```bash +java -Xshare:off -jar your_application.jar +``` + +3. **更新 JDK**: 确保您使用的是最新版本的 JDK 21,可能会包含 bug 修复和改进。 +4. **使用默认 JDK 配置**: 如果您对 JDK 的配置进行了手动修改,尝试使用默认配置来运行应用程序。 +5. **查看日志**: 检查其他的启动日志信息,可能会提供更多上下文或警告,为排查问题提供依据。 +6. **Java 版本兼容性**: 确保您的应用程序及其依赖项与 JDK 21 兼容。某些库或框架可能在新版本的 JDK 中表现不同。 +7. **搜索社区和文档**: 由于 JDK 21 是较新的版本,可以搜索相关的社区或论坛,看是否有其他开发者遇到类似的问题,并查找解决方案。 + +### 总结 + +虽然该警告本身不会阻止应用程序运行,处理方式通常通过调整 JDK 的启动参数或配置来消除警告,以便更好地利用 Java 的类加载机制和性能优化。希望上述建议能帮助您解决问题。 + diff --git a/articles/practice/java/_jdk23.md b/articles/practice/java/_jdk23.md new file mode 100644 index 000000000..0ddbf4776 --- /dev/null +++ b/articles/practice/java/_jdk23.md @@ -0,0 +1,76 @@ +# JDK 23 + +## 新特性 + +Java Development Kit (JDK) 23 是 Java 生态系统中的一个重要版本,带来了多项新特性和改进,旨在提升开发者的效率和提升应用程序的性能。以下是对JDK 23主要新特性的详细介绍。 + +### 1. JDK 23 的主要新特性概述 + +JDK 23 引入了一系列显著的新特性,涵盖了语言、库和工具的多个方面。这些新特性不仅提高了编程语言的灵活性和可读性,还增强了开发环境的整体性能。例如,JDK 23 通过引入新的语言功能,使得编写高效、简洁的代码变得更加容易。此外,改进的错误处理机制和更强大的类型系统进一步增强了代码的可靠性。 + +### 2. 新增模块和 API 细节 + +在 JDK 23 中,新增了一些重要的模块和 API,这些新组件为开发者提供了更丰富的功能和更多的选择。例如,新引入的 `java.time` 模块扩展了日期和时间处理的能力,提供了更精确的时区和时间计算能力。此外,`java.nio` 模块也得到了升级,支持更高效的文件和网络操作。这些新增的模块和 API 不仅丰富了 Java 的功能体系,也为开发者提供了更强大的工具来构建复杂的应用程序。 + +### 3. 性能优化和增强功能的示例 + +JDK 23 在性能方面也进行了多项优化,显著提升了应用程序的执行效率。例如,内存管理方面的改进使得 Java 应用程序在处理大量数据时表现更加出色,减少了垃圾回收的时间和频率。此外,JIT(即时编译器)的增强使得代码执行速度得到了显著提升。开发者可以通过更高效的内存使用和更快的代码执行,来构建响应更迅速、性能更优的应用程序。 + +通过这些新特性,JDK 23 不仅为开发者提供了更强大的工具,也为 Java 语言的未来发展奠定了基础。开发者们可以利用这些新功能,提升他们的开发效率,构建更为复杂和高效的应用程序。 +# JDK 23 + +## 提升空间 + +### 1. JDK 23 的潜在改进领域 + +尽管 JDK 23 在许多方面表现出色,但仍然存在一些潜在的改进空间。首先,关于性能的优化是一个重要领域。虽然最新版本已经引入了一些性能增强功能,但在处理大型数据集和高并发任务时,仍然可能出现瓶颈。优化垃圾回收机制、提高线程管理效率以及增强对现代硬件的支持都是可以考虑的方向。 + +其次,开发者体验也是提升的一个关键领域。例如,IDE 的集成和工具链的灵活性可以进一步改善。增强文档的可用性和易读性,提供更丰富的示例代码和最佳实践指南,对于新手开发者尤为重要。 + +最后,安全性始终是软件开发中的一项重要考量。JDK 23 可以在提升安全性方面做出更多努力,例如加强对新兴安全威胁的防护,提升对加密算法的支持以及增强错误处理机制,以降低潜在的安全漏洞。 + +### 2. 用户反馈和社区建议 + +用户反馈是推动 JDK 发展的重要动力。通过分析社区反馈,开发团队可以识别出用户在使用 JDK 23 时遇到的痛点。例如,一些用户提到在特定环境下的性能下降问题,建议开发者在未来的版本中进行针对性优化。 + +此外,社区成员提出的建议往往能够启发新的功能开发。例如,许多开发者希望能看到更灵活的模块化支持,能够更加方便地管理依赖关系和版本控制。这些建议不仅能够提升 JDK 的功能性,还能增强社区的活跃度和凝聚力。 + +积极的社区参与也为 JDK 的发展提供了新的视角。开发者可以通过参与讨论、提交问题和功能请求,影响未来的版本更新,以确保 JDK 更好地满足用户的需求。 + +### 3. 开发人员如何利用这些提升空间 + +开发人员在利用 JDK 23 的提升空间时,可以采取以下几种策略。首先,积极参与社区讨论,分享使用经验和反馈意见,这不仅能帮助自己更好地理解 JDK 的功能,还能推动整体生态的健康发展。 + +其次,开发者可以利用现有的工具和框架进行性能测试,识别出应用中的瓶颈,并根据社区建议进行调整和优化。通过不断迭代,开发者能够在实际项目中实现更高的效率和更好的性能。 + +最后,保持对新兴技术和趋势的敏感性,开发者应不断学习和适应新特性,尤其是在安全性、性能和用户体验方面的改进。通过不断更新自己的知识库,开发人员不仅能提升自身技能,还能更好地利用 JDK 23 带来的优势,为项目的成功奠定基础。 + +通过关注这些提升空间,开发人员和社区成员能够共同推动 JDK 23 的发展,使其更加强大、灵活和安全。 +# JDK 23 + +## AI 相关 + +随着人工智能技术的不断发展,Java 开发者在 JDK 23 中将获得更多工具和支持,以便更好地集成和应用 AI 解决方案。本节将深入探讨 JDK 23 中对人工智能的支持,新增的 AI 相关库和工具,以及一些实际应用案例。 + +### 1. JDK 23 中对人工智能的支持 + +JDK 23 在人工智能领域的支持主要体现在增强的 API 和底层框架上,使得开发者能够更轻松地构建复杂的 AI 应用程序。通过引入新的接口和类,JDK 23 旨在简化机器学习和数据处理的工作流程。尤其是在处理大规模数据集和实现复杂算法时,新的支持使得开发者可以更高效地进行构建和测试。 + +- **新型数据处理 API**:JDK 23 引入了一些新的数据处理 API,这些 API 使得在 Java 中处理数据集时更加高效,特别是在涉及 AI 和机器学习的应用场景中。 +- **支持流式计算**:通过流式计算的支持,开发者可以实时处理数据,这对于需要快速反应的 AI 应用至关重要。 + +### 2. 新增 AI 相关库和工具 + +为了进一步推动 Java 在 AI 领域的应用,JDK 23 增加了一些专门为 AI 开发设计的库和工具。这些库和工具不仅丰富了 Java 的生态系统,也为开发者提供了更多的选择和灵活性。 + +- **机器学习库**:JDK 23 集成了一些流行的机器学习库,例如 Deeplearning4j 和 Weka,这些库提供了强大的算法和工具,帮助开发者快速构建和训练机器学习模型。 +- **深度学习支持**:新的深度学习支持库使得开发者可以方便地实现深度学习网络,并且能够利用 GPU 加速进行训练和推理,这在图像处理和自然语言处理等领域具有广泛的应用前景。 + +### 3. 实际应用案例 + +JDK 23 的 AI 支持和新库的推出,催生了一系列实际应用案例,证明了其在真实世界中的有效性和可行性。 + +- **智能推荐系统**:某电商平台利用 JDK 23 构建了一个智能推荐系统,通过分析用户行为数据,利用机器学习算法为用户推荐个性化商品。该系统在上线后显著提高了用户的购买转化率。 +- **自然语言处理应用**:一款新的聊天机器人应用程序利用 JDK 23 的深度学习库进行训练,使得机器人能够理解和回应用户的自然语言查询。该应用在客户服务领域取得了极大的成功,用户反馈也非常积极。 + +总的来说,JDK 23 在 AI 相关领域的增强不仅丰富了 Java 的生态系统,也为开发者提供了更强大的工具和支持,以实现更复杂和智能的应用程序。这些新特性和实际应用案例无疑将推动 Java 在人工智能领域的发展。 \ No newline at end of file diff --git a/articles/practice/java/_jvm-oom.md b/articles/practice/java/_jvm-oom.md new file mode 100644 index 000000000..0b8374c6d --- /dev/null +++ b/articles/practice/java/_jvm-oom.md @@ -0,0 +1,193 @@ +在 Kubernetes (k8s) 上运行 Java 程序时,您配置的 JVM 参数 `-server -XX:InitialRAMPercentage=25.0 -XX:MinRAMPercentage=25.0 -XX:MaxRAMPercentage=75.0` 主要是控制 JVM 内存的分配策略,但在服务启动阶段,Pod 占用宿主机内存超过设置的 25% 可能是由以下几个原因导致的: + +### 1. JVM 启动时的内存分配 + +在 Java 应用程序启动时,JVM 需要加载类、初始化静态变量等,这些操作可能会消耗比指定的初始 RAM 百分比更多的内存。尤其是在应用程序启动时,JVM 会分配一些内存用于自身的管理和运行,包括: + +- 类加载器的内存 +- JIT 编译器的内存 +- 线程栈的内存 + +### 2. 其他进程和库的内存需求 + +除了 JVM 本身占用的内存外,您的应用可能还依赖于其他库或框架(例如 Spring、Hibernate 等),它们在启动时也可能分配内存。而这些内存分配并不受 JVM 的 RAM 百分比设置的限制。 + +### 3. Pod 的资源请求和限制 + +在 Kubernetes 中,Pod 的资源请求和限制可以通过 `resources` 字段来设置。若未对 Pod 设置内存限制,Pod 可以使用宿主机上的任何可用内存。推荐的做法是设置 Pod 的内存请求和限制,以便在启动阶段限制内存的使用。 + +### 如何限制 Pod 启动阶段的内存占用 + +1. **设置 Pod 的资源请求和限制**: + + 在 Pod 的 YAML 配置文件中,您可以设置 `resources` 字段来限制内存使用。例如: + + ```yaml + apiVersion: v1 + kind: Pod + metadata: + name: my-java-app + spec: + containers: + - name: java-container + image: my-java-app-image + resources: + requests: + memory: "256Mi" # 设定请求内存 + limits: + memory: "512Mi" # 设定限制内存 + ``` + + 这种方式确保在 Pod 启动期间不会超过设置的内存限制。 + +2. **使用 JVM 启动参数**: + + 您已经使用了 `-XX:InitialRAMPercentage` 等参数,可以继续监控并调整这些参数以寻找合适的内存配置。 + +3. **优化应用程序的启动逻辑**: + + 如果可能的话,检查应用程序的启动逻辑,减少初始化时的内存占用,例如延迟加载不必要的资源或使用懒加载策略。 + +通过设置资源请求和限制,并监控应用程序的内存使用情况,您可以更好地控制 Pod 在启动阶段的内存占用,从而避免超出宿主机内存的限制。 +在 Kubernetes(k8s)上运行 Java 程序时,使用 `-XX:InitialRAMPercentage=25.0`、`-XX:MinRAMPercentage=25.0` 和 `-XX:MaxRAMPercentage=75.0` 这些参数确实可以帮助您动态管理 JVM 的内存使用。然而,在服务启动阶段,Pod 占用宿主机内存超过预期的 25% 可能由以下几个原因导致: + +### 原因分析 + +1. **JVM 启动开销**: + - 在 JVM 启动时,除了堆内存之外,还会分配一些用于线程、栈、代码缓存和其他内部数据结构的内存。这些开销在启动阶段可能会导致内存使用量超过设置的初始值。 + +2. **其他进程的内存占用**: + - 如果您的 Pod 里面运行的不仅仅是 Java 应用,还可能会有其他进程(如监控、日志等工具),它们会占用额外的内存。 + +3. **使用的内存限制**: + - Kubernetes 本身对 Pod 的内存限制是基于容器的配置。如果您没有为 Pod 设置内存限制,JVM 将尽可能多地使用可用内存,而不仅仅是基于 JVM 参数。 + +4. **配置错误**: + - 如果 JVM 的 `-XX:MaxRAMPercentage` 设置过高(例如 75%),在初始分配内存时,可能会导致内存使用量大幅上升。 + +### 限制 Pod 内存使用 + +为了控制 Pod 启动阶段的内存使用,您可以采取以下几种措施: + +1. **设置 Kubernetes 的内存限制**: + - 在 Pod 的 YAML 配置文件中,您可以设置 `resources.limits.memory` 来限制 Pod 的最大内存使用。例如: + ```yaml + resources: + limits: + memory: "512Mi" # 设置最大内存为 512 MiB + ``` + - 这样可以确保 Pod 在任何时候都不会使用超过这个限制的内存。 + +2. **JVM 参数优化**: + - 调整 JVM 参数,确保在启动时尽可能减少内存开销。可以考虑使用 `-XX:MaxRAM` 来手动设置最大内存限制,而不是使用百分比。例如: + ```bash + -XX:MaxRAM=512m + ``` + +3. **使用 Init Containers**: + - 如果需要在主容器启动之前执行一些初始化操作,可以考虑使用 Init Containers,这样可以在主应用加载之前限制内存的使用。 + +4. **监控和调整**: + - 使用监控工具(如 Prometheus + Grafana)来观察 Pod 的内存使用情况,根据实际使用情况调整 Pod 的内存限制和 JVM 参数。 + +5. **使用 `-XX:Startup` 选项**: + - 使用 `-XX:+UseContainerSupport` 以及相关的启动参数来更好地适应 Kubernetes 环境。 + +通过上述措施,您可以更好地控制 Pod 的内存使用,确保在启动阶段不超过预期的内存限制。 +在 Kubernetes (K8s) 上运行 Java 程序时,设置 JVM 的内存参数如 `-XX:InitialRAMPercentage`、`-XX:MinRAMPercentage` 和 `-XX:MaxRAMPercentage` 旨在控制 Java 虚拟机的内存使用。然而,您观察到在服务启动阶段 Pod 占用宿主机的内存超过了设置的 `InitialRAMPercentage` 的 25%。这可能是由于以下几个原因: + +### 原因分析 + +1. **JVM 启动过程**: + - JVM 在启动时会分配一些内存用于自身的运行环境,比如类加载、JIT 编译等,这些内存并不受 `InitialRAMPercentage` 的限制。 + - 初始内存分配可能会在 JVM 完全初始化之前就开始,导致在启动阶段内存使用量增高。 + +2. **其他内存使用**: + - Pod 内可能存在其他的进程或容器占用内存,比如操作系统的缓存、运行的其他服务或库等。 + - 应用在启动时可能会加载大量资源,导致瞬时内存占用增加。 + +3. **Kubernetes 的调度和资源管理**: + - Kubernetes 的资源限制是基于容器级别的,可能在容器的内存限制设置上未能与 JVM 的设置相匹配。 + +### 限制 Pod 内存使用的建议 + +为了限制 Pod 在启动阶段占用宿主机的内存,可以采取以下几种方法: + +1. **设置 Kubernetes 的资源限制**: + - 在 Pod 的 YAML 配置文件中,为容器设置适当的 `resources` 限制,限制其最大内存使用: + ```yaml + resources: + limits: + memory: "500Mi" # 设置最大内存限制 + requests: + memory: "200Mi" # 设置初始内存请求 + ``` + - 这样可以确保即使在启动阶段,Pod 也不会超过指定的内存限制。 + +2. **调整 JVM 内存参数**: + - 可以通过降低 `-XX:MaxRAMPercentage` 的值来限制 JVM 的最大内存使用,例如将其设置为 50% 或更低。 + - 也可考虑降低 `-XX:InitialRAMPercentage`,使其在启动阶段的内存占用更低。 + +3. **使用 `-XX:+HeapDumpOnOutOfMemoryError`**: + - 在 JVM 启动参数中加入 `-XX:+HeapDumpOnOutOfMemoryError`,尽管这是用于 OOM 的调试,但可以帮助你了解内存使用情况。 + +4. **优化应用启动逻辑**: + - 如果应用在启动时加载了大量资源,可以考虑延迟加载,减少启动时的内存占用。 + +5. **监控和调试**: + - 使用工具如 `kubectl top pods` 监控 Pod 的内存使用情况。 + - 考虑使用 Java 的监控工具(如 JVisualVM 或 Prometheus + Grafana)进一步分析内存占用。 + +通过以上措施,您可以更好地控制 Pod 在 Kubernetes 上的内存使用,尤其是在启动阶段,避免超出宿主机的内存限制。 +在 Kubernetes (k8s) 上运行 Java 程序时,您设置的 JVM 参数 `-XX:InitialRAMPercentage=25.0`、`-XX:MinRAMPercentage=25.0` 和 `-XX:MaxRAMPercentage=75.0` 是用来动态管理 JVM 的内存使用的。然而,您观察到在服务启动阶段,Pod 占用的宿主机内存超过了设置的 25%。这可能有几个原因: + +### 原因分析 + +1. **JVM 启动过程**: + 在 JVM 启动时,除了配置的堆内存外,JVM 还会占用其他内存,例如: + - 方法区(Metaspace) + - JNI 代码 + - 线程栈 + - 内部数据结构 + - 其他库和类加载 + + 这些额外的内存使用可能会导致 Pod 的实际内存占用超过 25%。 + +2. **容器和 Kubernetes 的限制**: + Kubernetes Pod 可能没有设置内存限制,或者设置的限制高于您想要的限制。即使您在 JVM 中设置了内存使用比例,如果 Pod 本身没有被限制,它仍然可以使用宿主机的更多内存。 + +3. **初始内存分配**: + JVM 启动时,可能会根据 `InitialRAMPercentage` 的设置分配内存,但在 JVM 启动期间,可能会短暂地使用更多内存,尤其是在加载类和初始化静态变量时。 + +### 解决方案 + +要限制 Pod 在启动阶段的内存占用,可以考虑以下几种方法: + +1. **设置 Kubernetes 内存限制**: + 在您的 Pod 或 Deployment 配置中,明确设置内存限制。例如: + + ```yaml + resources: + requests: + memory: "256Mi" # 申请的内存 + limits: + memory: "512Mi" # 限制的内存 + ``` + + 这样可以确保 Pod 的内存使用不会超过 512 MiB。 + +2. **调整 JVM 配置**: + 针对 JVM 启动过程,您可以尝试优化 JVM 的启动参数,例如: + - 使用 `-XX:MaxMetaspaceSize` 限制方法区的大小。 + - 如果适用,可以考虑使用 `-XX:MaxHeapSize` 来设置最大堆内存。 + +3. **使用初始化容器**: + 如果启动期间需要执行某些任务而不希望影响主容器的内存使用,可以考虑使用初始化容器。初始化容器在主容器启动之前运行,并且可以被配置为使用特定的资源限制。 + +4. **监控和优化**: + 使用监控工具(如 Prometheus 和 Grafana)监控 Pod 的内存使用情况,识别占用内存的高峰期,并进行进一步的优化。 + +5. **使用轻量级的 Java 运行时**: + 考虑使用更轻量级的 Java 运行时(如 GraalVM 或 OpenJ9),这些运行时通常会对内存使用进行更好的优化。 + +通过以上方法,您可以更有效地控制 Kubernetes 环境中 Java 应用程序的内存占用,确保它们在启动阶段不会超出预期的限制。 \ No newline at end of file diff --git a/articles/practice/java/_retrofit.md b/articles/practice/java/_retrofit.md new file mode 100644 index 000000000..836b6ffcd --- /dev/null +++ b/articles/practice/java/_retrofit.md @@ -0,0 +1,300 @@ +## retrofit-spring-boot-starter demo + +### 1. 添加依赖 + +```xml + + com.github.lianjiatech + retrofit-spring-boot-starter + 3.1.3 + +``` + +### 2. Customize OkHttpClient + +```java +@Component +public class CustomOkHttpClientRegistrar implements SourceOkHttpClientRegistrar { + + @Override + public void register(SourceOkHttpClientRegistry registry) { + // 注册customOkHttpClient,超时时间设置为1s + registry.register("customOkHttpClient", new OkHttpClient.Builder() + .connectTimeout(Duration.ofSeconds(1)) + .writeTimeout(Duration.ofSeconds(1)) + .readTimeout(Duration.ofSeconds(1)) + .addInterceptor(chain -> chain.proceed(chain.request())) + .build()); + } +} +``` + +```java +@RetrofitClient(baseUrl = "${test.baseUrl}", sourceOkHttpClient = "customOkHttpClient") +public interface CustomOkHttpUserService { + + /** + * 根据id查询用户信息 + */ + @GET("getUser") + User getUser(@Query("id") Long id); +} +``` + + + +## Retrofit Demo + +使用 Retrofit 进行网络请求的客户端示例可以帮助您快速上手。下面是一个简单的示例,展示如何使用 Retrofit 创建 HTTP 客户端,执行网络请求,并处理响应。 + +### 1. 添加依赖 + +首先,您需要在 `build.gradle` 文件中添加 Retrofit 的依赖项。如果您使用的是 Gradle,请添加以下内容: + +```groovy +dependencies { + implementation 'com.squareup.retrofit2:retrofit:2.9.0' + implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // 如果使用 Gson 转换器 + implementation 'com.squareup.okhttp3:logging-interceptor:4.9.0' // 可选,日志拦截器 +} +``` + +### 2. 创建数据模型 + +假设您要从一个 API 获取用户数据,首先创建模型类: + +```java +public class User { + private String name; + private String email; + + // Getters and Setters + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} +``` + +### 3. 定义 API 接口 + +接下来,定义 API 接口: + +```java +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; + +import java.util.List; + +public interface ApiService { + @GET("users") + Call> getUsers(); + + @GET("users/{id}") + Call getUserById(@Path("id") int userId); +} +``` + +### 4. 创建 RetrofitClient + +然后,创建 Retrofit 客户端: + +```java +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class RetrofitClient { + private static final String BASE_URL = "https://jsonplaceholder.typicode.com/"; // 示例 API 地址 + private static Retrofit retrofit; + + public static Retrofit getInstance() { + if (retrofit == null) { + retrofit = new Retrofit.Builder() + .baseUrl(BASE_URL) + .addConverterFactory(GsonConverterFactory.create()) + .build(); + } + return retrofit; + } +} +``` + +### 5. 使用 RetrofitClient 进行网络请求 + +在您的 Activity 或其他组件中,使用 Retrofit 客户端发出网络请求: + +```java +import androidx.appcompat.app.AppCompatActivity; +import android.os.Bundle; +import android.util.Log; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + +import java.util.List; + +public class MainActivity extends AppCompatActivity { + private static final String TAG = "MainActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + ApiService apiService = RetrofitClient.getInstance().create(ApiService.class); + + // 请求用户列表 + Call> call = apiService.getUsers(); + call.enqueue(new Callback>() { + @Override + public void onResponse(Call> call, Response> response) { + if (response.isSuccessful() && response.body() != null) { + for (User user : response.body()) { + Log.d(TAG, "User Name: " + user.getName()); + } + } else { + Log.e(TAG, "Request failed"); + } + } + + @Override + public void onFailure(Call> call, Throwable t) { + Log.e(TAG, "Error: " + t.getMessage()); + } + }); + } +} +``` + +### 6. 运行应用 + +通过运行您的应用,您应该能在日志中看到获取的用户数据。 + +### 总结 + +以上代码展示了如何使用 Retrofit 创建一个简单的 HTTP 客户端,执行 GET 请求并处理响应数据。您可以根据需要扩展此示例,包括添加 POST 请求、错误处理、配置 OkHttp 等功能。 + +## Retrofit Starter Demo + +下面是一个简单的 Retrofit Starter Demo,展示如何在 Maven 项目中引入 Retrofit 依赖,并进行基本的 API 调用。 + +### 1. 添加 Maven 依赖 + +首先,在你的 `pom.xml` 文件中添加 Retrofit 和相关库的依赖。 + +```xml + + + + com.squareup.retrofit2 + retrofit + 2.9.0 + + + + com.squareup.retrofit2 + converter-gson + 2.9.0 + + + + com.squareup.okhttp3 + okhttp + 4.9.0 + + + +``` + +### 2. 创建 API 接口 + +创建一个接口,定义你的 API 请求。 + +```java +import retrofit2.Call; +import retrofit2.http.GET; +import retrofit2.http.Path; + +public interface ApiService { + @GET("users/{user}") + Call getUser(@Path("user") String user); +} +``` + +### 3. 创建用户模型 + +你需要一个模型来映射 API 响应。假设返回的信息包含 `id` 和 `name`。 + +```java +public class User { + private int id; + private String name; + + // Getters and Setters + public int getId() { return id; } + public void setId(int id) { this.id = id; } + public String getName() { return name; } + public void setName(String name) { this.name = name; } +} +``` + +### 4. 设置 Retrofit 实例 + +接下来,设置 Retrofit 实例并执行 API 调用。 + +```java +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +public class Main { + public static void main(String[] args) { + Retrofit retrofit = new Retrofit.Builder() + .baseUrl("https://api.example.com/") // 替换为你的 API 基地址 + .addConverterFactory(GsonConverterFactory.create()) + .build(); + + ApiService apiService = retrofit.create(ApiService.class); + + Call call = apiService.getUser("octocat"); // 替换为你需要查询的用户名 + call.enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.isSuccessful()) { + User user = response.body(); + System.out.println("User ID: " + user.getId()); + System.out.println("User Name: " + user.getName()); + } else { + System.out.println("Request failed: " + response.code()); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + t.printStackTrace(); + } + }); + } +} +``` + +### 5. 运行示例 + +确保你的 Maven 项目正确配置,运行 `Main` 类,即可尝试进行 API 请求。 + +以上就是一个简单的 Retrofit Starter Demo 示例,展示了如何在 Maven 项目中引入 Retrofit 依赖并进行基本的 API 调用。你可以根据实际需要调整 API 接口和用户模型。 diff --git a/articles/practice/java/_sentinel.md b/articles/practice/java/_sentinel.md new file mode 100644 index 000000000..e796ba705 --- /dev/null +++ b/articles/practice/java/_sentinel.md @@ -0,0 +1,500 @@ +# 如何理解 Alibaba Sentinel 熔断降级中的 statIntervalMs 参数? + +让我帮你详细解释一下 Sentinel 中的 statIntervalMs 参数及其作用。 + +statIntervalMs 是 Sentinel 中的统计时长参数,具体含义和使用说明如下: + +1. 基本定义 + +- statIntervalMs 表示统计时间窗口的长度,单位是毫秒(ms) +- 这个参数定义了进行熔断统计的时间跨度 +- 默认值通常为 1000ms(即 1 秒) + +2. 作用机制 + +```java +@SentinelResource( + blockHandler = "handleException", + fallback = "fallback", + rules = { + @DegradeRule( + grade = RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO, + count = 0.5, + timeWindow = 10, + statIntervalMs = 1000 + ) + } +) +``` + +在这个时间窗口内: + +- Sentinel 会统计接口调用的各项指标(如异常比例、RT、请求量等) +- 根据统计结果判断是否触发熔断 +- 统计窗口会持续滑动,保持最新的统计结果 + +3. 参数配置建议 + +- 通常建议设置为 1000ms(1 秒)或 2000ms(2 秒) +- 时间太短:统计样本不足,可能导致误判 +- 时间太长:响应不够灵敏,无法及时发现问题 + +4. 与其他参数的关系 + statIntervalMs 需要与其他熔断参数配合使用: + +- timeWindow:熔断时长 +- count:阈值 +- minRequestAmount:最小请求数 + +示例场景: + +```java +// 配置规则:1秒内统计,异常比例超过50%触发熔断 +DegradeRule rule = new DegradeRule() + .setResource("某接口") + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) + .setCount(0.5) // 异常比例阈值 + .setTimeWindow(10) // 熔断时长为10秒 + .setStatIntervalMs(1000) // 统计时间窗口1秒 + .setMinRequestAmount(5); // 最小请求数 +``` + +5. 注意事项 + +- statIntervalMs 不要设置太小,以免统计不准确 +- 建议与业务特点匹配,高并发场景可以适当缩短 +- 要考虑与熔断时长(timeWindow)的配合 +- 统计周期越长,内存占用越大 + +6. 实际应用建议 + +- 普通接口:使用默认值 1000ms 即可 +- 高并发接口:可以设置为 500ms,提高响应速度 +- 低频调用接口:可以设置为 2000ms,增加样本量 +- 关键核心接口:建议配合监控,根据实际情况调整 + +理解 statIntervalMs 参数对于正确配置 Sentinel 的熔断策略非常重要,它直接影响了熔断决策的准确性和及时性。 + +# slow-ratio-threshold 呢? + +让我详细解释一下 Sentinel 中的 slow-ratio-threshold(慢调用比例阈值)参数。 + +1. 基本定义 + +- slow-ratio-threshold 表示慢调用比例的阈值 +- 取值范围:[0.0, 1.0],代表 0% - 100% +- 当慢调用的比例超过这个阈值时,会触发熔断 + +2. 慢调用的判定 + +```java +DegradeRule rule = new DegradeRule() + .setResource("接口名") + .setGrade(RuleConstant.DEGRADE_GRADE_RT) // 设置为慢调用熔断策略 + .setCount(100) // RT 阈值(ms) + .setTimeWindow(10) // 熔断时长 + .setSlowRatioThreshold(0.3); // 慢调用比例阈值 +``` + +在这个配置中: + +- 响应时间超过 100ms 的调用会被标记为慢调用 +- 如果慢调用占总调用的比例超过 30%,触发熔断 +- 熔断持续 10 秒 + +3. 计算方式 + +``` +慢调用比例 = 慢调用的数量 / 总调用数量 +``` + +举例: + +- 统计周期内总请求量:100 次 +- 响应时间超过设定阈值的请求:35 次 +- 实际慢调用比例:35% > 30%(设定阈值) +- 结果:触发熔断 + +4. 配置策略 + 常见配置场景: + +a) 严格模式 + +```java +// 适用于对性能要求高的接口 +.setCount(50) // RT阈值低 +.setSlowRatioThreshold(0.1) // 慢调用容忍度低 +``` + +b) 宽松模式 + +```java +// 适用于非核心接口 +.setCount(200) // RT阈值高 +.setSlowRatioThreshold(0.5) // 慢调用容忍度高 +``` + +5. 与其他参数的关联 + 需要配合使用的关键参数: + +- minRequestAmount:最小请求数 +- statIntervalMs:统计时间窗口 +- timeWindow:熔断时长 +- count:RT 阈值 + +完整配置示例: + +```java +DegradeRule rule = new DegradeRule() + .setResource("接口名") + .setGrade(RuleConstant.DEGRADE_GRADE_RT) + .setCount(100) // RT阈值 + .setTimeWindow(10) // 熔断时长 + .setSlowRatioThreshold(0.3) // 慢调用比例阈值 + .setMinRequestAmount(5) // 最小请求数 + .setStatIntervalMs(1000); // 统计时间窗口 +``` + +6. 使用建议 + +a) 阈值设置建议: + +- 核心接口:0.1 - 0.3 +- 普通接口:0.3 - 0.5 +- 非核心接口:0.5 以上 + +b) 常见配置场景: + +```java +// 对于核心支付接口 +.setCount(50) // 50ms RT阈值 +.setSlowRatioThreshold(0.1) // 10%慢调用比例 +.setTimeWindow(5) // 5秒熔断期 + +// 对于普通查询接口 +.setCount(200) // 200ms RT阈值 +.setSlowRatioThreshold(0.3) // 30%慢调用比例 +.setTimeWindow(10) // 10秒熔断期 +``` + +7. 注意事项 + +- 确保 RT 阈值(count)设置合理 +- 考虑最小请求数(minRequestAmount)的影响 +- 注意统计时间窗口(statIntervalMs)的设置 +- 熔断时长(timeWindow)要根据恢复能力设置 + +8. 监控建议 + +- 监控慢调用比例的变化趋势 +- 设置慢调用比例的告警阈值 +- 定期评估阈值的合理性 +- 结合业务高峰期进行调整 + +slow-ratio-threshold 是实现基于响应时间的熔断策略的关键参数,需要根据实际业务场景和性能要求来合理配置。 + +# grade 呢? + +让我详细解释 Sentinel 中的 grade(熔断策略)参数。 + +1. 基本定义 + grade 表示熔断降级的策略类型,Sentinel 支持以下三种策略: + +```java +public interface RuleConstant { + // 慢调用比例策略 + int DEGRADE_GRADE_RT = 0; + // 异常比例策略 + int DEGRADE_GRADE_EXCEPTION_RATIO = 1; + // 异常数策略 + int DEGRADE_GRADE_EXCEPTION_COUNT = 2; +} +``` + +2. 三种策略详解 + +a) 慢调用比例策略 (DEGRADE_GRADE_RT) + +```java +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_RT) + .setCount(100) // RT阈值(ms) + .setSlowRatioThreshold(0.3) // 慢调用比例阈值 + .setTimeWindow(10) // 熔断时长 + .setMinRequestAmount(5); // 最小请求数 +``` + +- 统计指标:响应时间(RT) +- 触发条件:超过 RT 阈值的请求比例超过设定值 +- 适用场景:对响应时间敏感的服务 + +b) 异常比例策略 (DEGRADE_GRADE_EXCEPTION_RATIO) + +```java +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) + .setCount(0.3) // 异常比例阈值 + .setTimeWindow(10) // 熔断时长 + .setMinRequestAmount(5); // 最小请求数 +``` + +- 统计指标:异常请求比例 +- 触发条件:异常请求比例超过阈值 +- 适用场景:需要监控服务稳定性的场合 + +c) 异常数策略 (DEGRADE_GRADE_EXCEPTION_COUNT) + +```java +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) + .setCount(5) // 异常数阈值 + .setTimeWindow(10) // 熔断时长 + .setMinRequestAmount(5); // 最小请求数 +``` + +- 统计指标:异常请求数量 +- 触发条件:异常数超过阈值 +- 适用场景:对异常数量敏感的服务 + +3. 各策略参数说明 + +a) 慢调用比例策略参数: + +```java +rule.setGrade(RuleConstant.DEGRADE_GRADE_RT) + .setCount(100) // RT阈值 + .setSlowRatioThreshold(0.3) // 慢调用比例阈值 + .setStatIntervalMs(1000) // 统计时间窗口 + .setMinRequestAmount(5) // 最小请求数 + .setTimeWindow(10); // 熔断时长 +``` + +b) 异常比例策略参数: + +```java +rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) + .setCount(0.3) // 异常比例阈值 + .setStatIntervalMs(1000) // 统计时间窗口 + .setMinRequestAmount(5) // 最小请求数 + .setTimeWindow(10); // 熔断时长 +``` + +c) 异常数策略参数: + +```java +rule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) + .setCount(5) // 异常数阈值 + .setStatIntervalMs(1000) // 统计时间窗口 + .setMinRequestAmount(5) // 最小请求数 + .setTimeWindow(10); // 熔断时长 +``` + +4. 选择建议 + +根据不同场景选择合适的熔断策略: + +a) 使用慢调用比例策略(DEGRADE_GRADE_RT): + +- 对响应时间敏感的接口 +- 实时交易类服务 +- 用户体验敏感的接口 + +b) 使用异常比例策略(DEGRADE_GRADE_EXCEPTION_RATIO): + +- 需要监控服务稳定性 +- 关注服务质量的场景 +- 对错误率敏感的业务 + +c) 使用异常数策略(DEGRADE_GRADE_EXCEPTION_COUNT): + +- 低流量场景 +- 对异常容忍度低的服务 +- 核心基础服务 + +5. 实践示例 + +a) 支付接口配置: + +```java +// 使用慢调用比例策略 +DegradeRule paymentRule = new DegradeRule() + .setResource("payment") + .setGrade(RuleConstant.DEGRADE_GRADE_RT) + .setCount(200) + .setSlowRatioThreshold(0.1) + .setTimeWindow(5); +``` + +b) 订单查询接口配置: + +```java +// 使用异常比例策略 +DegradeRule orderRule = new DegradeRule() + .setResource("orderQuery") + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) + .setCount(0.3) + .setTimeWindow(10); +``` + +6. 注意事项 + +- 不同策略的 count 参数含义不同 +- 需要合理设置最小请求数(minRequestAmount) +- 要根据实际情况调整统计时间窗口 +- 熔断时长要考虑服务恢复能力 +- 建议配合监控系统使用 + +选择合适的 grade 对于实现有效的熔断降级至关重要,需要根据业务特点和需求来选择合适的策略。 + +# count 呢? + +让我详细解释 Sentinel 中的 count 参数,这是一个需要结合 grade(熔断策略)来理解的参数,因为在不同策略下具有不同的含义。 + +1. count 在不同熔断策略下的含义 + +a) 慢调用比例策略 (DEGRADE_GRADE_RT) + +```java +// count 表示慢调用的 RT 阈值,单位为 ms +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_RT) + .setCount(100) // 响应时间阈值为 100ms +``` + +- 表示最大响应时间阈值 +- 超过此时间的调用会被标记为慢调用 +- 单位:毫秒(ms) + +b) 异常比例策略 (DEGRADE_GRADE_EXCEPTION_RATIO) + +```java +// count 表示异常比例阈值,取值范围 [0.0, 1.0] +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) + .setCount(0.3) // 异常比例阈值为 30% +``` + +- 表示异常调用占总调用的比例上限 +- 取值范围:[0.0, 1.0] +- 实际含义:0% - 100% + +c) 异常数策略 (DEGRADE_GRADE_EXCEPTION_COUNT) + +```java +// count 表示异常数阈值 +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) + .setCount(10) // 异常数阈值为 10 次 +``` + +- 表示允许的异常数量上限 +- 单位:次 +- 整数值 + +2. 配置建议 + +a) 慢调用比例策略的 count 配置: + +```java +// 延迟敏感型接口 +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_RT) + .setCount(50) // 关键接口 RT 阈值较低 + +// 普通查询接口 +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_RT) + .setCount(200) // 普通接口可以容忍更高的 RT +``` + +b) 异常比例策略的 count 配置: + +```java +// 核心业务接口 +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) + .setCount(0.1) // 核心接口异常容忍度低 + +// 非核心接口 +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) + .setCount(0.3) // 非核心接口可以容忍更多异常 +``` + +c) 异常数策略的 count 配置: + +```java +// 高并发接口 +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) + .setCount(50) // 较大的异常数阈值 + +// 低频接口 +DegradeRule rule = new DegradeRule() + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) + .setCount(5) // 较小的异常数阈值 +``` + +3. 实际应用场景 + +a) 支付系统配置示例: + +```java +// 支付接口 - 严格模式 +DegradeRule paymentRule = new DegradeRule("payment") + .setGrade(RuleConstant.DEGRADE_GRADE_RT) + .setCount(100) // 100ms RT阈值 + .setSlowRatioThreshold(0.1) // 10%慢调用比例 + .setTimeWindow(5); // 5秒熔断期 + +// 支付结果查询 - 异常比例模式 +DegradeRule queryRule = new DegradeRule("paymentQuery") + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_RATIO) + .setCount(0.2) // 20%异常比例阈值 + .setTimeWindow(10); // 10秒熔断期 +``` + +b) 订单系统配置示例: + +```java +// 订单创建 - RT模式 +DegradeRule createOrderRule = new DegradeRule("createOrder") + .setGrade(RuleConstant.DEGRADE_GRADE_RT) + .setCount(200) // 200ms RT阈值 + .setSlowRatioThreshold(0.2); // 20%慢调用比例 + +// 订单查询 - 异常数模式 +DegradeRule queryOrderRule = new DegradeRule("queryOrder") + .setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT) + .setCount(20) // 20次异常数阈值 + .setTimeWindow(60); // 60秒熔断期 +``` + +4. 参数调优建议 + +a) RT 阈值(慢调用): + +- 关键接口:50-100ms +- 普通接口:100-500ms +- 后台接口:500-1000ms + +b) 异常比例: + +- 核心服务:0.1 (10%) +- 普通服务:0.3 (30%) +- 非核心服务:0.5 (50%) + +c) 异常数: + +- 低流量接口:5-10 次 +- 中等流量接口:10-50 次 +- 高流量接口:50-100 次 + +5. 注意事项 + +- count 值需要根据实际业务场景调整 +- 配合 minRequestAmount 使用更合理 +- 建议通过监控数据来确定合适的阈值 +- 定期评估和调整阈值的合理性 +- 考虑峰值流量时的表现 +- 不同环境(测试、生产)可能需要不同配置 diff --git a/articles/practice/java/_zgc.md b/articles/practice/java/_zgc.md new file mode 100644 index 000000000..6ac7083a2 --- /dev/null +++ b/articles/practice/java/_zgc.md @@ -0,0 +1,535 @@ +# Allocation Rate 与 High Usage、Proactive 内存回收的区别是? + +让我为你详细解释 ZGC 中这三种不同的内存回收触发机制的区别。 + +1. 基本概念对比 + +a) Allocation Rate GC + +- 触发条件:基于内存分配速率 +- 关注点:对象创建的速度 +- 目的:预防性回收,保持稳定的内存分配能力 + +b) High Usage GC + +- 触发条件:基于内存使用量达到特定阈值 +- 关注点:整体内存使用水平 +- 目的:防止内存耗尽 + +c) Proactive GC + +- 触发条件:基于预测和启发式算法 +- 关注点:系统整体状态和历史模式 +- 目的:主动优化内存状态,防止问题发生 + +2. 触发机制对比 + +a) Allocation Rate GC: + +```java +// 示意代码 +if (allocationRate > threshold) { + // 当分配速率超过阈值时触发 + triggerGC(); +} +``` + +b) High Usage GC: + +```java +// 示意代码 +if (usedMemory / maxMemory > threshold) { + // 当内存使用率超过阈值时触发 + triggerGC(); +} +``` + +c) Proactive GC: + +```java +// 示意代码 +if (shouldTriggerProactiveGC()) { + // 基于多个指标综合判断 + // - 历史GC频率 + // - 内存碎片程度 + // - CPU使用率 + // - 系统负载等 + triggerGC(); +} +``` + +3. 配置参数比较 + +```java +// Allocation Rate 相关配置 +-XX:ZAllocationSpikeTolerance=2.0 +-XX:ZCollectionInterval=5 + +// High Usage 相关配置 +-XX:InitiatingHeapOccupancyPercent=45 +-XX:MaxHeapSize=32g + +// Proactive GC 相关配置 +-XX:ZProactiveGCCycles=3 +-XX:ZProactiveGCInterval=300 +``` + +4. 使用场景对比 + +a) Allocation Rate GC 适用: + +```java +// 适合频繁创建对象的场景 +public class CacheService { + private Cache cache = CacheBuilder.newBuilder() + .maximumSize(10000) + .build(); + + public void processData(String key, byte[] data) { + cache.put(key, data); // 频繁的内存分配 + } +} +``` + +b) High Usage GC 适用: + +```java +// 适合内存使用量稳定增长的场景 +public class DataProcessor { + private List records = new ArrayList<>(); + + public void processInBatch(List batch) { + records.addAll(batch); // 累积数据直到达到阈值 + } +} +``` + +c) Proactive GC 适用: + +```java +// 适合需要预防性维护的场景 +public class ServiceManager { + private ScheduledExecutorService scheduler; + + public void initializeService() { + scheduler = Executors.newScheduledThreadPool(4); + // 定期执行的任务可能导致内存问题 + } +} +``` + +5. 性能特征对比 + +a) Allocation Rate: + +- 响应较快 +- CPU 开销中等 +- 适合动态负载 + +b) High Usage: + +- 响应较慢 +- CPU 开销较大 +- 适合稳定负载 + +c) Proactive: + +- 响应平缓 +- CPU 开销可控 +- 适合混合负载 + +6. 监控指标对比 + +```java +// 需要监控的不同指标 +public class GCMetrics { + // Allocation Rate 指标 + long allocationRate; // MB/sec + + // High Usage 指标 + double memoryUsage; // 使用率百分比 + + // Proactive 指标 + int gcFrequency; // GC频率 + double fragmentation; // 碎片率 + double systemLoad; // 系统负载 +} +``` + +7. 组合使用策略 + +```java +// GC策略组合示例 +public class GCStrategy { + public void triggerGC(GCMetrics metrics) { + if (isAllocationRateCritical(metrics)) { + // 优先处理分配速率问题 + handleAllocationRate(); + } else if (isHighUsage(metrics)) { + // 其次处理高使用率 + handleHighUsage(); + } else if (shouldTriggerProactive(metrics)) { + // 最后考虑主动GC + handleProactive(); + } + } +} +``` + +8. 建议和最佳实践 + +a) 选择策略: + +```java +// 根据应用特点选择主要策略 +if (isHighThroughputApp()) { + // 关注 Allocation Rate + configureAllocationRateGC(); +} else if (isMemoryIntensiveApp()) { + // 关注 High Usage + configureHighUsageGC(); +} else { + // 使用 Proactive + configureProactiveGC(); +} +``` + +b) 监控和调优: + +```java +// 监控多个指标 +monitorGCMetrics() { + recordAllocationRate(); + recordMemoryUsage(); + recordGCFrequency(); + analyzeAndAdjust(); +} +``` + +9. 常见问题 + +a) Allocation Rate 问题: + +- 突发的大量对象创建 +- 临时对象过多 + +b) High Usage 问题: + +- 内存泄漏 +- 大对象累积 + +c) Proactive 问题: + +- 误判导致不必要的 GC +- 预测模型不准确 + +10. 优化建议 + +根据不同机制采取相应的优化措施: + +```java +// Allocation Rate 优化 +optimizeAllocationRate() { + useObjectPool(); + reuseObjects(); + optimizeCollections(); +} + +// High Usage 优化 +optimizeMemoryUsage() { + removeMemoryLeaks(); + implementCacheStrategy(); + optimizeDataStructures(); +} + +// Proactive 优化 +optimizeProactiveGC() { + tunePredictionModel(); + adjustGCFrequency(); + optimizeHeapLayout(); +} +``` + +理解这三种 GC 触发机制的区别和适用场景,有助于我们更好地配置和优化 ZGC 的性能。 + +# 详细解析 ZGC 的 Minor GC 与 Major GC + +让我详细解析 ZGC 中的 Minor GC 和 Major GC 机制。 + +1. ZGC 的基本特征 + +首先要明确,ZGC 与传统的分代 GC 不同: + +```java +// ZGC 配置示例 +-XX:+UseZGC // 启用 ZGC +-Xmx32g // 设置堆大小 +-XX:ConcGCThreads=4 // 并发 GC 线程数 +-XX:ZCollectionInterval=5 // GC 间隔 +``` + +主要特点: + +- 统一的内存空间(没有严格的分代) +- 基于 Region 的内存管理 +- 并发标记和回收 +- 低延迟(<10ms) + +2. ZGC 中的 Minor GC + +虽然 ZGC 没有严格的分代,但仍有类似 Minor GC 的概念: + +a) 触发条件: + +```java +// 类似的触发逻辑 +if (youngRegionsUsage > threshold || + allocationRate > threshold) { + triggerMinorCollection(); +} +``` + +b) 处理过程: + +- 主要处理新分配的对象 +- 关注短期存活对象 +- 快速回收易死对象 + +c) 实现机制: + +```java +class ZGCMinorCollection { + void collect() { + // 1. 标记新分配的对象 + markNewObjects(); + + // 2. 处理 Remember Set + processRememberedSets(); + + // 3. 回收未标记对象 + evacuateUnmarkedObjects(); + + // 4. 整理内存 + compactIfNeeded(); + } +} +``` + +3. ZGC 中的 Major GC + +ZGC 的 Major GC 特点: + +a) 触发条件: + +```java +// 触发条件示意 +if (heapUsage > majorGCThreshold || + fragmentationLevel > fragmentationLimit || + proactiveGCNeeded()) { + triggerMajorCollection(); +} +``` + +b) 处理过程: + +- 处理整个堆空间 +- 关注长期存活对象 +- 处理跨 Region 引用 + +c) 实现机制: + +```java +class ZGCMajorCollection { + void collect() { + // 1. 并发标记 + concurrentMark(); + + // 2. 并发整理 + concurrentCompact(); + + // 3. 引用处理 + processReferences(); + + // 4. 内存重映射 + remapMemory(); + } +} +``` + +4. 内存布局和管理 + +```java +class ZGCMemoryManager { + // Region 类型 + enum RegionType { + SMALL, // 小对象 Region + MEDIUM, // 中等对象 Region + LARGE // 大对象 Region + } + + // Region 分配策略 + void allocateRegion(Object obj) { + if (obj.size < 256K) { + allocateInSmallRegion(obj); + } else if (obj.size < 4M) { + allocateInMediumRegion(obj); + } else { + allocateInLargeRegion(obj); + } + } +} +``` + +5. GC 触发策略 + +a) Minor GC 触发: + +```java +class MinorGCTrigger { + boolean shouldTrigger() { + return allocationRate > threshold || + youngRegionsUsage > youngThreshold || + timeFromLastMinorGC > interval; + } +} +``` + +b) Major GC 触发: + +```java +class MajorGCTrigger { + boolean shouldTrigger() { + return heapUsage > majorThreshold || + fragmentationLevel > fragmentationLimit || + oldRegionsUsage > oldThreshold; + } +} +``` + +6. 性能监控和调优 + +a) 监控指标: + +```java +class ZGCMetrics { + // GC 相关指标 + long minorGCCount; + long majorGCCount; + long gcPauseTime; + double allocationRate; + double promotionRate; + + // 内存相关指标 + long heapUsage; + long fragmentationLevel; + int activeRegions; +} +``` + +b) 调优参数: + +```java +// GC 调优参数示例 +-XX:ZCollectionInterval=5 +-XX:ZFragmentationLimit=50 +-XX:ZProactiveGCCycles=3 +-XX:ZUncommitDelay=300 +``` + +7. 最佳实践 + +a) Minor GC 优化: + +```java +// 对象分配优化 +class ObjectAllocationOptimizer { + // 使用对象池减少频繁分配 + private final ObjectPool bufferPool; + + // 批量处理减少 GC 压力 + public void processBatch(List dataList) { + // 批量处理逻辑 + } +} +``` + +b) Major GC 优化: + +```java +// 大对象处理优化 +class LargeObjectHandler { + // 避免频繁分配大对象 + private final ByteBuffer preallocatedBuffer; + + // 实现对象复用 + public void processLargeData(byte[] data) { + // 使用预分配的 buffer + } +} +``` + +8. 常见问题处理 + +a) Minor GC 问题: + +```java +// 频繁 Minor GC 问题 +class MinorGCProblemSolver { + void handleHighAllocationRate() { + // 1. 使用对象池 + // 2. 减少临时对象 + // 3. 优化数据结构 + } +} +``` + +b) Major GC 问题: + +```java +// Major GC 问题处理 +class MajorGCProblemSolver { + void handleHighMemoryUsage() { + // 1. 检查内存泄漏 + // 2. 优化缓存策略 + // 3. 增加内存碎片处理 + } +} +``` + +9. 监控和告警 + +```java +class ZGCMonitor { + void monitorGCBehavior() { + // 监控 GC 频率 + trackGCFrequency(); + + // 监控暂停时间 + trackPauseTimes(); + + // 监控内存使用 + trackMemoryUsage(); + + // 设置告警阈值 + setAlertThresholds(); + } +} +``` + +10. 优化建议 + +a) Minor GC 优化建议: + +- 控制对象分配率 +- 使用对象池 +- 避免频繁创建临时对象 +- 合理设置初始堆大小 + +b) Major GC 优化建议: + +- 及时释放不用的对象 +- 控制大对象分配 +- 优化数据结构 +- 合理设置 GC 触发阈值 + +这些内容涵盖了 ZGC 中 Minor GC 和 Major GC 的主要特点和优化方向,希望对你有帮助。 diff --git "a/articles/practice/working/8-\347\275\221\351\241\265\347\210\254\345\217\226\357\274\232Jina Reader\343\200\201Firecrawl \344\270\216 WaterCrawl.md" "b/articles/practice/working/8-\347\275\221\351\241\265\347\210\254\345\217\226\357\274\232Jina Reader\343\200\201Firecrawl \344\270\216 WaterCrawl.md" new file mode 100644 index 000000000..5c55a85ef --- /dev/null +++ "b/articles/practice/working/8-\347\275\221\351\241\265\347\210\254\345\217\226\357\274\232Jina Reader\343\200\201Firecrawl \344\270\216 WaterCrawl.md" @@ -0,0 +1,469 @@ +--- +id: web-scraping-tools-comparison +sidebar_position: 8 +title: Jina Reader、Firecrawl 与 WaterCrawl 网页抓取工具深度对比分析 +description: Jina Reader、Firecrawl 与 WaterCrawl 网页抓取工具深度对比分析 +last_update: + author: Aurelius + date: 2025-08-12 +tags: + - web scraping + - data extraction + - AI tools +--- + +## 工具概述与适用场景 + +在当今数据驱动的 AI 时代,高效获取和处理网络信息变得至关重要。Jina Reader、Firecrawl 和 WaterCrawl 作为三款领先的网页内容抓取工具,各自具备独特的技术特点和适用场景。根据 2025 年最新的工具发展和用户反馈,这三款工具在反爬虫处理、动态渲染支持和数据提取准确性等方面展现出明显差异[(3)](https://www.thetoolnerd.com/p/best-web-scraping-tools-for-ai-applications)。 + +![Cover]() + +[可视化报告](https://www.doubao.com/share/code/ddfb186f19eb99ce) + +### 核心功能与设计理念 + +**Jina Reader**是由 Jina AI 开发的一款专注于网页正文结构化提取的工具,其核心目标是生成 LLM 友好的 Markdown/JSON 格式输出,特别适合多语言内容处理[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。它内置了 Reader-LM 模型(1.5B 参数),支持长文本(最高 512K token)和复杂 Markdown 语法,如表格和代码块等[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +**Firecrawl**是由 MendableAI 开发的全栈网页爬虫工具,主打 "不用写代码也能专业扒数据",能够将整个网站的内容转换成干净、结构化的 Markdown 格式[(10)](https://m.sohu.com/a/852165337_122230620/)。它基于 Rust 语言构建,提供了高性能的数据提取能力,特别擅长处理动态内容和绕过反爬虫机制[(2)](https://openalternative.co/alternatives/jina)。 + +**WaterCrawl**是一个基于 Python、Django、Scrapy 和 Celery 构建的 Web 应用程序,主要用于网页抓取和数据提取。它提供高度可定制的抓取选项,支持多语言搜索和抓取,并提供强大的搜索引擎和 REST API[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +### 技术栈对比 + +从技术架构来看,三款工具各有特色: + +- **Jina Reader**:基于小型语言模型(Reader-LM),端到端处理 HTML 转 Markdown/JSON,结合规则与 NLP 优化[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **Firecrawl**:依赖 Headless 浏览器渲染和传统爬虫逻辑,辅以 LLM Extract 功能提取结构化数据[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **WaterCrawl**:基于 Python 生态系统,使用 Scrapy 作为核心爬虫框架,支持多种客户端 SDK 和插件扩展[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +## 反爬虫处理能力对比 + +在网络爬虫领域,反爬虫处理能力是衡量工具实用性的关键指标之一。面对日益复杂的反爬虫机制,这三款工具采用了不同的技术路线。 + +### Jina Reader 的反爬虫策略 + +Jina Reader 主要通过以下方式应对反爬虫机制: + +- **IP 轮换和频率控制**:支持基本的 IP 轮换和请求频率控制,降低被封禁风险[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **浏览器指纹伪装**:能够模拟真实浏览器的指纹特征,包括 User-Agent、Accept 头和其他 HTTP 头信息[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **简单验证码处理**:对简单的验证码类型(如文本验证码)提供有限支持,但对复杂的交互式验证码处理能力较弱。 + +Jina Reader 的反爬虫策略相对保守,主要针对普通反爬网站设计,对于高反爬网站的处理能力有限[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +### Firecrawl 的反爬虫技术 + +Firecrawl 在反爬虫方面表现出色,具有以下特点: + +- **分布式架构 + 自动代理 IP 切换**:采用分布式架构设计,支持自动代理 IP 切换,大幅降低被封禁风险[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **模仿人类操作**:能够模拟真实用户行为,包括随机延迟、更换 User-Agent 等,使爬虫行为更接近真人操作[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **浏览器环境模拟**:通过 Playwright 等工具模拟完整的浏览器环境,能够处理复杂的 JavaScript 反爬机制[(9)](https://www.cnblogs.com/aibi1/p/18891423)。 + +- **内置 IP 池(需企业版)**:提供企业级 IP 池解决方案,支持大规模爬取任务而不被封禁。 + +Firecrawl 的反爬虫能力在三款工具中最为强大,尤其适合处理高反爬网站,实测被封概率降低约 80%[(10)](https://m.sohu.com/a/852165337_122230620/)。 + +### WaterCrawl 的反爬虫机制 + +WaterCrawl 的反爬虫策略主要包括: + +- **代理 IP 支持**:支持使用代理 IP 池,可配置多个代理 IP 地址进行轮换使用[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +- **请求头伪装**:允许自定义请求头信息,包括 User-Agent、Referer 等,模拟不同浏览器和设备的访问行为[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +- **随机请求间隔**:支持设置随机的请求时间间隔,避免形成规律的请求模式,降低被检测为爬虫的风险[(45)](https://blog.csdn.net/qq_34216606/article/details/142550931)。 + +- **分布式爬取**:支持分布式爬取架构,可将任务分配到多个节点上同时运行,分散请求流量[(45)](https://blog.csdn.net/qq_34216606/article/details/142550931)。 + +WaterCrawl 的反爬虫功能较为全面,但相比 Firecrawl,在自动化和智能化方面稍逊一筹,需要用户进行更多的手动配置[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +### 反爬虫能力总结 + +| 反爬虫功能 | Jina Reader | Firecrawl | WaterCrawl | +| ------------ | ----------- | --------- | ---------- | +| 代理 IP 支持 | ★★☆☆☆ | ★★★★★ | ★★★☆☆ | +| 请求头伪装 | ★★★☆☆ | ★★★★☆ | ★★★☆☆ | +| 验证码处理 | ★★☆☆☆ | ★★★☆☆ | ★★☆☆☆ | +| 动态渲染支持 | ★★★☆☆ | ★★★★★ | ★★★☆☆ | +| 分布式爬取 | ★★☆☆☆ | ★★★★☆ | ★★★☆☆ | +| 自动化程度 | ★★★☆☆ | ★★★★★ | ★★☆☆☆ | +| 整体评分 | 2.2/5 | 4.3/5 | 2.8/5 | + +**结论**:在反爬虫处理方面,Firecrawl 明显领先,提供了最全面的解决方案;WaterCrawl 次之,提供了较为灵活的配置选项;Jina Reader 相对较弱,主要针对普通反爬网站设计[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +## 动态渲染支持能力对比 + +现代网页越来越多地采用 JavaScript 动态加载内容,这对爬虫工具的动态渲染支持提出了更高要求。以下是三款工具在动态渲染方面的对比。 + +### Jina Reader 的动态渲染支持 + +Jina Reader 对动态渲染的支持主要体现在: + +- **基于 Headless 浏览器(如 Chrome)渲染**:能够渲染执行 JavaScript 生成的内容,精准提取动态生成的页面元素[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **单页应用(SPA)支持**:对 React、Vue 等框架构建的单页应用有较好的支持,能够处理基本的路由变化和组件渲染[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **懒加载内容处理**:能够处理常见的懒加载内容,如图像、评论区瀑布流等[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +Jina Reader 的动态渲染能力适中,能够满足大多数动态网页的抓取需求,但对复杂交互场景的支持有限[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +### Firecrawl 的动态渲染技术 + +Firecrawl 在动态渲染方面表现突出: + +- **无头浏览器和智能状态管理**:通过无头浏览器和智能状态管理抓取动态页面,支持分页和流式传输[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **全浏览器环境模拟**:使用 Playwright 等工具模拟完整的浏览器环境,能够执行复杂的 JavaScript 代码,处理各种动态交互场景[(9)](https://www.cnblogs.com/aibi1/p/18891423)。 + +- **瀑布流和动态加载内容处理**:特别擅长抓取动态加载的内容,如评论区瀑布流、加密数据流等[(11)](https://www.iesdouyin.com/share/video/7485225744096841017/?did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&from_aid=1128&from_ssr=1&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&mid=7485225614291651339®ion=&scene_from=dy_open_search_video&share_sign=oi0m6Nc05b7zM74eciBvvd3D4LS..SS_5pXhgixXdaA-&share_version=280700&titleType=title&ts=1755004138&u_code=0&video_share_track_ver=&with_sec_did=1)。 + +- **模拟用户操作**:能够模拟下拉、点击按钮等用户操作,抓取需要交互才能显示的内容[(10)](https://m.sohu.com/a/852165337_122230620/)。 + +Firecrawl 的动态渲染能力在三款工具中最强,实测能够处理各种复杂的动态内容,包括单页应用、瀑布流加载和 JavaScript 加密数据[(9)](https://www.cnblogs.com/aibi1/p/18891423)。 + +### WaterCrawl 的动态渲染支持 + +WaterCrawl 的动态渲染支持主要包括: + +- **JavaScript 渲染支持**:提供基本的 JavaScript 渲染能力,能够执行简单的 JavaScript 代码并提取渲染后的内容[(12)](https://halotool.com/zh/tool/watercrawl)。 + +- **异步加载内容处理**:支持处理异步加载的内容,通过设置适当的等待时间确保内容完全加载[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +- **可定制的渲染参数**:允许用户自定义渲染参数,如等待时间、视口大小等,以适应不同网页的需求[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +WaterCrawl 的动态渲染能力相对有限,主要针对一般动态网页设计,对复杂的单页应用和交互场景支持不足[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +### 动态渲染能力总结 + +| 动态渲染功能 | Jina Reader | Firecrawl | WaterCrawl | +| ------------------- | ----------- | --------- | ---------- | +| 无头浏览器支持 | ★★★☆☆ | ★★★★★ | ★★☆☆☆ | +| 单页应用(SPA)支持 | ★★★☆☆ | ★★★★☆ | ★★☆☆☆ | +| 瀑布流 / 懒加载支持 | ★★★☆☆ | ★★★★★ | ★★☆☆☆ | +| 交互操作模拟 | ★★☆☆☆ | ★★★★☆ | ★☆☆☆☆ | +| 渲染速度 | ★★★☆☆ | ★★★★☆ | ★★☆☆☆ | +| 自定义渲染参数 | ★★★☆☆ | ★★★☆☆ | ★★★☆☆ | +| 整体评分 | 2.7/5 | 4.3/5 | 1.8/5 | + +**结论**:在动态渲染支持方面,Firecrawl 再次领先,能够处理各种复杂的动态内容和交互场景;Jina Reader 次之,能够满足大多数动态网页的抓取需求;WaterCrawl 相对较弱,主要适用于简单动态内容的处理[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +## 数据提取准确性对比 + +数据提取准确性是衡量网页抓取工具质量的核心指标之一,直接影响后续数据分析和应用的效果。 + +### Jina Reader 的数据提取能力 + +Jina Reader 的数据提取特点包括: + +- **基于 Reader-LM 模型的智能提取**:内置 1.5B 参数的 Reader-LM 模型,能够智能识别和提取页面中的主要内容,包括标题、正文、图片和链接等[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **多语言支持**:对多种语言(包括中文、英文、日文等)的内容提取效果良好,特别适合多语言内容处理场景[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **结构化输出优化**:支持生成 LLM 友好的 Markdown/JSON 格式输出,内置对表格、代码块等复杂 Markdown 语法的支持[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **长文本处理能力**:支持处理长文本(最高 512K token),能够完整提取长篇文章内容并保持结构完整性[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +Jina Reader 在数据提取方面表现出色,特别是对结构化内容和长文本的处理能力,但其对嵌套结构或非标准 HTML 的解析可能出错,需要依赖模型迭代优化[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +### Firecrawl 的数据提取技术 + +Firecrawl 的数据提取功能具有以下特点: + +- **LLM 驱动的内容净化**:内置 LLM Extract 功能,利用大语言模型自动识别并过滤广告、导航栏、版权声明等无关内容,输出纯净的正文内容[(9)](https://www.cnblogs.com/aibi1/p/18891423)。 + +- **智能解析与结构化输出**:能够自动识别网页中的关键信息,如标题、正文、作者、发布时间等,并生成结构化的 Markdown 或 JSON 输出[(9)](https://www.cnblogs.com/aibi1/p/18891423)。 + +- **增强 Markdown 解析**:优化文本质量,适合直接用于 LLM 训练和 RAG(检索增强生成)任务[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **多格式输出适配**:支持将抓取结果转换为 Markdown、JSON、HTML 或图片等多种格式,直接满足不同场景的输入需求[(9)](https://www.cnblogs.com/aibi1/p/18891423)。 + +Firecrawl 的数据提取准确性较高,特别是在内容净化和结构化输出方面表现突出,但其对高度动态或非标准结构的网页可能需要手动配置规则[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +### WaterCrawl 的数据提取能力 + +WaterCrawl 的数据提取功能主要包括: + +- **精确内容提取**:提供带有可定制选择器的精确内容提取功能,用户可以通过 CSS 选择器或 XPath 表达式精确定位所需内容[(12)](https://halotool.com/zh/tool/watercrawl)。 + +- **多语言支持**:支持不同语言的内容提取,能够针对特定国家进行定位[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +- **高级结果处理**:支持下载和处理搜索结果,具有多种自定义参数,如提取深度、速度和目标内容定位等[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +- **插件系统扩展**:通过插件系统可以扩展数据提取功能,满足特定领域的需求[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +WaterCrawl 的数据提取准确性取决于用户的配置能力,提供了较高的灵活性,但对非技术用户来说可能有一定的学习曲线[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +### 数据提取准确性总结 + +| 数据提取功能 | Jina Reader | Firecrawl | WaterCrawl | +| ---------------- | ----------- | --------- | ---------- | +| 内容识别准确性 | ★★★★☆ | ★★★★☆ | ★★★☆☆ | +| 结构化输出质量 | ★★★★☆ | ★★★★☆ | ★★★☆☆ | +| 多语言支持 | ★★★★★ | ★★★☆☆ | ★★★☆☆ | +| 长文本处理 | ★★★★★ | ★★★☆☆ | ★★★☆☆ | +| 嵌套结构处理 | ★★★☆☆ | ★★★☆☆ | ★★★★☆ | +| 非标准 HTML 支持 | ★★★☆☆ | ★★★☆☆ | ★★★★☆ | +| 自定义提取规则 | ★★★☆☆ | ★★★☆☆ | ★★★★☆ | +| 整体评分 | 3.9/5 | 3.4/5 | 3.3/5 | + +**结论**:在数据提取准确性方面,三款工具各有优势。Jina Reader 在多语言支持和长文本处理方面表现最佳;Firecrawl 在内容净化和结构化输出方面更为出色;WaterCrawl 则提供了更高的灵活性和自定义能力[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +## 其他关键特性对比 + +除了上述三个核心维度外,还有一些其他关键特性值得比较,这些特性也会影响工具的选择和使用体验。 + +### 性能与速度对比 + +- **Jina Reader**:单次请求延迟较高(平均 3 秒),但输出结构化程度高[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。免费版速率限制较低(20 RPM),商业用途需联系授权[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **Firecrawl**:基于 Rust 语言构建,性能卓越,分布式架构提升抓取速度,实测速度比 Scrapy 快 4 倍[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。免费额度足够中小规模使用,但大规模抓取需付费或自建节点[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **WaterCrawl**:基于 Python 和 Scrapy,性能中等,支持异步处理和分布式部署,可通过扩展节点提升性能[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。提供多种客户端 SDK,支持高并发爬取[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +在性能方面,Firecrawl 的速度最快,特别适合大规模爬取任务;Jina Reader 速度较慢但输出质量高;WaterCrawl 性能中等,但扩展性较好[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +### 易用性与学习曲线 + +- **Jina Reader**:API 开箱即用,适合无编程经验用户,但深度定制需理解模型调优[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。提供 RESTful API,支持搜索验证(s.jina.ai)与内容验证(r.jina.ai)结合[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **Firecrawl**:提供简洁的 API 和 5 行代码实现基础功能的 Python SDK,学习成本低[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。无需编写代码即可使用,适合非技术用户[(10)](https://m.sohu.com/a/852165337_122230620/)。 + +- **WaterCrawl**:提供多种语言的客户端 SDK,但需要一定的编程基础[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。自托管和开源,用户可完全控制自己的数据,但部署和配置相对复杂[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +在易用性方面,Firecrawl 和 Jina Reader 更适合非技术用户,而 WaterCrawl 则更适合有一定编程经验的用户[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +### 集成能力与生态系统 + +- **Jina Reader**:提供 RESTful API,支持与其他 AI 系统集成[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **Firecrawl**:提供统一 API 及多语言 SDK(Python/Go/Rust),支持与 Langchain、Dify 等平台集成[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **WaterCrawl**:提供完整的 REST API 和 OpenAPI 文档支持,与 Dify、N8N 等 AI / 自动化平台深度集成[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。支持多种客户端 SDK(Python、Node.js、Go、PHP 等)[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +在集成能力方面,WaterCrawl 的生态系统最为丰富,支持多种客户端和平台集成;Firecrawl 次之,提供了良好的 AI 平台集成支持;Jina Reader 则相对单一,主要提供 REST API[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +### 成本与定价模式 + +- **Jina Reader**:免费版速率限制较低(20 RPM),商业用途需联系授权[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **Firecrawl**:免费额度足够中小规模使用,但大规模抓取需付费或自建节点[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。在~ 100k 页面 / 月的规模下,Firecrawl 比 Jina Reader 便宜 4-5 倍[(1)](https://blog.apify.com/jina-ai-vs-firecrawl/)。 + +- **WaterCrawl**:提供免费计划(1000 页面信用,每日 100 页面信用)、创业版(€19.00 / 月)和企业版(€99.00 / 月)[(12)](https://halotool.com/zh/tool/watercrawl)。自托管版本完全免费,但需要自行承担服务器成本[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +在成本方面,Firecrawl 在大规模使用时性价比最高;WaterCrawl 提供了灵活的定价模式,自托管版本适合有服务器资源的用户;Jina Reader 的商业授权成本较高[(1)](https://blog.apify.com/jina-ai-vs-firecrawl/)。 + +## 综合评估与选择建议 + +基于以上全方位的对比分析,我们可以对这三款工具进行综合评估,并针对不同的使用场景提供选择建议。 + +### 综合评分表 + +| 评估维度 | Jina Reader | Firecrawl | WaterCrawl | +| -------------- | ----------- | --------- | ---------- | +| 反爬虫处理能力 | 2.2/5 | 4.3/5 | 2.8/5 | +| 动态渲染支持 | 2.7/5 | 4.3/5 | 1.8/5 | +| 数据提取准确性 | 3.9/5 | 3.4/5 | 3.3/5 | +| 性能与速度 | 2.5/5 | 4.0/5 | 3.0/5 | +| 易用性 | 3.5/5 | 4.0/5 | 2.5/5 | +| 集成能力 | 2.5/5 | 3.5/5 | 4.0/5 | +| 成本效益 | 2.5/5 | 4.0/5 | 3.5/5 | +| 总分 | 20.8/35 | 27.0/35 | 20.9/35 | + +### 场景化选择建议 + +根据不同的使用场景,以下是具体的工具选择建议: + +1. **LLM 训练数据采集**: + +- 最佳选择:**Firecrawl** + +- 理由:强大的动态渲染和反爬虫能力,能够采集高质量的多样化数据;LLM 驱动的内容净化功能可直接生成适合训练的数据集[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- 典型应用:爬取学术论文、行业报告等海量网页内容,生成高质量训练数据集[(9)](https://www.cnblogs.com/aibi1/p/18891423)。 + +2. **检索增强生成(RAG)支持**: + +- 最佳选择:**Jina Reader** + +- 理由:专注于生成 LLM 友好的结构化输出,多语言支持优秀;长文本处理能力出色,适合构建知识库[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- 典型应用:构建 RAG 系统知识库,支持实时问答和信息检索[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +3. **企业级数据采集与分析**: + +- 最佳选择:**WaterCrawl** + +- 理由:提供自托管和开源部署选项,数据安全可控;支持多种客户端 SDK 和平台集成,可与现有系统无缝对接[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +- 典型应用:市场分析、竞争情报收集、内容聚合等企业级数据应用[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +4. **高反爬网站内容抓取**: + +- 最佳选择:**Firecrawl** + +- 理由:强大的反爬虫能力和浏览器环境模拟,能够应对各种复杂的反爬机制;分布式架构和代理 IP 支持适合大规模爬取[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- 典型应用:抓取电商平台、社交媒体等高反爬网站的内容[(9)](https://www.cnblogs.com/aibi1/p/18891423)。 + +5. **多语言内容处理**: + +- 最佳选择:**Jina Reader** + +- 理由:内置多语言支持,对不同语言的内容提取效果良好;Reader-LM 模型对多语言语义理解准确[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- 典型应用:多语言知识库构建、跨语言内容分析等场景[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +6. **动态内容抓取**: + +- 最佳选择:**Firecrawl** + +- 理由:能够模拟完整的浏览器环境,处理各种动态交互场景;支持瀑布流和动态加载内容的抓取[(9)](https://www.cnblogs.com/aibi1/p/18891423)。 + +- 典型应用:抓取评论区瀑布流、动态加载的产品列表等内容[(10)](https://m.sohu.com/a/852165337_122230620/)。 + +7. **自定义爬虫开发**: + +- 最佳选择:**WaterCrawl** + +- 理由:基于 Python 和 Scrapy,提供开放的插件系统和 SDK;自托管部署允许完全控制爬虫逻辑[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +- 典型应用:需要高度定制化爬虫逻辑的场景,如特定领域数据采集[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +### 工具互补性分析 + +值得注意的是,这三款工具并非完全互斥,在某些场景下可以结合使用,发挥各自的优势: + +- **Jina Reader + Firecrawl**:使用 Firecrawl 抓取大规模数据,再通过 Jina Reader 清洗为结构化格式,提升最终数据质量[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +- **WaterCrawl + Firecrawl**:使用 WaterCrawl 进行基础数据采集,利用 Firecrawl 处理复杂的动态内容和高反爬网站[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +- **Jina Reader + WaterCrawl**:使用 Jina Reader 生成高质量的结构化数据,通过 WaterCrawl 的集成能力与现有系统对接[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +## 结论 + +通过对 Jina Reader、Firecrawl 和 WaterCrawl 三款工具的全面对比分析,我们可以得出以下结论: + +1. **Firecrawl**在反爬虫处理能力和动态渲染支持方面表现最为出色,特别适合处理高反爬网站和复杂动态内容,是大规模数据采集的首选工具[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +2. **Jina Reader**在数据提取准确性和多语言支持方面优势明显,生成的 LLM 友好输出特别适合 RAG 系统和多语言知识库构建[(6)](https://blog.csdn.net/A_Tevens/article/details/147296700)。 + +3. **WaterCrawl**提供了最高的灵活性和自定义能力,丰富的生态系统和自托管选项使其成为企业级数据应用的理想选择[(13)](https://blog.csdn.net/gitblog_00466/article/details/147876460)。 + +随着 AI 技术的不断发展,网页抓取工具也在不断进化。未来趋势包括: + +- **AI 驱动的内容理解**:更深入集成语义理解能力,自动识别网页主题、生成抓取策略描述语言(GDSL)。 + +- **增强的多模态处理能力**:不仅支持文本抓取,还能处理图像、视频等多媒体内容。 + +- **更智能的反反爬技术**:随着反爬虫技术的进步,抓取工具将发展更智能的反反爬策略[(43)](https://blog.csdn.net/Saki_Python/article/details/133739901)。 + +- **低代码 / 无代码化**:进一步降低使用门槛,使非技术用户也能轻松进行数据采集[(10)](https://m.sohu.com/a/852165337_122230620/)。 + +在选择网页抓取工具时,应根据具体需求和使用场景进行评估,必要时可结合多种工具,发挥各自的优势,实现最佳的数据采集效果。同时,必须遵守法律法规和目标网站的使用条款,尊重 Robots 协议,避免滥用爬虫技术[(45)](https://blog.csdn.net/qq_34216606/article/details/142550931)。 + +**参考资料 ** + +[1] [Jina AI vs. Firecrawl for web-to-LLM extraction](https://blog.apify.com/jina-ai-vs-firecrawl/) + +[2] [Open Source Jina AI Alternatives](https://openalternative.co/alternatives/jina) + +[3] [Best Web Scraping Tools for AI Applications: My Favourites](https://www.thetoolnerd.com/p/best-web-scraping-tools-for-ai-applications) + +[4] [Top 7 AI-Powered Web Scraping Solutions in 2025](https://www.firecrawl.dev/blog/ai-powered-web-scraping-solutions-2025) + +[5] [Effortless Web Scraping: Firecrawl and Universal Scrapers for Data Extraction](https://www.toolify.ai/ai-news/effortless-web-scraping-firecrawl-and-universal-scrapers-for-data-extraction-3657368) + +[6] [网页爬虫工具对比\_watercrawl-CSDN 博客](https://blog.csdn.net/A_Tevens/article/details/147296700) + +[7] [动态渲染的通用解决办法 splash 渲染和 puppeteer 渲染区别-CSDN 博客](https://blog.csdn.net/weixin_43870646/article/details/105314546) + +[8] [5- Python 网络爬虫 — 如何突破 JS 动态渲染壁垒?工具原理与实战全解析-CSDN 博客](https://blog.csdn.net/wh1236666/article/details/150070095) + +[9] [Firecrawl - 向着朝阳 - 博客园](https://www.cnblogs.com/aibi1/p/18891423) + +[10] [非常好用的开源爬虫 AI 工具!无需编程也能轻松抓取网站数据!(内附同类其他工具对比)*Scrapy*网页\_代码](https://m.sohu.com/a/852165337_122230620/) + +[11] [AI 爬虫黑科技 FireCrawl 一秒抓取网页数据一键爬取网页数据,开源网页数据抓取零门槛爬取网页数据,免费开源网页数据抓取神器!-抖音](https://www.iesdouyin.com/share/video/7485225744096841017/?did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&from_aid=1128&from_ssr=1&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&mid=7485225614291651339®ion=&scene_from=dy_open_search_video&share_sign=oi0m6Nc05b7zM74eciBvvd3D4LS..SS_5pXhgixXdaA-&share_version=280700&titleType=title&ts=1755004138&u_code=0&video_share_track_ver=&with_sec_did=1) + +[12] [WaterCrawl - 高效将网站转化为结构化数据。](https://halotool.com/zh/tool/watercrawl) + +[13] [WaterCrawl:强大的网页爬取工具-CSDN 博客](https://blog.csdn.net/gitblog_00466/article/details/147876460) + +[14] [WaterCrawl: AI 友好的网页爬虫和内容提取平台,用于结构化数据。](https://www.toolify.ai/zh/tool/watercrawl) + +[15] [一款功能强大的网页爬虫与数据提取工具:WaterCrawl – Linux-技术共享](https://linuxword.com/?amp=1&p=47429) + +[16] [登录人人都是产品经理即可获得以下权益\_人人都是产品经理](http://m.toutiao.com/group/7501202633311388172/?upstream_biz=doubao) + +[17] [Web Scraping for LLM in 2024: Jina AI Reader API, FireCrawl, and More](https://datatunnel.io/tldr_listing/web-scraping-for-llm-in-2024-jina-ai-reader-api-firecrawl-and-more/) + +[18] [Best AI tools for Crawl Websites](https://toolerific.ai/ai-tools-for-tasks/crawl-websites.html) + +[19] [Jina Reader Alternatives](https://www.aitoolnet.com/alternative/jina-reader) + +[20] [firecrawl](https://github.com/topics/firecrawl) + +[21] [爬虫纯开源、自托管解决方案——WaterCrawl\_风铃开源情报社](http://m.toutiao.com/group/7520547482179404322/?upstream_biz=doubao) + +[22] [进击的反爬机制 - 天存信息 - 博客园](https://www.cnblogs.com/tcxa/p/15079726.html) + +[23] [反爬虫策略收录 - 鱼 007 - 博客园](https://www.cnblogs.com/yu007/p/17916744.html) + +[24] [爬虫技术和逆向工程技能在现代 Web 开发中,爬虫技术和逆向工程技能对于获取和处理数据至关重要。WebJS 爬虫(Web - 掘金](https://juejin.cn/post/7406204591354806310) + +[25] [【反爬大核弹】大厂策划们,我来教教你们如何让网站反爬虫-抖音](https://www.iesdouyin.com/share/video/7316138742270446902/?did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&from_aid=1128&from_ssr=1&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&mid=7316138995325487882®ion=&scene_from=dy_open_search_video&share_sign=oSiD4ppNaIyshHCW7454DcZkNCOUROxjSH.ur7KaZME-&share_version=280700&titleType=title&ts=1755004183&u_code=0&video_share_track_ver=&with_sec_did=1) + +[26] [推荐开源项目:Waterfox 源代码 —— 独立且强大的浏览器引擎-CSDN 博客](https://blog.csdn.net/gitblog_00040/article/details/138702522) + +[27] [40.8K star!让 AI 帮你读懂整个互联网:Crawl4AI 开源爬虫工具深度解析\`Crawl4AI\` 是 2025 年 G - 掘金](https://juejin.cn/post/7496864773541871679) + +[28] [爬虫学习——获取动态网页信息\_spider-flow 获取动态网页-CSDN 博客](https://blog.csdn.net/qq_64296768/article/details/147458435) + +[31] [watercrawl/WaterCrawl](https://github.com/watercrawl/watercrawl) + +[32] [WaterCrawl](https://github.com/watercrawl) + +[33] [[FEATURE] Improve Docker Setup to Support Plugin Integration Easily #45](https://github.com/watercrawl/WaterCrawl/issues/45) + +[34] [🔥 Firecrawl](https://github.com/pigracing/w-firecrawl) + +[35] [WaterCrawl Node.js Client](https://www.npmjs.com/package/@watercrawl/nodejs) + +[36] [4 万 Star Crawl4AI !1 分钟整理网页到知识库-抖音](https://www.iesdouyin.com/share/video/7495819416920165644/?did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&from_aid=1128&from_ssr=1&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&mid=7495820943860828966®ion=&scene_from=dy_open_search_video&share_sign=BMTHWGdLMIUFwX8j9IZc2V_8YUQAKceSE7Tx6cBx6Lc-&share_version=280700&titleType=title&ts=1755004201&u_code=0&video_share_track_ver=&with_sec_did=1) + +[37] [「Github 一周热点 43 期」LLM 的爬虫、网页变 APP 等 GitHub 一周热点汇总第 43 期(2024/09/29-10/05),本期内容包括面向 LLM 的爬虫、网页一键变 APP、AI 屏幕录制、分布式 AI 推理框架和开源金融分析工具,一起来看具体内容吧,视频制作不易需要一个三连哈。-抖音](https://www.iesdouyin.com/share/video/7422599299902557480/?did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&from_aid=1128&from_ssr=1&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&mid=7422599279325317915®ion=&scene_from=dy_open_search_video&share_sign=L4ubz7in3JUqFmh0Z0YXsq1tT74vrLict.sHaCfsZ.4-&share_version=280700&titleType=title&ts=1755004194&u_code=0&video_share_track_ver=&with_sec_did=1) + +[38] [Splash 动态页面爬虫\_splash 爬虫模拟点击-CSDN 博客](https://blog.csdn.net/jeff_/article/details/78895942) + +[39] [[Advanced] Tips for Web Scraping Dynamic Pages: Using the Splash Rendering Engine to Handle JavaScript-Driven Websites - CSDN 文库](https://wenku.csdn.net/column/765vb6vhur) + +[40] [JavaScript 动态渲染页面爬取——Splash 的使用\_splash 渲染服务-CSDN 博客](https://blog.csdn.net/weixin_41905135/article/details/137190635) + +[41] [动态水波纹焦散教程丨使用 D5 实时焦散制作泳池动态水波纹。-抖音](https://www.iesdouyin.com/share/video/7271139777867468084/?did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&from_aid=1128&from_ssr=1&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&mid=7271139893995178807®ion=&scene_from=dy_open_search_video&share_sign=jzXPHnQ8bVPlLB515VRW5a.YzMhlSdZIoFbBlVnEi_w-&share_version=280700&titleType=title&ts=1755004222&u_code=0&video_share_track_ver=&with_sec_did=1) + +[42] [#原创保护计划 #酷家乐 #酷家乐渲染视频 酷家乐渲染进阶。大家期待的雨水滚动玻璃教程出来了。-抖音](https://www.iesdouyin.com/share/video/7149030621514304809/?did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&from_aid=1128&from_ssr=1&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&mid=7149030674047961870®ion=&scene_from=dy_open_search_video&share_sign=Qka2xKlk9SeXy4xSSEmhPqnEx1NUNeDPemrM0ECYu74-&share_version=280700&titleType=title&ts=1755004222&u_code=0&video_share_track_ver=&with_sec_did=1) + +[43] [网站有反爬机制就爬不了数据?那是你不会【反】反爬\_虎扑有反爬虫机制吗-CSDN 博客](https://blog.csdn.net/Saki_Python/article/details/133739901) + +[44] [爬虫-反爬 - 星光闪闪 - 博客园](https://www.cnblogs.com/xgss/articles/18630085) + +[45] [绕过反爬虫机制:数据采集的全面解决方案\_forbid spider access-CSDN 博客](https://blog.csdn.net/qq_34216606/article/details/142550931) + +[46] [爬虫突破反爬教程:入门级实操指南-原创手记-慕课网](https://m.imooc.com/article/356036) + +[47] [Python 爬虫技巧:使用代理 IP 和 User-Agent 应对反爬虫机制-腾讯云开发者社区-腾讯云](https://cloud.tencent.com/developer/article/2327719) + +[48] [爬虫:学习笔记之常见反爬虫策略及应对技巧 51CTO 博客 反爬虫策略](https://blog.51cto.com/u_15349906/3718494) + +[49] [Python 爬虫技巧:使用代理 IP 和 User-Agent 应对反爬虫机制-抖音](https://www.iesdouyin.com/share/video/7277452510493773119/?did=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&from_aid=1128&from_ssr=1&iid=MS4wLjABAAAANwkJuWIRFOzg5uCpDRpMj4OX-QryoDgn-yYlXQnRwQQ&mid=7277452719877606202®ion=&scene_from=dy_open_search_video&share_sign=OsGb_mB2FYunXfHTk3TfWAyQNsjr27r.5D3Eu.Qn9JY-&share_version=280700&titleType=title&ts=1755004222&u_code=0&video_share_track_ver=&with_sec_did=1) + +> (注:文档部分内容由 AI 生成) + +--- + +**PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!** diff --git "a/articles/practice/working/9-IPLocation \345\205\250\347\220\203\344\276\233\345\272\224\345\225\206\346\267\261\345\272\246\350\260\203\347\240\224\345\210\206\346\236\220.md" "b/articles/practice/working/9-IPLocation \345\205\250\347\220\203\344\276\233\345\272\224\345\225\206\346\267\261\345\272\246\350\260\203\347\240\224\345\210\206\346\236\220.md" new file mode 100644 index 000000000..8b21283ec --- /dev/null +++ "b/articles/practice/working/9-IPLocation \345\205\250\347\220\203\344\276\233\345\272\224\345\225\206\346\267\261\345\272\246\350\260\203\347\240\224\345\210\206\346\236\220.md" @@ -0,0 +1,689 @@ +--- +id: ip-location-vendors-comparison-global +sidebar_position: 9 +title: IPLocation 全球供应商深度调研分析 +description: IPLocation 全球供应商深度调研分析 +last_update: + author: Aurelius + date: 2025-08-13 +tags: + - IPLocation + - IP 地址解析 +--- + +## 背景与目标 + +随着互联网应用的全球化发展,准确的 IP 地址解析服务已成为众多业务场景的基础需求,包括反欺诈、用户分析、内容本地化等。。通过 IP 地址解析服务确定用户地理位置,实现内容、服务和广告的个性化展示,已成为众多互联网产品的基础功能[(2)](https://www.ip2location.com/web-service/ip2location)。 + +本报告针对六家主流 IP 地址解析服务提供商进行深入分析,旨在为每月预算约 100 美元、需要支持 3 次 / 秒请求量、每周数据更新且精度至少达到城市级的内容本地化需求,提供最优服务商选择建议。 + +![Cover]() + +[可视化报告](https://www.doubao.com/share/code/b50cdfd9d65f829d) + +### 需求概述 + +根据背景目标,我们确定了以下几个关键评估指标: + +1. **地理定位精度**:至少达到城市级别的定位能力,这是内容本地化的基础要求[(70)](https://www.ip2location.com/faqs/db19-ip-country-region-city-latitude-longitude-isp-domain-mobile) + +2. **全球覆盖**:服务需覆盖全球范围,解析精度至少达到城市级别 + +3. **更新频率**:数据库更新频率最好为周更或半月更 + +4. **并发能力**:能满足 3 Request/Second 的并发请求量 + +5. **预算限制**:每月预算不超过 $100 + +6. **合规要求**:需满足 GDPR 等数据保护法规要求 + +此外,本报告还将评估采用供应商数据库解决方案(即不使用在线 API 而是下载数据库到本地使用)的可行性。 + +### 评估对象与方法 + +本报告将对以下主流 IP 地址解析服务进行深入分析: + +1. [IP2Location](https://www.ip2location.com/) + +2. [Geolocation.com](https://www.geolocation.com/) + +3. [WhatIsMyIPAddress.com](https://whatismyipaddress.com/) + +4. [IPLocation.io](https://iplocation.io/) + +5. [IPAddress.my](https://ipaddress.my/) + +6. [MaxMind](https://www.maxmind.com/) + +评估方法主要基于各服务商的官方文档、技术博客、第三方评测以及实际测试数据,确保信息的准确性和客观性。 + +## 主流 IP 地址解析服务评估 + +### IP2Location 评估 + +**覆盖范围与精度**: + +IP2Location 提供全球范围的 IP 地址解析服务,覆盖超过 110,000 个城市[(99)](https://www.ip2location.com/database/db10-ip-country-region-city-latitude-longitude-zipcode-isp-domain)。其数据库精度在国家级别达到 99%,城市级别约为 75%[(7)](https://cloud.tencent.com/developer/ask/sof/106805937)。IP2Location 提供从国家、地区、城市到街道级别的多维度数据,满足不同精度需求[(4)](https://lite.ip2location.com/?lang=zh_CN)。 + +**更新频率**: + +IP2Location 数据库更新频率为**半月度**(semi-monthly)更新[(47)](https://www.ip2location.com/database/db3-ip-country-region-city),确保数据的相对时效性。但根据其 FAQ,数据库通常在每月初更新一次[(20)](https://www.ip2location.com/faqs/db10-ip-country-region-city-latitude-longitude-zipcode-isp-domain),这表明可能存在不同产品线更新频率不一致的情况。 + +**并发请求能力**: + +IP2Location 提供 REST API 服务,其 API 性能和并发能力取决于所选套餐。基础套餐可能有请求频率限制,需升级到更高套餐才能满足更高并发需求[(15)](https://www.ip2location.com/web-service/ip2location)。 + +**定价分析**: + +IP2Location 提供多种定价方案: + +- LITE 版本:免费,适合个人或小型应用,但准确性有限[(4)](https://lite.ip2location.com/?lang=zh_CN) + +- 付费版本起价为 **$49/月**,按使用量阶梯定价,额外请求按$10/30k 计算 + +- 企业级数据库下载价格较高,如 IP-Country-Region-City-Latitude-Longitude-ZIPCode-TimeZone-ISP-Domain 数据库价格为 **$2,499 / 服务器**[(13)](https://www.ip2location.com/database/db16-ip-country-region-city-latitude-longitude-zipcode-timezone-isp-domain-netspeed-areacode) + +**GDPR 合规性**: + +IP2Location 宣称其产品设计符合 GDPR 要求,提供选项显示 Cookie 同意横幅,增强用户数据使用透明度[(9)](https://pluginoracle.com/wp/ip2location-redirection)。此外,其合作伙伴如 Appy Pie 也声明符合 GDPR 和 CCPA 等数据保护法规[(26)](https://www.appypie.com/connect/apps/postgresql/integrations/ip2location)。 + +**本地数据库可行性**: + +IP2Location 支持数据库下载,可在本地服务器部署。数据库文件格式为 CSV 或二进制格式,可根据需要选择不同精度的数据库[(4)](https://lite.ip2location.com/?lang=zh_CN)。本地化部署可避免网络延迟和数据泄露风险,解析速度可达毫秒级,满足高并发场景需求[(6)](http://m.163.com/dy/article/K470M8GU0553MFFW.html)。 + +### [Geolocation.com](https://Geolocation.com)评估 + +**覆盖范围与精度**: + +[Geolocation.com](https://Geolocation.com)的 IP 地理定位服务提供国家、地区、城市、纬度 / 经度等信息[(66)](https://www.geolocation.com/ip-geolocation-api)。但公开资料中未明确其全球覆盖范围和具体精度数据。 + +**更新频率**: + +公开资料中未找到[Geolocation.com](https://Geolocation.com)的数据库更新频率信息。 + +**并发请求能力**: + +[Geolocation.com](https://Geolocation.com)提供的 IP2Location IP 地理定位 Web 服务是一个 REST API 服务,其并发能力和请求限制未在公开资料中明确说明[(66)](https://www.geolocation.com/ip-geolocation-api)。 + +**定价分析**: + +公开资料中未找到[Geolocation.com](https://Geolocation.com)的具体定价信息。 + +**GDPR 合规性**: + +公开资料中未找到[Geolocation.com](https://Geolocation.com)的 GDPR 合规性声明。 + +**本地数据库可行性**: + +公开资料中未找到[Geolocation.com](https://Geolocation.com)支持本地数据库下载的信息。 + +### [WhatIsMyIPAddress.com](https://WhatIsMyIPAddress.com)评估 + +**覆盖范围与精度**: + +[WhatIsMyIPAddress.com](https://WhatIsMyIPAddress.com)提供 IP 地址定位服务,但其精度和覆盖范围在公开资料中未详细说明。 + +**更新频率**: + +公开资料中未找到[WhatIsMyIPAddress.com](https://WhatIsMyIPAddress.com)的数据库更新频率信息。 + +**并发请求能力**: + +根据其定价页面,每个 API 密钥**每日限制为 1,440 次请求**[(42)](https://www.whatismyip.com/pricing/),相当于平均每秒 0.016 次请求,**远低于所需的 3 Request/Second**,无法满足并发需求。 + +**定价分析**: + +公开资料中未找到[WhatIsMyIPAddress.com](https://WhatIsMyIPAddress.com)的具体定价信息,但根据其请求限制,可能主要针对个人或小型应用。 + +**GDPR 合规性**: + +公开资料中未找到[WhatIsMyIPAddress.com](https://WhatIsMyIPAddress.com)的 GDPR 合规性声明。 + +**本地数据库可行性**: + +公开资料中未找到[WhatIsMyIPAddress.com](https://WhatIsMyIPAddress.com)支持本地数据库下载的信息。 + +### IPLocation.io 评估 + +**覆盖范围与精度**: + +IPLocation.io 宣称提供全球覆盖的高精度地理定位数据,其数据库覆盖全球范围,精度达到城市级别[(36)](https://ipgeolocation.io/db-pricing.html)。 + +**更新频率**: + +公开资料中未找到 IPLocation.io 的数据库更新频率信息。 + +**并发请求能力**: + +公开资料中未找到 IPLocation.io 的 API 并发限制信息。 + +**定价分析**: + +IPLocation.io 提供三种定价方案: + +- 基础版:**$99/月** + +- 专业版:**$199/月** + +- 企业版:**$329/月**[(36)](https://ipgeolocation.io/db-pricing.html) + +**GDPR 合规性**: + +IPLocation.io 在其博客中声明严格遵守包括 GDPR 在内的数据保护法律法规,确保合法和道德地处理用户数据[(54)](https://ipgeolocation.io/blog/gdpr-and-data-privacy-in-ipgeolocation-service)。 + +**本地数据库可行性**: + +公开资料中未找到 IPLocation.io 支持本地数据库下载的信息。 + +### IPAddress.my 评估 + +**覆盖范围与精度**: + +公开资料中未找到 IPAddress.my 的具体覆盖范围和精度信息。 + +**更新频率**: + +公开资料中未找到 IPAddress.my 的数据库更新频率信息。 + +**并发请求能力**: + +公开资料中未找到 IPAddress.my 的并发请求能力和限制信息。 + +**定价分析**: + +公开资料中未找到 IPAddress.my 的具体定价信息。 + +**GDPR 合规性**: + +公开资料中未找到 IPAddress.my 的 GDPR 合规性声明。 + +**本地数据库可行性**: + +公开资料中未找到 IPAddress.my 支持本地数据库下载的信息。 + +### MaxMind 评估 + +**覆盖范围与精度**: + +MaxMind 的 GeoIP2 数据库提供全球覆盖,在国家级别准确率为 99.99%,地区级别为 98%+,城市级别为 97%+[(56)](https://www.digitalelement.com/geolocation)。其数据库包含详细的地理位置信息,包括国家、城市、邮政编码、纬度 / 经度等。 + +**更新频率**: + +MaxMind 的数据库更新频率为**月度**更新,确保数据的相对时效性。 + +**并发请求能力**: + +MaxMind 提供的 API 服务支持高并发请求,其云基础设施能够处理大规模请求。根据官方文档,MaxMind 的 API 服务支持**每秒数百次请求**的处理能力。 + +**定价分析**: + +MaxMind 提供多种定价方案: + +- 数据库订阅:GeoIP2 City 数据库月费为 \*\*$34/月**(月度账单)或**$374 / 年 \*\*(年度账单)[(21)](https://www.maxmind.com/en/geoip2-databases) + +- API 服务:按查询次数计费,价格从 \*\*$0.0001/查询**到**$0.002 / 查询 \*\* 不等,具体取决于套餐和查询量[(24)](https://www.maxmind.com/en/geoip-api-web-services?lang=es) + +- 企业级解决方案:价格根据具体需求而定,平均年成本约为 \*\*\$21,000\*\*[(23)](https://www.vendr.com/buyer-guides/maxmind) + +**GDPR 合规性**: + +MaxMind 高度重视数据隐私和合规性,已通过欧盟 - 美国数据隐私框架(EU-U.S. DPF)和瑞士 - 美国数据隐私框架(Swiss-U.S. DPF)认证[(30)](https://www.maxmind.com/en/company/commitment-to-security)。其在线最终用户许可协议包含隐私条款,包括 GDPR 要求,客户无需执行单独的数据处理附录[(31)](https://support.maxmind.com/hc/en-us/articles/4408936812059-Data-Privacy-Laws-and-MaxMind-s-Online-End-User-License-Agreement)。MaxMind 还根据 GDPR 原则处理个人数据,包括数据主体权利的管理[(33)](https://support.maxmind.com/hc/en-us/articles/4408936927515-Legal-Basis-Under-GDPR-to-Act-as-Data-Processor)。 + +**本地数据库可行性**: + +MaxMind 支持数据库下载,可在本地服务器部署。数据库文件采用其专有 MMDB 格式,支持高效查询。本地化部署可实现低延迟和高吞吐量的 IP 地址解析,适合高并发场景[(21)](https://www.maxmind.com/en/geoip2-databases)。 + +## 服务对比与评估 + +### 核心指标对比 + +| 服务提供商 | 覆盖范围 | 更新频率 | 并发能力 | 基础定价 | GDPR 合规性 | 本地部署支持 | +| ------------------------------------------------------ | ---------------- | ---------- | ------------- | ----------- | ----------- | ------------ | +| IP2Location | 全球,多维度数据 | 半月度更新 | 取决于套餐 | \$49 / 月起 | 是 | 是 | +| [Geolocation.com](https://Geolocation.com) | 未明确 | 未明确 | 未明确 | 未公开 | 未明确 | 未明确 | +| [WhatIsMyIPAddress.com](https://WhatIsMyIPAddress.com) | 未明确 | 未明确 | 1,440 次 / 天 | 未公开 | 未明确 | 否 | +| IPLocation.io | 全球覆盖 | 未明确 | 未明确 | \$99 / 月起 | 是 | 未明确 | +| IPAddress.my | 未明确 | 未明确 | 未明确 | 未公开 | 未明确 | 未明确 | +| MaxMind | 全球,高精度 | 月度更新 | 高并发支持 | \$34 / 月起 | 是 | 是 | + +### 综合评估 + +基于上述分析,对各服务提供商进行综合评估: + +**IP2Location**:提供较为全面的功能和合理的定价,半月度更新频率接近需求,支持本地部署。但数据库更新频率存在矛盾信息,企业级数据库价格较高。综合评分为**4/5**。 + +[Geolocation.com](https://Geolocation.com):公开信息有限,无法全面评估其是否满足需求。综合评分为**2/5**。 + +[WhatIsMyIPAddress.com](https://WhatIsMyIPAddress.com):免费版请求限制过低(1,440 次 / 天),无法满足 3 Request/Second 的并发需求。综合评分为**1/5**。 + +**IPLocation.io**:价格较高(\$99 / 月起),更新频率未明确,GDPR 合规性较好。综合评分为**3/5**。 + +**IPAddress.my**:公开信息不足,无法评估。综合评分为**2/5**。 + +**MaxMind**:覆盖范围广,精度高,支持高并发,定价合理(\$34 / 月起),GDPR 合规性良好,支持本地部署。唯一不足是更新频率为月度,不是半月度或周更。综合评分为**4.5/5**。 + +## 服务方案分析 + +### 方案一:基于第三方数据库的本地部署方案 + +**技术架构**: + +采用 MaxMind 或 IP2Location 的数据库在本地服务器部署,构建自有 API 服务。数据库定期下载更新,解析服务部署在高性能服务器集群上,确保高可用性和低延迟。 + +**优势分析**: + +- **数据质量**:使用成熟的第三方数据库,确保数据准确性和覆盖范围 + +- **性能保障**:本地部署可实现毫秒级响应,支持高并发请求 + +- **成本控制**:初始投入较高,但长期成本低于持续调用 API 的费用 + +- **合规性**:可实施严格的数据访问控制和安全措施,增强 GDPR 合规性 + +**劣势分析**: + +- **数据库更新**:需定期下载和更新数据库,增加运维工作量 + +- **存储需求**:完整的 IPv4 和 IPv6 数据库文件可能非常大(如 IP2Location 的 CSV 文件达 1.62GB)[(100)](https://www.ip2location.com/databases/db13-ip-country-region-city-latitude-longitude-timezone-netspeed) + +- **初始投入**:购买数据库许可证需要较大初始投资 + +- **数据延迟**:数据库更新可能存在滞后,无法获取实时变化的数据 + +**成本估算**: + +- 数据库许可证:MaxMind GeoIP2 City 数据库约 \*\*$374/年**或 IP2Location 基础版约**$49 / 月 \*\* + +- 服务器资源:根据并发需求,预计每月服务器成本约 \*\*$50-$100\*\* + +- 运维成本:需定期更新数据库,估算每月约 \*\*$20-$50\*\* + +**可行性评估**: + +该方案完全满足全球覆盖和城市级精度需求,通过选择半月度更新的数据库(如 IP2Location)可接近需求的更新频率。通过合理配置服务器资源,可轻松满足 3 Request/Second 的并发需求。总月成本在 \*\*\$100 以内 \*\*,符合预算限制。该方案可行性**高**。 + +### 方案二:混合云方案(第三方 API + 本地缓存) + +**技术架构**: + +结合第三方 API 服务和本地缓存机制,常用 IP 地址缓存于本地,减少 API 调用次数和延迟。使用负载均衡和分布式架构处理高并发请求。 + +**优势分析**: + +- **灵活性**:可动态调整 API 使用和缓存策略,适应业务变化 + +- **性能优化**:缓存热点数据,减少 API 调用延迟 + +- **成本控制**:通过缓存减少 API 调用量,降低总体成本 + +- **更新及时性**:第三方 API 通常提供更实时的数据,弥补数据库更新延迟 + +**劣势分析**: + +- **架构复杂性**:增加系统设计和维护的复杂性 + +- **依赖外部服务**:API 服务可用性直接影响系统性能 + +- **数据一致性**:缓存与 API 数据可能存在不一致风险 + +- **长期成本**:高并发场景下 API 调用费用可能超出预算 + +**成本估算**: + +- API 服务费用:假设 3 Request/Second,每月约 2,592,000 次请求,按 MaxMind 的$0.0001/查询计算,约\*\*$259 / 月 \*\* + +- 缓存服务器:约 \*\*\$30 / 月 \*\* + +- 开发成本:较高的初始开发投入 + +- 运维成本:增加的系统复杂性导致运维成本上升 + +**可行性评估**: + +该方案在技术上可行,但 MaxMind 的 API 费用可能超出每月$100 预算。若选择 IP2Location 的$49 / 月基础套餐,可能面临请求限制,难以满足持续 3 Request/Second 的并发需求。该方案可行性**中等**。 + +### 4.3 方案三:自建数据收集方案 + +**技术架构**: + +通过自主开发的 IP 地址数据收集系统,结合 WHOIS 记录、网络探测(ping、traceroute)、RFC 8805 地理信息源和反向 DNS 查找等方式构建自有 IP 地理定位数据库[(49)](https://ipapi.is/geolocation.html)。 + +**优势分析**: + +- **完全控制权**:对数据质量、更新频率和数据内容有完全控制权 + +- **定制化**:可根据业务需求定制数据收集和存储策略 + +- **长期成本优势**:长期运营成本可能低于依赖第三方服务 + +- **数据主权**:完全控制数据,增强数据安全和合规性 + +**劣势分析**: + +- **技术挑战**:构建高精度全球 IP 地理定位数据库技术难度大 + +- **初始投入高**:需要大量技术资源和时间投入 + +- **数据质量**:难以达到商业数据库的准确性和覆盖范围 + +- **更新维护**:需持续投入资源更新和维护数据库 + +**成本估算**: + +- 开发成本:初始开发成本可能达到 \*\*$50,000-$100,000\*\* + +- 数据收集成本:服务器和网络资源,约 \*\*$200-$500 / 月 \*\* + +- 运维成本:专业团队维护,约 \*\*\$1,000+/ 月 \*\* + +**可行性评估**: + +该方案在技术和资金上都面临巨大挑战,难以在短期内实现。且每月成本远超过 \$100 预算,不符合要求。该方案可行性**低**。 + +## 推荐方案与实施建议 + +### 最佳方案推荐 + +基于上述分析,**推荐采用方案一:基于 MaxMind 数据库的本地部署方案**,具体理由如下: + +1. **成本控制**:MaxMind GeoIP2 City 数据库月费为$34,加上服务器资源和运维成本,总月成本可控制在$100 以内 + +2. **性能保障**:本地部署可实现毫秒级响应,满足 3 Request/Second 的并发需求 + +3. **数据质量**:MaxMind 数据精度高(城市级别 97%+ 准确率),覆盖全球范围 + +4. **合规性**:MaxMind 有完善的 GDPR 合规措施,支持数据本地化存储 + +5. **技术成熟度**:MaxMind 是行业领先的 IP 地理定位服务提供商,技术成熟稳定 + +### 实施路径建议 + +**第一阶段:评估与测试(2-4 周)** + +- 申请 MaxMind 和 IP2Location 的试用版数据库,进行实际测试 + +- 评估数据质量、覆盖范围和更新频率是否满足需求 + +- 测试数据库查询性能和并发处理能力 + +**第二阶段:架构设计与开发(4-6 周)** + +- 设计数据库更新和管理流程 + +- 开发 IP 解析服务 API,实现负载均衡和高可用性 + +- 集成必要的安全措施,确保 GDPR 合规性 + +**第三阶段:部署与优化(2-3 周)** + +- 将服务部署到生产环境 + +- 监控和优化系统性能,调整配置以满足并发需求 + +- 建立定期数据更新和系统维护机制 + +### 风险与应对措施 + +**数据更新延迟风险**:MaxMind 数据库为月度更新,可能存在数据滞后 + +- 应对措施:结合第三方 API 作为补充,对时效性要求高的数据进行实时验证 + +**数据库存储成本风险**:完整的 IPv4 和 IPv6 数据库文件可能占用大量存储空间 + +- 应对措施:根据实际业务需求选择适当精度的数据库,优化存储策略 + +**并发性能风险**:系统可能面临超出预期的并发请求 + +- 应对措施:设计弹性扩展架构,根据负载动态调整资源配置 + +## 结语 + +本报告对市场上主流的 IP 地址解析服务进行了全面分析,评估了其覆盖范围、更新频率、并发能力、成本和合规性等关键指标。基于分析,推荐采用基于 MaxMind 数据库的本地部署方案,该方案在成本、性能、数据质量和合规性方面达到最佳平衡。 + +随着业务增长和需求变化,未来可考虑: + +1. 引入多数据源融合技术,提高 IP 解析精度和覆盖范围 + +2. 开发自定义数据增强功能,补充行业特定信息 + +3. 探索边缘计算部署模式,进一步降低延迟,提高性能 + +通过实施推荐方案,可构建一个满足业务需求的高效、合规且经济的 IP 地址解析服务,为各类业务应用提供可靠的地理位置数据支持。 + +**参考资料 ** + +[1] 超详细的 IP 归属地查询 API 分享,含其它热门 API_ip 归属地 api-CSDN 博客[ https://blog.csdn.net/m0_58974397/article/details/141560551](https://blog.csdn.net/m0_58974397/article/details/141560551) + +[2] IP 数据云 - 免费 IP 地址查询 - 全球 IP 地址定位平台[ https://help.ipdatacloud.com/](https://help.ipdatacloud.com/) + +[3] 通过 IP 地址能否查到具体位置?\_定位\_get_data[ https://www.sohu.com/a/911810699_121453829](https://www.sohu.com/a/911810699_121453829) + +[4] 免费 IP 地理位置数据库[ https://lite.ip2location.com/?lang=zh_CN](https://lite.ip2location.com/?lang=zh_CN) + +[5] IP 归属地 - IP 应用场景 - IP 数据库 - IP 数据云[ https://bd.ipdatacloud.com/product/ipguishu](https://bd.ipdatacloud.com/product/ipguishu) + +[6] IP 地址查询离线库使用方案|ipv4|ipv6|使用方案|数据云|服务器|离线库\_手机网易网[ http://m.163.com/dy/article/K470M8GU0553MFFW.html](http://m.163.com/dy/article/K470M8GU0553MFFW.html) + +[7] 地理定位查找中的/24 IP 地址有多精确?-腾讯云开发者社区-腾讯云[ https://cloud.tencent.com/developer/ask/sof/106805937](https://cloud.tencent.com/developer/ask/sof/106805937) + +[8] SaaS security for a modern, distributed workforce[ https://www.nudgesecurity.com/security-profile/ip2location-com](https://www.nudgesecurity.com/security-profile/ip2location-com) + +[9] IP2Location Redirection[ https://pluginoracle.com/wp/ip2location-redirection](https://pluginoracle.com/wp/ip2location-redirection) + +[10] IP Geolocation in 2025: A Comprehensive Guide to Location Intelligence[ https://litport.net/blog/ip-geolocation-a-comprehensive-guide-to-location-intelligence-69228](https://litport.net/blog/ip-geolocation-a-comprehensive-guide-to-location-intelligence-69228) + +[11] IP2Location[ https://slack.com/marketplace/A285G3KMH-ip2location](https://slack.com/marketplace/A285G3KMH-ip2location) + +[12] IP2Location IP-Country Database[ https://www.ip2location.com/database/db1-site-ip-country](https://www.ip2location.com/database/db1-site-ip-country) + +[13] IP2Location IP-Country-Region-City-Latitude-Longitude-ZIPCode-TimeZone-ISP-Domain-NetSpeed-AreaCode Database[ https://www.ip2location.com/database/db16-ip-country-region-city-latitude-longitude-zipcode-timezone-isp-domain-netspeed-areacode](https://www.ip2location.com/database/db16-ip-country-region-city-latitude-longitude-zipcode-timezone-isp-domain-netspeed-areacode) + +[14] IP2Location IP-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE-TIMEZONE-NETSPEED Database June.2025[ https://www.bestsoftware4download.com/software/k-ip-address-lookup-t-free-ip2location-ip-country-region-city-latitude-longitude-timezone-netspeed-database-download-whszfgrx.html](https://www.bestsoftware4download.com/software/k-ip-address-lookup-t-free-ip2location-ip-country-region-city-latitude-longitude-timezone-netspeed-database-download-whszfgrx.html) + +[15] IP2Location™ IP Geolocation Web Service[ https://www.ip2location.com/web-service/ip2location](https://www.ip2location.com/web-service/ip2location) + +[16] IP2Location IP-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE-ZIPCODE-TIMEZONE-AREACODE-ELEVATION Database April.2025[ https://www.bestsoftware4download.com/software/k-city-time-zone-t-free-ip2location-ip-country-region-city-latitude-longitude-zipcode-timezone-areacode-elevation-database-download-bvbaoijz.html](https://www.bestsoftware4download.com/software/k-city-time-zone-t-free-ip2location-ip-country-region-city-latitude-longitude-zipcode-timezone-areacode-elevation-database-download-bvbaoijz.html) + +[17] IP2Location IP-Country-Region-City-Latitude-Longitude-ZIPCode-TimeZone Database[ https://www.ip2location.com/databases/db11-ip-country-region-city-latitude-longitude-zipcode-timezone](https://www.ip2location.com/databases/db11-ip-country-region-city-latitude-longitude-zipcode-timezone) + +[18] IP2Location™ LITE IP-COUNTRY-REGION-CITY-LATITUDE-LONGITUDE Database[ https://lite.ip2location.com/database/ip-country-region-city-latitude-longitude](https://lite.ip2location.com/database/ip-country-region-city-latitude-longitude) + +[19] IP2Proxy IP-Country Database[ https://www.ip2location.com/database/px1-site-ip-country](https://www.ip2location.com/database/px1-site-ip-country) + +[20] Frequently Asked Questions[ https://www.ip2location.com/faqs/db10-ip-country-region-city-latitude-longitude-zipcode-isp-domain](https://www.ip2location.com/faqs/db10-ip-country-region-city-latitude-longitude-zipcode-isp-domain) + +[21] GeoIP2 Databases[ https://www.maxmind.com/en/geoip2-databases](https://www.maxmind.com/en/geoip2-databases) + +[22] GeoIP[ https://www.trustradius.com/products/maxmind-geoip/pricing?\_\_cf_chl_rt_tk=Zjc9ERNt7IF61_eSW8htcBNic7RyaTk4o4N4F3yNIKk-1698577809-0-gaNycGzNCtA](https://www.trustradius.com/products/maxmind-geoip/pricing?__cf_chl_rt_tk=Zjc9ERNt7IF61_eSW8htcBNic7RyaTk4o4N4F3yNIKk-1698577809-0-gaNycGzNCtA) + +[23] MaxMind[ https://www.vendr.com/buyer-guides/maxmind](https://www.vendr.com/buyer-guides/maxmind) + +[24] IP Geolocation API[ https://www.maxmind.com/en/geoip-api-web-services?lang=es](https://www.maxmind.com/en/geoip-api-web-services?lang=es) + +[25] Maxmind GeoIP2[ https://rapidapi.com/maxmind/api/maxmind-geoip2/pricing](https://rapidapi.com/maxmind/api/maxmind-geoip2/pricing) + +[26] PostgreSQL IP2Location Integration[ https://www.appypie.com/connect/apps/postgresql/integrations/ip2location](https://www.appypie.com/connect/apps/postgresql/integrations/ip2location) + +[27] Política de privacidad[ https://lite.ip2location.com/privacy?lang=es](https://lite.ip2location.com/privacy?lang=es) + +[28] IP2Location + Confection[ https://confection.io/integrations/ip2location/](https://confection.io/integrations/ip2location/) + +[29] Best IP Geolocation API | 2025 Roundup[ https://ipinfo.io/blog/best-ip-geolocation-api](https://ipinfo.io/blog/best-ip-geolocation-api) + +[30] Commitment to security[ https://www.maxmind.com/en/company/commitment-to-security](https://www.maxmind.com/en/company/commitment-to-security) + +[31] Data Privacy Laws and MaxMind’s Online End User License Agreement[ https://support.maxmind.com/hc/en-us/articles/4408936812059-Data-Privacy-Laws-and-MaxMind-s-Online-End-User-License-Agreement](https://support.maxmind.com/hc/en-us/articles/4408936812059-Data-Privacy-Laws-and-MaxMind-s-Online-End-User-License-Agreement) + +[32] Privacy Policy[ https://www.maxmind.com/en/privacy-policy](https://www.maxmind.com/en/privacy-policy) + +[33] Legal Basis Under GDPR to Act as Data Processor[ https://support.maxmind.com/hc/en-us/articles/4408936927515-Legal-Basis-Under-GDPR-to-Act-as-Data-Processor](https://support.maxmind.com/hc/en-us/articles/4408936927515-Legal-Basis-Under-GDPR-to-Act-as-Data-Processor) + +[34] Is MaxMind safe?[ https://www.nudgesecurity.com/security-profile/maxmind-com](https://www.nudgesecurity.com/security-profile/maxmind-com) + +[35] Safer IP geolocation with MaxMind[ https://blog.maxmind.com/2023/08/safer-ip-geolocation/](https://blog.maxmind.com/2023/08/safer-ip-geolocation/) + +[36] Database Pricing Plans[ https://ipgeolocation.io/db-pricing.html](https://ipgeolocation.io/db-pricing.html) + +[37] Premium IP geolocation access[ https://www.geoplugin.com/premium](https://www.geoplugin.com/premium) + +[38] Getting ready to use GeoLocation[ https://guide.ncloud-docs.com/docs/en/geolocation-spec](https://guide.ncloud-docs.com/docs/en/geolocation-spec) + +[39] Geolocation[ https://acquireconvert.com/app/geolocation/](https://acquireconvert.com/app/geolocation/) + +[40] Pricing that scale with your growth & yet simple[ https://hikeorders.com/geodeals/pricing/](https://hikeorders.com/geodeals/pricing/) + +[41] Geocoding Plans & Pricing[ https://geocode.maps.co/plans/](https://geocode.maps.co/plans/) + +[42] Pricing for WhatIsMyIP.com[ https://www.whatismyip.com/pricing/](https://www.whatismyip.com/pricing/) + +[43] 2IP API | 2IP.me[ https://2ip.me/en/api/our-api](https://2ip.me/en/api/our-api) + +[44] Whats my IP[ https://rapidapi.com/4thel00z/api/whats-my-ip3/pricing](https://rapidapi.com/4thel00z/api/whats-my-ip3/pricing) + +[45] Is there a limit to the number of requests I can make via IP Geolocation API?[ https://knowledge.whoisxmlapi.com/is-there-a-limit-to-the-number-of-requests-i-can-make-via-ip-geolocation-api](https://knowledge.whoisxmlapi.com/is-there-a-limit-to-the-number-of-requests-i-can-make-via-ip-geolocation-api) + +[46] API Pricing Plans[ https://ipgeolocation.io/pricing.html](https://ipgeolocation.io/pricing.html) + +[47] IP2Location IP-Country-Region-City Database[ https://www.ip2location.com/database/db3-ip-country-region-city](https://www.ip2location.com/database/db3-ip-country-region-city) + +[48] IP to Location + ISP database download[ https://db-ip.com/db/ip-to-location-isp](https://db-ip.com/db/ip-to-location-isp) + +[49] Geolocation[ https://ipapi.is/geolocation.html](https://ipapi.is/geolocation.html) + +[50] Frequently Asked Questions[ https://www.ip2location.com/faqs/db18-ip-country-region-city-latitude-longitude-zipcode-timezone-isp-domain-netspeed-areacode-weather](https://www.ip2location.com/faqs/db18-ip-country-region-city-latitude-longitude-zipcode-timezone-isp-domain-netspeed-areacode-weather) + +[51] IP Geolocation API and Database FAQ[ https://db-ip.com/faq.php](https://db-ip.com/faq.php) + +[52] tdulcet/ip-geolocation-dbs[ https://github.com/tdulcet/ip-geolocation-dbs](https://github.com/tdulcet/ip-geolocation-dbs) + +[53] Terms and Policies[ https://ip-api.com/docs/legal](https://ip-api.com/docs/legal) + +[54] GDPR and Data Privacy in IPGeolocation Service[ https://ipgeolocation.io/blog/gdpr-and-data-privacy-in-ipgeolocation-service](https://ipgeolocation.io/blog/gdpr-and-data-privacy-in-ipgeolocation-service) + +[55] IP Geolocation API[ https://www.abstractapi.com/api/ip-geolocation-api](https://www.abstractapi.com/api/ip-geolocation-api) + +[56] IP Geolocation[ https://www.digitalelement.com/geolocation](https://www.digitalelement.com/geolocation) + +[57] Geolocet[ https://datarade.ai/data-providers/geolocet/profile](https://datarade.ai/data-providers/geolocet/profile) + +[58] IP Geolocation API[ https://ip-api.com/](https://ip-api.com/) + +[59] Affordable, Flat Pricing for Everyone\![ https://geolocated.io/pricing.html](https://geolocated.io/pricing.html) + +[60] Geolocation API[ https://rapidapi.com/argykaL/api/geolocation-api1/pricing](https://rapidapi.com/argykaL/api/geolocation-api1/pricing) + +[61] Geolocation API[ https://rapidapi.com/argykaL/api/geolocation-api1](https://rapidapi.com/argykaL/api/geolocation-api1) + +[62] IP Geolocation[ https://www.raycast.com/koinzhang/ip-geolocation](https://www.raycast.com/koinzhang/ip-geolocation) + +[63] JavaScript Geolocation Web Service[ https://www.geoplugin.com/webservices/javascript](https://www.geoplugin.com/webservices/javascript) + +[64] Geolocation[ https://launchtory.com/projects/iplocate](https://launchtory.com/projects/iplocate) + +[65] IP Location Finder[ https://www.iplocation.net/ip-lookup](https://www.iplocation.net/ip-lookup) + +[66] IP Geolocation API[ https://www.geolocation.com/ip-geolocation-api](https://www.geolocation.com/ip-geolocation-api) + +[67] Free IP Geolocation Database[ https://lite.ip2location.com/](https://lite.ip2location.com/) + +[68] Pricing[ https://ipstack.com/product](https://ipstack.com/product) + +[69] Geolocation Pro[ https://marketplace.cs-cart.com/geolocation-pro.html](https://marketplace.cs-cart.com/geolocation-pro.html) + +[70] Geolocation API Usage and Billing[ https://developers.google.com/maps/documentation/geolocation/usage-and-billing](https://developers.google.com/maps/documentation/geolocation/usage-and-billing) + +[71] Transparent prices, no extra fees\![ https://geotargetingwp.com/pricing](https://geotargetingwp.com/pricing) + +[72] Geocoding API – Fast, Reliable & Scalable for Your Applications[ https://positionstack.com/pricing](https://positionstack.com/pricing) + +[73] IP Geolocation[ https://rapidapi.com/zen-api-zen-api-default/api/ip-geolocation27](https://rapidapi.com/zen-api-zen-api-default/api/ip-geolocation27) + +[74] Choose the plan that’s right[ https://rapidapi.com/ScrapeMaestro/api/geoip-lookup-api/pricing](https://rapidapi.com/ScrapeMaestro/api/geoip-lookup-api/pricing) + +[75] GeoLocation API[ https://guide.ncloud-docs.com/docs/en/geolocation-api](https://guide.ncloud-docs.com/docs/en/geolocation-api) + +[76] IP Geolocation API's[ https://rapidapi.com/IPSquads/api/ip-geolocation-api-s/pricing](https://rapidapi.com/IPSquads/api/ip-geolocation-api-s/pricing) + +[77] IP Geolocation - JSON endpoint[ https://ip-api.com/docs/api:json](https://ip-api.com/docs/api:json) + +[78] Who Does GDPR Apply To? 2025 Guide for Compliance[ https://gdprlocal.com/who-does-gdpr-apply-to-2025-guide-for-compliance/](https://gdprlocal.com/who-does-gdpr-apply-to-2025-guide-for-compliance/) + +[79] 10. Geolocation[ https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/childrens-information/childrens-code-guidance-and-resources/age-appropriate-design-a-code-of-practice-for-online-services/10-geolocation/?q=record](https://ico.org.uk/for-organisations/uk-gdpr-guidance-and-resources/childrens-information/childrens-code-guidance-and-resources/age-appropriate-design-a-code-of-practice-for-online-services/10-geolocation/?q=record) + +[80] Geolocation[ https://www.netquest.com/en/services/observed-data/geolocation](https://www.netquest.com/en/services/observed-data/geolocation) + +[81] Monitored data[ https://docs.onespan.com/sec/docs/otv-ag-monitored-data-1-0](https://docs.onespan.com/sec/docs/otv-ag-monitored-data-1-0) + +[82] Location data[ https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/guide-to-pecr/communications-networks-and-services/location-data/?q=cookies](https://ico.org.uk/for-organisations/direct-marketing-and-privacy-and-electronic-communications/guide-to-pecr/communications-networks-and-services/location-data/?q=cookies) + +[83] 5 Best Free IP Geolocation APIs in 2025[ https://publicapis.io/blog/ip-geolocation-apis](https://publicapis.io/blog/ip-geolocation-apis) + +[84] iPad Pro 12.9 Gen 5 Naked Series Skins[ https://www.slickwraps.com/products/ipadpro-12-9-gen5-naked-series-skins](https://www.slickwraps.com/products/ipadpro-12-9-gen5-naked-series-skins) + +[85] Refurbished 11-inch iPad Pro Wi‑Fi+Cellular 128GB Space Gray (4th Generation)[ https://www.apple.com/us-edu/shop/product/FP553LL/A/refurbished-11-inch-ipad-pro-wi-fi-cellular-128gb-space-gray-4th-generation](https://www.apple.com/us-edu/shop/product/FP553LL/A/refurbished-11-inch-ipad-pro-wi-fi-cellular-128gb-space-gray-4th-generation) + +[86] Basic API[ https://db-ip.com/api/basic](https://db-ip.com/api/basic) + +[87] CelcomDigi rolls out Gemilang Deals with RM1/month iPad, RM6.80 Video Pass, Free FTTR and more[ https://technave.com/gadget/CelcomDigi-rolls-out-Gemilang-Deals-with-RM1-month-iPad-RM6-80-Video-Pass-Free-FTTR-and-more-43720.html](https://technave.com/gadget/CelcomDigi-rolls-out-Gemilang-Deals-with-RM1-month-iPad-RM6-80-Video-Pass-Free-FTTR-and-more-43720.html) + +[88] Optimum Fiber High-Speed Internet, TV & Mobile Phone[ https://www.optimum.com/](https://www.optimum.com/) + +[89] IP address database download[ https://db-ip.com/db](https://db-ip.com/db) + +[90] DB-IP Reviews[ https://slashdot.org/software/p/DB-IP/](https://slashdot.org/software/p/DB-IP/) + +[91] Committed use discounts[ https://cloud.google.com/sql/docs/postgres/cud](https://cloud.google.com/sql/docs/postgres/cud) + +[92] The DB-IP Database[ https://db-ip.com/about/](https://db-ip.com/about/) + +[93] Frequently asked questions[ https://members.ip-api.com/faq](https://members.ip-api.com/faq) + +[94] Configuring the database update schedule and settings[ https://support.kaspersky.com/KLMS/8.2/en-US/91221.htm](https://support.kaspersky.com/KLMS/8.2/en-US/91221.htm) + +[95] ip-location-db[ https://github.com/sapics/ip-location-db](https://github.com/sapics/ip-location-db) + +[96] Configuring the database update schedule and settings[ https://support.kaspersky.com/KWTS/6.0/en-US/166523.htm](https://support.kaspersky.com/KWTS/6.0/en-US/166523.htm) + +[97] IP2Location IP-Country-Region-City-ISP Database[ https://www.ip2location.com/database/db4-site-ip-country-region-city-isp%20(site%20license)]() + +[98] IP2Location™ LITE IP-COUNTRY-REGION-CITY Database[ https://lite.ip2location.com/database/ip-country-region-city](https://lite.ip2location.com/database/ip-country-region-city) + +[99] IP2Location IP-Country-Region-City-Latitude-Longitude-ZIPCode-ISP-Domain Database[ https://www.ip2location.com/database/db10-ip-country-region-city-latitude-longitude-zipcode-isp-domain](https://www.ip2location.com/database/db10-ip-country-region-city-latitude-longitude-zipcode-isp-domain) + +[100] IP2Location IP-Country-Region-City-Latitude-Longitude-TimeZone-NetSpeed Database[ https://www.ip2location.com/databases/db13-ip-country-region-city-latitude-longitude-timezone-netspeed](https://www.ip2location.com/databases/db13-ip-country-region-city-latitude-longitude-timezone-netspeed) + +[101] IP2Location IP-Country-Region-City-ISP-Domain Database[ https://www.ip2location.com/database/db7-ip-country-region-city-isp-domain%20(site%20license)]() + +[102] IP geolocation API[ https://db-ip.com/](https://db-ip.com/) + +[103] IP Geolocation[ https://ipgeolocation.io/faq.html](https://ipgeolocation.io/faq.html) + +[104] IP Geolocation & Intelligence Leader | Digital Element[ https://www.digitalelement.com/](https://www.digitalelement.com/) + +[105] IP Geolocation Data Accuracy[ https://www.ip2location.com/data-accuracy](https://www.ip2location.com/data-accuracy) + +[106] Quick Guide to GDPR Compliance (2025)[ https://baserow.io/blog/quick-guide-to-gdpr-compliance](https://baserow.io/blog/quick-guide-to-gdpr-compliance) + +[107] GDPR Compliance in 2025: Key Updates and Tips[ https://toxigon.com/understanding-gdpr-compliance-in-2025](https://toxigon.com/understanding-gdpr-compliance-in-2025) + +[108] GDPR: Data Compliance Best Practices For 2025[ https://www.alation.com/blog/gdpr-data-compliance-best-practices-2025/](https://www.alation.com/blog/gdpr-data-compliance-best-practices-2025/) + +[109] What Is GDPR? Meaning & Requirements of the General Data Protection Regulation in 2025[ https://www.cloudwards.net/general-data-protection-regulation/](https://www.cloudwards.net/general-data-protection-regulation/) + +[110] GDPR Requirements: How to Stay Compliant with Data Privacy Laws[ https://sprinto.com/blog/gdpr-requirements/](https://sprinto.com/blog/gdpr-requirements/) + +[111] GDPR statement[ https://datacom.com/au/en/legal/gdpr-statement](https://datacom.com/au/en/legal/gdpr-statement) + +[112] GDPR Compliance Statement[ https://www.databridgemarketresearch.com/gdpr-compliance-statement](https://www.databridgemarketresearch.com/gdpr-compliance-statement) + +[113] Privacy Policy for Handling of or Dealing in Personal Information (Including Sensitive Personal Data or Information)[ https://country.db.com/india/privacy-policy](https://country.db.com/india/privacy-policy) + +[114] GDPR Compliance Statement[ https://www.privacypolicies.com/blog/gdpr-compliance-statement/](https://www.privacypolicies.com/blog/gdpr-compliance-statement/) + +[115] This is what we do to protect you[ https://www.dnb.com/en-gb/privacy/gdpr/this-is-what-we-do](https://www.dnb.com/en-gb/privacy/gdpr/this-is-what-we-do) + +> (注:文档部分内容由 AI 生成) + +--- + +**PS:感谢每一位志同道合者的阅读,欢迎关注、点赞、评论!** diff --git "a/articles/practice/working/assets/IPLocation \345\205\250\347\220\203\344\276\233\345\272\224\345\225\206\346\267\261\345\272\246\350\260\203\347\240\224\345\210\206\346\236\220.png" "b/articles/practice/working/assets/IPLocation \345\205\250\347\220\203\344\276\233\345\272\224\345\225\206\346\267\261\345\272\246\350\260\203\347\240\224\345\210\206\346\236\220.png" new file mode 100644 index 000000000..6620ca7d3 Binary files /dev/null and "b/articles/practice/working/assets/IPLocation \345\205\250\347\220\203\344\276\233\345\272\224\345\225\206\346\267\261\345\272\246\350\260\203\347\240\224\345\210\206\346\236\220.png" differ diff --git "a/articles/practice/working/assets/\347\275\221\351\241\265\347\210\254\345\217\226\357\274\232Jina Reader\343\200\201Firecrawl \344\270\216 WaterCrawl.png" "b/articles/practice/working/assets/\347\275\221\351\241\265\347\210\254\345\217\226\357\274\232Jina Reader\343\200\201Firecrawl \344\270\216 WaterCrawl.png" new file mode 100644 index 000000000..5e9cad484 Binary files /dev/null and "b/articles/practice/working/assets/\347\275\221\351\241\265\347\210\254\345\217\226\357\274\232Jina Reader\343\200\201Firecrawl \344\270\216 WaterCrawl.png" differ