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

爆改RagFlow

爆改RagFlow

  • 一、Rag理论概述
  • 二、Ragflow解析参数说明
  • 三、♥ RagFlow源码解析
    • ==核心代码流程梳理==
      • 1、OCR识别
      • 2、版面分析
      • 3、parser功能
        • ==3.1 PdfParser==
          • 3.1.1 首先,初始化
          • 3.1.2 **pdf转图片**
        • [来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析](https://blog.csdn.net/hustyichi/article/details/139162109?ops_request_misc=&request_id=&biz_id=102&utm_term=ragflow%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-139162109.nonecase&spm=1018.2226.3001.4187) 重要点梳理
  • 任务1:对解析后的文档的某些字段挖空
          • 文件解析核心函数:build()方法
          • 解析器
          • 文本挖空
          • 表格内容提取
          • 修改源码

一、Rag理论概述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

由近期 RAGFlow 的火爆看 RAG 的现状与未来

二、Ragflow解析参数说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

三、♥ RagFlow源码解析

在这里插入图片描述
在这里插入图片描述

核心代码流程梳理

参考:深度解读RAGFlow的深度文档理解DeepDoc

DeepDoc的模型应该是基于paddleOCR的模型去微调训练的,开源出来的模型是onnx格式的

1、OCR识别

主要代码在ocr.py里——"E:\ragflow-main\deepdoc\vision\ocr.py"
TextRecognizer 做文字识别,TextDetector 做文本框检测,OCR整合检测和识别功能,对外提供调用
在这里插入图片描述

2、版面分析

版面分析主要在recognizer.py和layout_recognizer.py里:
"E:\ragflow-main\deepdoc\vision\recognizer.py""E:\ragflow-main\deepdoc\vision\layout_recognizer.py"
LayoutRecognizer 继承Recognizer的类,用于对文档图像进行板式分析,识别不同类型的区域,例如表格、标题、段落等。这里用的模型应该还是基于paddleocr里的版面分析模型去优化的。
Recognizer的__call__ 方法,传入图像列表和置信度阈值
在这里插入图片描述

3、parser功能

OCR版面分析,都是为parser服务的,parser负责解析文档,并拆分为chunk.

框架提供了PdfParserPlainParserDocxParserExcelParserPptParser 5种解析器。另外针对resume,提供了专门的简历解析功能

3.1 PdfParser

我们挑选重点的==PdfParser ==也就是HuParser来分析。

3.1.1 首先,初始化
def __init__(self):  self.ocr = OCR()  if hasattr(self, "model_speciess"):  self.layouter = LayoutRecognizer("layout." + self.model_speciess)  else:  self.layouter = LayoutRecognizer("layout")  self.tbl_det = TableStructureRecognizer()  self.updown_cnt_mdl = xgb.Booster()

对表格结构的识别需要OCR、LayoutRecognizer,以及TableStructureRecognizer互相配合,一般都是模型搭配大量的工程trick,靠一些规则来解决一些边界情况。文档解析也是这样,需要多个模型配合,结合一些规则来做,这些规则通常是经验的集合,大白话就是各种case跑出来,遇到问题就加新的规则

***************PdfParser核心的__call__

def __call__(self, fnm, need_image=True, zoomin=3, return_html=False):  # 转图片,处理文本,ocr识别  self.__images__(fnm, zoomin)  # 版面分析  self._layouts_rec(zoomin)  # table box 处理  self._table_transformer_job(zoomin)  # 合并文本块  self._text_merge()  self._concat_downward()  # 过滤分页信息  self._filter_forpages()  # 表格和图表抽取  tbls = self._extract_table_figure(  need_image, zoomin, return_html, False)  # 抽取的文本(去掉表格), 表格  return self.__filterout_scraps(deepcopy(self.boxes), zoomin), tbls

在这里插入图片描述

3.1.2 pdf转图片

先读PDF文件

def __images__(self, fnm, zoomin=3, page_from=0,  page_to=299, callback=None):  self.lefted_chars = []  self.mean_height = []  self.mean_width = []  self.boxes = []  self.garbages = {}  self.page_cum_height = [0]  self.page_layout = []  self.page_from = page_from  try:  self.pdf = pdfplumber.open(fnm) if isinstance(  fnm, str) else pdfplumber.open(BytesIO(fnm))  self.page_images = [p.to_image(resolution=72 * zoomin).annotated for i, p in  enumerate(self.pdf.pages[page_from:page_to])]  self.page_chars = [[c for c in page.chars if self._has_color(c)] for page in  self.pdf.pages[page_from:page_to]]  self.total_page = len(self.pdf.pages)  except Exception as e:  self.pdf = fitz.open(fnm) if isinstance(  fnm, str) else fitz.open(  stream=fnm, filetype="pdf")  self.page_images = []  self.page_chars = []  mat = fitz.Matrix(zoomin, zoomin)  self.total_page = len(self.pdf)  for i, page in enumerate(self.pdf):  if i < page_from:  continue  if i >= page_to:  break  pix = page.get_pixmap(matrix=mat)  img = Image.frombytes("RGB", [pix.width, pix.height],  pix.samples)  self.page_images.append(img)  self.page_chars.append([])

在这里插入图片描述
然后读PDF目录结构
使用了PyPDF2库来读取pdf的目录信息

self.outlines = []  
try:  self.pdf = pdf2_read(fnm if isinstance(fnm, str) else BytesIO(fnm))  outlines = self.pdf.outline  def dfs(arr, depth):  for a in arr:  if isinstance(a, dict):  self.outlines.append((a["/Title"], depth))  continue  dfs(a, depth + 1)  dfs(outlines, 0)  
except Exception as e:  logging.warning(f"Outlines exception: {e}")  
if not self.outlines:  logging.warning(f"Miss outlines")

然后是英文文档检测,大概就是利用正则匹配

logging.info("Images converted.")  
self.is_english = [re.search(r"[a-zA-Z0-9,/¸;:'\[\]\(\)!@#$%^&*\"?<>._-]{30,}", "".join(  random.choices([c["text"] for c in self.page_chars[i]], k=min(100, len(self.page_chars[i]))))) for i in  range(len(self.page_chars))]  
if sum([1 if e else 0 for e in self.is_english]) > len(  self.page_images) / 2:  self.is_english = True  
else:  self.is_english = False

接着做分页处理
callback方法会更新文档解析进度,在文档页面可以查看实时进度
在这里插入图片描述

for i, img in enumerate(self.page_images):  chars = self.page_chars[i] if not self.is_english else []  # 计算字符的平均宽度、高度  self.mean_height.append(  np.median(sorted([c["height"] for c in chars])) if chars else 0  )  self.mean_width.append(  np.median(sorted([c["width"] for c in chars])) if chars else 8  )  self.page_cum_height.append(img.size[1] / zoomin)  j = 0  while j + 1 < len(chars):  # 对满足条件的添加空格(只包含数字、字母、逗号、句号、冒号、分号、感叹号和百分号, 两个字符宽度小于width的一半  if chars[j]["text"] and chars[j + 1]["text"] \  and re.match(r"[0-9a-zA-Z,.:;!%]+", chars[j]["text"] + chars[j + 1]["text"]) \  and chars[j + 1]["x0"] - chars[j]["x1"] >= min(chars[j + 1]["width"],  chars[j]["width"]) / 2:  chars[j]["text"] += " "  j += 1  # if i > 0:  #     if not chars:    #         self.page_cum_height.append(img.size[1] / zoomin)    #     else:    #         self.page_cum_height.append(    #             np.max([c["bottom"] for c in chars]))    # OCR 识别  self.__ocr(i + 1, img, chars, zoomin)  if callback:  callback(prog=(i + 1) * 0.6 / len(self.page_images), msg="")

__ocr 处理
主要做的是detect,检测文本框,然后根据经验规则来对文本块做处理

def __ocr(self, pagenum, img, chars, ZM=3):  # 检测文本框  bxs = self.ocr.detect(np.array(img))  if not bxs:  self.boxes.append([])  return  bxs = [(line[0], line[1][0]) for line in bxs]  # 按照Y轴坐标排序  bxs = Recognizer.sort_Y_firstly(  [{"x0": b[0][0] / ZM, "x1": b[1][0] / ZM,  "top": b[0][1] / ZM, "text": "", "txt": t,  "bottom": b[-1][1] / ZM,  "page_number": pagenum} for b, t in bxs if b[0][0] <= b[1][0] and b[0][1] <= b[-1][1]],  self.mean_height[-1] / 3  )  # merge chars in the same rect  for c in Recognizer.sort_X_firstly(  chars, self.mean_width[pagenum - 1] // 4):  ii = Recognizer.find_overlapped(c, bxs)  if ii is None:  self.lefted_chars.append(c)  continue  ch = c["bottom"] - c["top"]  bh = bxs[ii]["bottom"] - bxs[ii]["top"]  if abs(ch - bh) / max(ch, bh) >= 0.7 and c["text"] != ' ':  self.lefted_chars.append(c)  continue  if c["text"] == " " and bxs[ii]["text"]:  if re.match(r"[0-9a-zA-Z,.?;:!%%]", bxs[ii]["text"][-1]):  bxs[ii]["text"] += " "  else:  bxs[ii]["text"] += c["text"]  for b in bxs:  if not b["text"]:  left, right, top, bott = b["x0"] * ZM, b["x1"] * \  ZM, b["top"] * ZM, b["bottom"] * ZM  b["text"] = self.ocr.recognize(np.array(img),  np.array([[left, top], [right, top], [right, bott], [left, bott]],  dtype=np.float32))  del b["txt"]  bxs = [b for b in bxs if b["text"]]  if self.mean_height[-1] == 0:  self.mean_height[-1] = np.median([b["bottom"] - b["top"]  for b in bxs])  self.boxes.append(bxs)

在这里插入图片描述
·······························································分割线········································
实际的文件解析通过接口 /v1/document/run 进行触发的,实际的处理是在 api/db/services/task_service.py 中的 queue_tasks() 中完成的,此方法会根据文件创建一个或多个异步任务,方便异步执行。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

提示词
在这里插入图片描述

想要通过源码了解 RAG 服务推荐优先阅读 QAnything

参考来源

对ragflow-main/deepdoc的源码剖析

RAGFlow嵌入自定义文件解析代码

向量化搜索,如果不希望引入第三方的向量数据库,那么开源的 Faiss 就是一个不错的选择:向量数据库 Faiss的git

来自工业界的知识库 RAG 服务(二),RagFlow 源码全流程深度解析 重要点梳理

文件解析通过接口 /v1/document/run 进行触发的,实际的处理是在 api/db/services/task_service.py 中的 queue_tasks() 中完成的,此方法会根据文件创建一个或多个异步任务,方便异步执行

文件的解析是根据内容拆分为多个任务,通过 Redis 消息队列进行暂存,之后就可以离线异步处理。

直接查看对应的消息队列的消费模块,对应在 rag/svr/task_executor.py 中的 main() 方法中

在这里插入图片描述
在 RAGFlow 中的文件中包含了不少了**数据的清理**操作,比如在 deepdoc/vision/layout_recognizer.py 中的就包含着文档中无用内容的判断 def __is_garbage(b)

文件检索的支持 (包含混合检索)

RAGFlow 的检索目前实现的是混合检索,实现的是文本检索 + 向量检索,混合检索完全依赖 ElasticSearch 实现

文件检索的支持可以查看实际的对话处理流程,对话的 API 为 /v1/conversation/completion,实际对话的处理是在 api/db/services/dialog_service.py 中的 chat() 方法中完成

深入跟踪对话处理流程,可以看到文件的检索是在 rag/nlp/search.py 中的 search() 方法中完成。

==检索结果的重排==在 rag/nlp/search.py 中的 rerank() 中完成的,重排是基于文本匹配得分 + 向量匹配得分混合进行排序,默认文本匹配的权重为 0.3, 向量匹配的权重为 0.7;获取混合相似分之后,基于混合的相似分进行过滤和重排,默认混合得分低于 0.2 的会被过滤掉

在进行上面的检索和重排阶段中,只是进行了必要的过滤,没有限制匹配文档的数量。

实际内容可能会超过大模型的输入 token 数量,因此在调用大模型前会调用 api/db/services/dialog_service.py 文件中 message_fit_in() 根据大模型可用的 token 数量进行过滤。

将检索的内容,历史聊天记录以及问题构造为 prompt,即可作为大模型的输入了

任务1:对解析后的文档的某些字段挖空

文件解析核心函数:build()方法
"E:\ragflow-main\rag\svr\task_executor.py"

这是RAGflow核心的文件解析方法。在这个函数中,根据parser_id选择合适的解析器组,并执行文档的解析和切片
在这里插入图片描述

解析器
rag/app/naive.py

以默认的naive类型为例,深入对应的chunk()实现,其对应的实现在rag/app/naive.py中。此方法中包含了目前主持的docx, pdf, xlsx, md等格式的解析

文本挖空

def __ocr:“E:\ragflow-main\deepdoc\parser\pdf_parser.py”
__ocr方法中,会对文本框进行检测和处理。你可以在这里添加逻辑来识别特定的字段,并进行挖空处理

表格内容提取

__extract_table_content “E:\ragflow-main\deepdoc\parser\docx_parser.py”
__compose_table_content “E:\ragflow-main\deepdoc\parser\docx_parser.py”
如果文档中包含表格,__extract_table_content__compose_table_content函数会处理表格内容。你可以在这里添加逻辑来识别表格中的特定字段,并进行挖空

修改源码

需要在相应的解析器中添加逻辑来识别特定的字段,并将其替换为占位符(挖空)。这可能涉及到正则表达式的使用,以及对文档结构的理解

在这里插入图片描述

相关文章:

爆改RagFlow

爆改RagFlow 一、Rag理论概述二、Ragflow解析参数说明三、♥ RagFlow源码解析核心代码流程梳理1、OCR识别2、版面分析3、parser功能3.1 PdfParser3.1.1 首先&#xff0c;初始化3.1.2 **pdf转图片** [来自工业界的知识库 RAG 服务(二)&#xff0c;RagFlow 源码全流程深度解析](h…...

Unity 使用UGUI制作卷轴开启关闭效果

视频效果 代码 using UnityEngine.UI; using System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using DG.Tweening.Core; using DG.Tweening.Plugins.Options;public class JuanZhou : MonoBehaviour {[SerializeField]private …...

android知识巩固(二.非线性数据结构)

非线性结构:是从逻辑结构上划分,其元素存在一对多或者多对多的相互关系 1.前言 在前一章中,我们了解了数据结构的基本思想,学习了部分基本的线性数据结构,了解了计算机是如何表示和存储数据的,良好的数据结构思想有助于我们写出性能优良的应用 2.目录 目录.png 3.非线性数据结构…...

Kafka中的Topic和Partition有什么关系?

大家好&#xff0c;我是锋哥。今天分享关于【Kafka中的Topic和Partition有什么关系&#xff1f;】面试题。希望对大家有帮助&#xff1b; Kafka中的Topic和Partition有什么关系&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Apache Kafka 中&#…...

CMS漏洞靶场攻略

DeDeCMS 环境搭建 傻瓜式安装 漏洞一&#xff1a;通过文件管理器上传WebShel 步骤⼀:访问目标靶场其思路为 dedecms 后台可以直接上传任意文件&#xff0c;可以通过⽂件管理器上传php文件获取webshell 登陆网站后台 步骤二&#xff1a;登陆到后台点击 【核心】 --》 【文件式…...

PHP高性能webman管理系统EasyAdmin8

介绍 EasyAdmin8-webman 在 EasyAdmin 的基础上使用 webman 最新版重构&#xff0c;PHP 最低版本要求不低于 8.0。基于webman和layui v2.9.x的快速开发的后台管理系统。 项目地址&#xff1a;http://easyadmin8.top 演示地址&#xff1a;http://webman.easyadmin8.top/admin …...

【达梦数据库】64 位操作系统注册 32 位 ODBC 方法

目录 背景思路部署安装64位软件安装包注册32位驱动成功案例其他案例 配置数据源 背景 在使用达梦数据库的过程中&#xff0c;应用需要32位驱动与数据库进行适配 思路 部署32位软件&#xff0c;经过测试&#xff0c;dmmonitor在本地环境及客户环境中前台启动失败报错&#xff…...

渗透学习笔记(十一)Burp Suite 总结

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…...

数据结构与算法学习笔记----约数

数据结构与算法学习笔记----约数 author: 明月清了个风 first publish time: 2024.12.30 ps⭐️主要是求约数&#xff0c;约数的个数&#xff0c;约数的和&#xff0c;涉及到算术基本定理的相关内容&#xff0c;第三题的讲解合并在第二题的思路里一起了。 Acwing 869. 试除法…...

PyAudio库基本知识详解——为自制PCM音频播放器做准备

前言 结合前段时间我们做的音频编解码器&#xff0c;这样我们就可以将获取到的ADPCM数据&#xff0c;转换成PCM数据&#xff0c;然后播放出来&#xff0c;得到一个完整的音频数据&#xff0c;因此&#xff0c;接下来几篇文章中&#xff0c;我们想做一个播放PCM格式的音频播放器…...

微信小程序 覆盖组件cover-view

wxml 覆盖组件 <video src"../image/1.mp4" controls"{{false}}" event-model"bubble"> <cover-view class"controls"> <cover-view class"play" bind:tap"play"> <cover-image class"…...

实战案例——ZooKeeper集群部署(新手教程超详细)

案例目标 了解ZooKeeper分布式应用程序协调服务使用3台机器搭建ZooKeeper集群使用ZooKeeper集群 案例分析 规划节点 ZooKeeper集群节点规划 Ip 主机名 节点 192.168.110.10 zookeeper1 集群节点 192.168.110.20 zookeeper2 集群节点 192.168.110.30 zookeeper3 …...

LeetCode 326 3的幂

如何判断一个整数是否为 3 的幂次方 在编程中&#xff0c;我们经常会遇到各种有趣的数学问题&#xff0c;今天就来探讨一个看似简单却又很有技巧性的问题&#xff1a;如何判断一个给定的整数是否是 3 的幂次方。 一、问题描述 给定一个整数 n&#xff0c;我们需要编写一个函数…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之5

本文要点 前端 问题描述语言 本文继续完善 “描述” ---现在我们应该可以将它称为 “问题problem描述语言 ”。 它 通过对话框的question 引发 表征的issue 的“涌现” 最终 厘清应用程序的“problem”。即它合并了 ISO七层模型中的上面三层&#xff0c;通过将三层 分别形成…...

flink-1.16 table sql 消费 kafka 数据,指定时间戳位置消费数据报错:Invalid negative offset 问题解决

请移步至最后的&#xff1a;2024-12-27日调整实现方式&#xff0c;26日实现的有bug&#xff0c;但是可以作为参考。 2024-12-27日调整实现方式 1.上边的方案&#xff0c;可以实现topic中每个分区都正常有数据的情况&#xff0c;但是如果部分分区没有数据&#xff0c;或者指定的…...

【服务器】上传文件到服务器并训练深度学习模型下载服务器文件到本地

前言&#xff1a;本文教程为&#xff0c;上传文件到服务器并训练深度学习模型&#xff0c;与下载服务器文件到本地。演示指令输入&#xff0c;完整的上传文件到服务器&#xff0c;并训练模型过程&#xff1b;并演示完整的下载服务器文件到本地的过程。 本文使用的服务器为云服…...

MyBatis如何处理延迟加载?

大家好&#xff0c;我是锋哥。今天分享关于【MyBatis如何处理延迟加载&#xff1f;】面试题。希望对大家有帮助&#xff1b; MyBatis如何处理延迟加载&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 MyBatis 中&#xff0c;延迟加载&#xff08;Laz…...

制造BOM的应用思考

一、制造BOM的作用 制造BOM(Manufacturing BOM,MBOM)在制造过程中的应用非常广泛,具体包括以下几个方面: 1. 生产计划和调度: 制造BOM提供了生产过程中所需的所有输入及输出间的关系,包括材料、部品的数量、结构以及制程等信息。这些信息是生产拉动物料需求计划以及成本…...

基于earthSDK三维地图组件开发

上效果 功能点 测量分析相机位置切换geojson数据加载地图打点&#xff0c;显示信息点击回传数据二三位切换 这里二三维切换通上篇openlayers分享&#xff0c;技术交流V:bloxed <template><div class"h100 w100"><div style"width:100%; heig…...

Mono里运行C#脚本5—mono_file_map_open

前面介绍了mono_jit_init初始化,这个函数非常长,要理解起来还是比较困难。因此改变另外一种方式,先从底层的函数开始,再慢慢来探索mono的底层实现,以及它的实现原理,运行的细节。 Mono要运行exe文件,这里是运行test-embed.exe文件,那么就得认识这个文件,解释这个文件的…...

Node.js使用教程

Node.js使用教程 Node.js是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;它让JavaScript运行在服务器端。以下是一个简单的Node.js使用教程&#xff1a; 一、 Node.js开发环境和编译 1.1 安装Node.js 访问Node.js官网下载并安装适合您操作系统的Node.js版本。 1…...

UniApp 组件的深度运用

一、引言 在当今的移动应用开发领域&#xff0c;跨平台开发已成为主流趋势&#xff0c;而 UniApp 作为其中的佼佼者&#xff0c;备受开发者青睐。UniApp 的强大之处很大程度上源于其丰富且功能多样的组件体系&#xff0c;这些组件宛如精巧的积木&#xff0c;能够帮助开发者快速…...

期末算法分析程序填空题

目录 5-1 最小生成树&#xff08;普里姆算法&#xff09; 5-2 快速排序&#xff08;分治法&#xff09; 输入样例&#xff1a; 输出样例&#xff1a; 5-3 归并排序(递归法) 输入样例&#xff1a; 输出样例&#xff1a; 5-4 求解编辑距离问题&#xff08;动态规划法&#xff09;…...

【机器学习】 卷积神经网络 (CNN)

文章目录 1. 为什么需要 CNN2. CNN 的架构3. 卷积层4. 池化层5. CNN 的应用 1. 为什么需要 CNN 前提&#xff1a;利用前置知识&#xff0c;去掉全连接神经网络中的部分参数&#xff0c;提升学习效率。本质&#xff1a;在 DNN 之前加上 CNN&#xff0c;先去除不必要的参数&…...

LeetCode热题100-字母异位词分组【JavaScript讲解】

题目&#xff1a; 根据题目想思路&#xff1a; 模式识别: 一旦需要根据特征进行归类的&#xff0c;就应该利用散列表。【散列表又叫哈希表】 我们遍历数组中的每一项&#xff0c;将每一项字符串拆分成一个一个的字符&#xff0c;并返回成数组的形式&#xff0c;并且进行排序后…...

面试241228

面试可参考 1、cas的概念 2、AQS的概念 3、redis的数据结构 使用场景 不熟 4、redis list 扩容流程 5、dubbo 怎么进行服务注册和调用&#xff0c;6、dubbo 预热 7如何解决cos上传的安全问题kafka的高并发高吞吐的原因ES倒排索引的原理 spring的 bean的 二级缓存和三级缓存 spr…...

AI界的拼多多:DeepSeek

AI界的拼多多:DeepSeek DeepSeek是一家位于中国杭州的人工智能基础技术研究公司,由杭州幻方量化投资管理合伙企业投资成立于2023年5月,专注于研究人工智能基础技术,其官网为deepseek.com.以下是关于DeepSeek的一些具体介绍及举例: 模型发布 DeepSeek Coder:2023年11月…...

备战春招 | 数字IC FPGA笔试题

在数字电路设计的领域&#xff0c;无论是数字IC&#xff08;集成电路&#xff09;还是FPGA&#xff08;现场可编程门阵列&#xff09;的设计&#xff0c;都需要对一系列核心概念有深刻的理解和掌握。随着科技的快速发展&#xff0c;这些领域的面试题目也在不断更新&#xff0c;…...

微服务-Sentinel新手入门指南

微服务为什么要使用流控降级组件 为了提高系统运行期间的稳定性和可用性 在微服务环境下&#xff0c;服务之间存在复杂的调用关系&#xff0c;单个服务的故障或过载可能会迅速影响到整个系统&#xff0c;导致服务雪崩效应。流控组件可以限制进入系统的流量&#xff0c;防止系…...

git clone 超时

git clone 超时 参考 https://blog.csdn.net/qq_45906972/article/details/142214187?utm_mediumdistribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-142214187-blog-137158358.235v43pc_blog_bottom_relevance_base8&spm1001.2101.3001.…...

java的bio、nio、aio 以及操作系统的select、poll、epoll

在 Java 和其他编程语言中&#xff0c;I/O 模型的选择对网络应用的性能和可扩展性有着重要影响。以下是 BIO&#xff08;Blocking I/O&#xff09;、NIO&#xff08;Non-blocking I/O&#xff09;、AIO&#xff08;Asynchronous I/O&#xff09;&#xff0c;以及操作系统级别的…...

Redis——数据过期策略

文章目录 1. 引入2. 数据过期策略2.1 策略一&#xff1a;惰性删除2.1.1 原理2.1.2 优点2.1.3 缺点 2.2 策略二&#xff1a;定期删除2.2.1 原理2.2.2 模式2.2.3 优点2.2.4 缺点 2.3 两种策略的比较 3. 总结 1. 引入 Redis 是一个 高性能 的非关系型数据库&#xff0c;由于 Redi…...

kubernetes Gateway API-1-部署和基础配置

文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…...

二、SQL语言,《数据库系统概念》,原书第7版

文章目录 一、概览SQL语言1.1 SQL 语言概述1.1.1 SQL语言的提出和发展1.1.2 SQL 语言的功能概述 1.2 利用SQL语言建立数据库1.2.1 示例1.2.2 SQL-DDL1.2.2.1 CREATE DATABASE1.2.2.2 CREATE TABLE 1.2.3 SQL-DML1.2.3.1 INSERT INTO 1.3 用SQL 语言进行简单查询1.3.1 单表查询 …...

【postgresql 物化视图】自动刷新物化视图2种方法

普通视图就是一个虚拟表&#xff0c;不占内存。而物化视图是存在的&#xff0c;占内存。 物化视图&#xff0c;默认是手动刷新。下面是手动刷新的例子。我们来创建一个物化视图。 create MATERIALIZED VIEW dnh_analasis_view as select cjsj,a,b,c,d from table_1; REFRESH …...

1 数据库(下):多表设计 、多表查询 + SQL中的with查询语法(MySQL8.0以后版本才支持这种新语法)+ 数据库优化(索引优化)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、多表设计1 多表设计-概述2 三种多表关系一对多&#xff08;多对一&#xff09;&#xff08;1&#xff09;无外键约束&#xff08;逻辑外键&#xff09;&…...

CPT203 Software Engineering 软件工程 Pt.2 敏捷方法和需求工程(中英双语)

文章目录 3. Aglie methods&#xff08;敏捷方法&#xff09;3.1 Aglie methods&#xff08;敏捷方法&#xff09;3.1.1 特点3.1.2 优点3.1.3 缺点3.1.4 原则3.1.5 计划驱动与敏捷方法的对比 3.2 Scrum3.2.1 Scrum roles3.2.2 Scrum Activities and Artifacts3.2.2.1 Product B…...

【Linux】进度条

本文中&#xff0c;我们来写一个进度条。 本文大纲&#xff1a; 写一个命令行版的进度条。 1.回车换行 2.缓冲区问题&#xff08;本文不深究&#xff09; ​ 2.1测试代码 3.写一个什么样的进度条&#xff1f; ​ version1 ​ version2 回车换行 这俩不是一个概念&…...

期权懂|个股期权的流动性如何?

锦鲤三三每日分享期权知识&#xff0c;帮助期权新手及时有效地掌握即市趋势与新资讯&#xff01; 个股期权的流动性如何&#xff1f; 个股期权作为场外交易工具&#xff0c;具有较高的灵活性。场外交易意味着交易双方可以直接协商交易条款&#xff0c;这有助于满足不同投资者的…...

U盘格式化工具合集:6个免费的U盘格式化工具

在日常使用中&#xff0c;U盘可能会因为文件系统不兼容、数据损坏或使用需求发生改变而需要进行格式化。一个合适的格式化工具不仅可以清理存储空间&#xff0c;还能解决部分存储问题。本文为大家精选了6款免费的U盘格式化工具&#xff0c;并详细介绍它们的功能、使用方法、优缺…...

Java学习-Redis

简介 Redis诞生于2009年全称是Remote Dictionary Server&#xff0c;远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 特征 特征&#xff1a; 键值&#xff08;key-value&#xff09;型&#xff0c;value支持多种不同数据结构&#xff0c;功能丰富 单线程&a…...

Java处理视频思路

1.首先实现断点续传功能。 断点续传实现思路&#xff1a; 前端对文件分块。前端使用多线程一块一块上传&#xff0c;上传前给服务端发一个消息校验该分块是否上传&#xff0c;如果已上传则不再上传。如果从该断点处断网了&#xff0c;下次上传时&#xff0c;前面的分块已经存在…...

Python入门:8.Python中的函数

引言 在编写程序时&#xff0c;函数是一种强大的工具。它们可以将代码逻辑模块化&#xff0c;减少重复代码的编写&#xff0c;并提高程序的可读性和可维护性。无论是初学者还是资深开发者&#xff0c;深入理解函数的使用和设计都是编写高质量代码的基础。本文将从基础概念开始…...

计算机网络 (8)物理层的传输方式

一、串行传输与并行传输 串行传输 定义&#xff1a;串行传输是一种数据传输方式&#xff0c;指的是逐位地按照顺序传输数据。在串行传输中&#xff0c;数据位逐个按照一定的顺序进行传输&#xff0c;可以通过单条线路或信道进行。特点&#xff1a; 逐位传输&#xff1a;串行传输…...

3.微服务灰度发布落地实践(组件灰度增强)

文章目录 前言调用链示图dubbo服务之间的的调链cloud 服务之间的调用链 网关servlet容器: 标签续传1.定义插件2.实现灰度增强拦截 线程池: 标签续传1.拦截Runnable或Callable,接口增强实现标签续传;Callable 插件定义Runnable 插件定义拦载Callabl或Runnable构造(可共用)拦载ru…...

每天40分玩转Django:Django Email

Django Email 一、知识要点总览表 类别知识点基础配置SMTP设置、Email配置项发送方式同步发送、异步发送邮件类型纯文本、HTML邮件、带附件邮件异步任务Celery集成、任务队列高级特性邮件模板、批量发送 二、Email基础配置 1. 配置settings.py # settings.py EMAIL_BACKEN…...

ipad如何直连主机(Moonlight Sunshine)

Windows 被连接主机&#xff08;Windows&#xff09; 要使用的话需要固定ip&#xff0c;不然ip会换来换去&#xff0c;固定ip方法本人博客有记载Github下载Sunshine Sunshine下载地址除了安装路径需要改一下&#xff0c;其他一路点安装完成后会打开Sunshine的Web UI&#xff…...

linux 网络安全不完全笔记

一、安装Centos 二、Linux网络网络环境设置 a.配置linux与客户机相连通 b.配置linux上网 三、Yum详解 yum 的基本操作 a.使用 yum 安装新软件 yum install –y Software b.使用 yum 更新软件 yum update –y Software c.使用 yum 移除软件 yum remove –y Software d.使用 yum …...

一、Hadoop概述

文章目录 一、Hadoop是什么二、Hadoop发展历史三、Hadoop三大发行版本1. Apache Hadoop2. Cloudera Hadoop3. Hortonworks Hadoop 四、Hadoop优势1. 高可靠性2. 高扩展性3. 高效性4. 高容错性 五、Hadoop 组成1. Hadoop1.x、2.x、3.x区别2. HDFS 架构概述3. YARN 架构概述4. Ma…...

Android 转场动画合集

项目背景&#xff1a;mvvm组件化&#xff0c;然后由于领导要求&#xff0c;使用MainActivity为主界面&#xff0c;各种业务使用Fragment处理。所以~ 由于单独ActivityN Fragment 的方式&#xff0c;经过十多天的试错&#xff0c;我确认一件事情。再确认过架构方式后一定要了解下…...