Elasticsearch BBQ 与 OpenSearch FAISS:向量搜索性能对比

作者:来自 Elastic Ugo Sangiorgi

Elasticsearch BBQ 与 OpenSearch FAISS 的性能对比。

带有二值量化的向量搜索:使用 BBQ 的 Elasticsearch 比使用 FAISS 的 OpenSearch 快 5 倍。Elastic 收到了来自社区的请求,希望澄清 Elasticsearch 与 OpenSearch 在性能上的差异,特别是在语义搜索 / 向量搜索方面,因此我们进行了这些性能测试,以提供清晰、数据驱动的对比。

二进值量化对决

以原始形式存储高维向量会占用大量内存。量化技术通过将这些向量压缩为更紧凑的表示形式,大幅减少内存占用。搜索过程在压缩空间中进行,从而降低计算复杂度,特别是在处理大型数据集时,提高搜索速度。

Elastic 致力于将 Lucene 打造成顶级的向量引擎。我们在 Elasticsearch 8.16 中基于 Lucene 引入了更优的二值量化(BBQ),并在 8.18 和 9.0 中进一步优化。BBQ 基于一种新的标量量化方法,将 float32 维度压缩为比特,实现了约 95% 的内存压缩率,同时保持了较高的排序质量。

另一方面,OpenSearch 使用多个向量引擎:nmslib(现已弃用)、Lucene 和 FAISS。在之前的一篇博客中,我们对 Elasticsearch 和 OpenSearch 的向量搜索进行了比较。我们使用了三个不同的数据集,并在两种产品上测试了不同的引擎组合和配置。

本博客聚焦于两款产品当前可用的二进值量化算法。我们使用 openai_vector 的 Rally track,测试了 Elasticsearch 的 BBQ 与 OpenSearch 使用 FAISS 的二进值量化。

测试的主要目标是在相同召回率水平下评估两种方案的性能。什么是召回率?召回率是衡量搜索系统成功检索到多少相关结果的指标。

在本次评估中,recall@k 尤为关键,其中 k 表示所考虑的前 k 个结果。Recall@10、Recall@50 和 Recall@100 分别衡量在返回的前 10、50 和 100 个结果中,出现了多少真实的相关项。召回率的范围是从 0 到 1(或从 0% 到 100%)。这很重要,因为我们讨论的是近似 KNN(ANN)而不是精确 KNN,在精确 KNN 中召回率总是 1(100%)。

对于每个 k 值,我们还指定了 n,表示在最终排序之前所考虑的候选项数量。这意味着在计算 Recall@10、Recall@50 和 Recall@100 时,系统首先通过二进值量化算法检索 n 个候选项,再对其排序,判断前 k 个结果中是否包含预期的相关项。

通过控制 n,我们可以分析效率与准确率之间的权衡。较高的 n 通常会提升召回率,因为有更多候选项可供排序,但也会增加延迟降低吞吐量。相反,较低的 n 虽能加快检索速度,但若候选项太少,可能会降低召回率。

在本次对比中,Elasticsearch 在相同配置下展现出比 OpenSearch 更低的延迟和更高的吞吐量。

方法论

完整的配置、Terraform 脚本、Kubernetes 配置文件以及使用的特定 Rally track 均可在此仓库中的 openai_vector_bq 路径下找到。

与以往的基准测试一样,我们使用了一个 Kubernetes 集群,包含以下节点池配置:

  • 1 个用于 Elasticsearch 9.0 的节点池,包含 3 台 e2-standard-32 机器(128GB 内存,32 核 CPU)

  • 1 个用于 OpenSearch 2.19 的节点池,包含 3 台 e2-standard-32 机器(128GB 内存,32 核 CPU)

  • 1 个用于 Rally 的节点池,包含 2 台 e2-standard-4 机器(16GB 内存,4 核 CPU)

我们分别搭建了一个 Elasticsearch 9.0 集群和一个 OpenSearch 2.19 集群。

Elasticsearch 和 OpenSearch 都在完全相同的配置下进行测试:我们使用经过一些修改的 openai_vector Rally track,该 track 使用了来自 NQ 数据集的 250 万个文档,并附加了使用 OpenAI 的 text-embedding-ada-002 模型生成的向量嵌入。

{"source-file": "open_ai_corpus-initial-indexing.json.bz2","document-count": 2580961,"compressed-bytes": 32076749416,"uncompressed-bytes": 90263571686
}

测试结果报告了在不同召回率水平(recall@10、recall@50 和 recall@100)下的延迟和吞吐量表现,搜索操作由 8 个并发客户端执行。我们使用了单个分片,且未设置副本。

我们运行了以下 k-n-rescore 的组合,例如 10-2000-2000,意思是:k 为 10,n 为 2000,rescore 也为 2000,表示从 2000 个候选中选出 top k(10 个)结果,并对这 2000 个候选进行重排序(相当于“过采样因子”为 1)。每次搜索运行了 10,000 次,其中前 1,000 次作为预热。

Recall@10

  • 10-40-40
  • 10-50-50
  • 10-100-100
  • 10-200-200
  • 10-500-500
  • 10-750-750
  • 10-1000-1000
  • 10-1500-1500
  • 10-2000-2000

Recall@50

  • 50-150-150
  • 50-200-200
  • 50-250-250
  • 50-500-500
  • 50-750-750
  • 50-1000-1000
  • 50-1200-1200
  • 50-1500-1500
  • 50-2000-2000

Recall@100

  • 100-200-200
  • 100-250-250
  • 100-300-300
  • 100-500-500
  • 100-750-750
  • 100-1000-1000
  • 100-1200-1200
  • 100-1500-1500
  • 100-2000-2000

要复现该基准测试,rally-elasticsearch 和 rally-opensearch 的 Kubernetes 配置清单中,所有相关变量都已外部化到 ConfigMap 中,分别可在此处获取(ES)和此处获取(OS)。其中的 search_ops 参数可以自定义,用于测试任意组合的 k、n 和 rescore 值。

OpenSearch Rally 配置如下:

/k8s/rally-openai_vector-os-bq.yml
apiVersion: v1
kind: ConfigMap
metadata:name: rally-params-oslabels:app: rally-opensearch
data:user-tags.json: |{"product": "OpenSearch","product-version": "OpenSearch-2.19.0","product-label": "OpenSearch-2.19-faiss","benchmark-run": "19-feb-recall@100"}track-params.json: |{"mapping_type": "vectors-only-mapping-with-docid","standalone_search_clients": 8,"standalone_search_iterations": 5000,"ann_threshold": 0,"vector_mode": "on_disk","compression_level": "32x","vector_method_name": "hnsw","vector_method_engine": "faiss","search_ops": [[100, 200, 200],[100, 250, 250],[100, 300, 300],[100, 500, 500],[100, 750, 750],[100, 1000, 1000],[100, 1200, 1200],[100, 1500, 1500],[100, 2000, 2000]]}

OpenSearch 索引配置

ConfigMap 中的变量随后会用于索引配置,其中部分参数保持不变。在 OpenSearch 中,1-bit 量化通过将压缩等级设置为 “32x” 来配置。

index-vectors-only-mapping-with-docid-mapping.json

{"settings": {{% if preload_pagecache %}"index.store.preload": ["vec", "vex", "vem", "veq", "veqm", "veb", "vebm"],{% endif %}"index.number_of_shards": {{ number_of_shards | default(1) }},"index.number_of_replicas": {{ number_of_replicas | default(0) }},"index.knn": true,"index.knn.advanced.approximate_threshold": {{ ann_threshold | default(15000) }}},"mappings": {"dynamic": false,"properties": {"docid": {"type": "keyword"},"emb": {"type": "knn_vector","dimension": 1536,"space_type": "innerproduct","data_type": "float","mode": {{ vector_mode | default("in_memory") | tojson }},"compression_level": {{ compression_level | default("32x") | tojson }},"method": {"name": {{ vector_method_name | default("hnsw") | tojson }},"engine": {{ vector_method_engine | default("faiss") | tojson }},"parameters": {"ef_construction": 100,"m": 16}}}}}
}

Elasticsearch Rally 配置

/k8s/rally-openai_vector-es-bq.yml

apiVersion: v1
kind: ConfigMap
metadata:name: rally-params-eslabels:app: rally-elasticsearch
data:user-tags.json: |{"product": "Elasticsearch","product-version": "Elasticsearch-9.0.0-ade01164","product-label": "Elasticsearch-9.0-BBQ","benchmark-run": "19-feb-recall@100"}track-params.json: |{"mapping_type": "vectors-only-mapping-with-docid","standalone_search_clients": 8,"standalone_search_iterations": 5000,"vector_index_type": "bbq_hnsw","search_ops": [[100, 200, 200],[100, 250, 250],[100, 300, 300],[100, 500, 500],[100, 750, 750],[100, 1000, 1000],[100, 1200, 1200],[100, 1500, 1500],[100, 2000, 2000]]}

Elasticsearch 索引配置

index-vectors-only-mapping-with-docid-mapping.json

{"settings": {{# non-serverless-index-settings-marker-start #}{%- if build_flavor != "serverless" or serverless_operator == true -%}{% if preload_pagecache %}"index.store.preload": [ "vec", "vex", "vem", "veq", "veqm", "veb", "vebm" ],{% endif %}"index.number_of_shards": {{ number_of_shards | default(1) }},"index.number_of_replicas": {{ number_of_replicas | default(0) }}{%- endif -%}{# non-serverless-index-settings-marker-end #}},"mappings": {"dynamic": false,"properties": {"docid": {"type": "keyword"},"emb": {"type": "dense_vector","element_type": "float","dims": 1536,"index": true,"similarity": "dot_product","index_options": {"type": {{ vector_index_type | default("bbq_hnsw") | tojson }},"ef_construction": 100,"m": 16}}}}
}

结果

有多种方式来解读结果。对于延迟和吞吐量,我们分别在每个召回率水平绘制了简化图表和详细图表。如果我们将“更高更好”作为每个指标的标准,那么很容易看到差异。然而,延迟是负向指标(更低更好),而吞吐量是正向指标。对于简化图表,我们使用了 (recall / latency) * 10000(简称 “速度”)和 recall * throughput,因此这两个指标意味着更高的速度和更高的吞吐量更好。接下来我们来看看。

Recall @ 10 - 简化图表

在该召回率水平下,Elasticsearch BBQ 的速度是 OpenSearch FAISS 的最多 5 倍(平均快 3.9 倍),且吞吐量平均是 OpenSearch FAISS 的 3.2 倍

Recall @ 10 - 详细图表

tasklatency.meanthroughput.meanavg_recall
Elasticsearch-9.0-BBQ10-100-10011.70513.580.89
Elasticsearch-9.0-BBQ10-1000-10027.33250.550.95
Elasticsearch-9.0-BBQ10-1500-150035.93197.260.95
Elasticsearch-9.0-BBQ10-200-20013.33456.160.92
Elasticsearch-9.0-BBQ10-2000-200044.27161.400.95
Elasticsearch-9.0-BBQ10-40-4010.97539.940.84
Elasticsearch-9.0-BBQ10-50-5011.00535.730.85
Elasticsearch-9.0-BBQ10-500-50019.52341.450.93
Elasticsearch-9.0-BBQ10-750-75022.94295.190.94
OpenSearch-2.19-faiss10-100-10035.59200.610.94
OpenSearch-2.19-faiss10-1000-1000156.8158.300.96
OpenSearch-2.19-faiss10-1500-1500181.7942.970.96
OpenSearch-2.19-faiss10-200-20047.91155.160.95
OpenSearch-2.19-faiss10-2000-2000232.1431.840.96
OpenSearch-2.19-faiss10-40-4027.55249.250.92
OpenSearch-2.19-faiss10-50-5028.78245.140.92
OpenSearch-2.19-faiss10-500-50079.4497.060.96
OpenSearch-2.19-faiss10-750-750104.1975.490.96

Recall @ 50 - 简化图表

在该召回率水平下,Elasticsearch BBQ 的速度是 OpenSearch FAISS 的最多 5 倍(平均快 4.2 倍),且吞吐量平均是 OpenSearch FAISS 的 3.9 倍

Recall @ 50 - 详细结果

TaskLatency MeanThroughput MeanAvg Recall
Elasticsearch-9.0-BBQ50-1000-100025.71246.440.95
Elasticsearch-9.0-BBQ50-1200-120028.81227.850.95
Elasticsearch-9.0-BBQ50-150-15013.43362.900.90
Elasticsearch-9.0-BBQ50-1500-150033.38202.370.95
Elasticsearch-9.0-BBQ50-200-20012.99406.300.91
Elasticsearch-9.0-BBQ50-2000-200042.63163.680.95
Elasticsearch-9.0-BBQ50-250-25014.41373.210.92
Elasticsearch-9.0-BBQ50-500-50017.15341.040.93
Elasticsearch-9.0-BBQ50-750-75031.25248.600.94
OpenSearch-2.19-faiss50-1000-1000125.3562.530.96
OpenSearch-2.19-faiss50-1200-1200143.8754.750.96
OpenSearch-2.19-faiss50-150-15043.64130.010.89
OpenSearch-2.19-faiss50-1500-1500169.4546.350.96
OpenSearch-2.19-faiss50-200-20048.05156.070.91
OpenSearch-2.19-faiss50-2000-2000216.7336.380.96
OpenSearch-2.19-faiss50-250-25053.52142.440.93
OpenSearch-2.19-faiss50-500-50078.9897.820.95
OpenSearch-2.19-faiss50-750-750103.2075.860.96

Recall @ 100

在该召回率水平下,Elasticsearch BBQ 的速度是 OpenSearch FAISS 的最多 5 倍(平均快 4.6 倍),且吞吐量平均是 OpenSearch FAISS 的 3.9 倍

Recall @ 100 - 详细结果

tasklatency.meanthroughput.meanavg_recall
Elasticsearch-9.0-BBQ100-1000-100027.82243.220.95
Elasticsearch-9.0-BBQ100-1200-120031.14224.040.95
Elasticsearch-9.0-BBQ100-1500-150035.98193.990.95
Elasticsearch-9.0-BBQ100-200-20014.18403.860.88
Elasticsearch-9.0-BBQ100-2000-200045.36159.880.95
Elasticsearch-9.0-BBQ100-250-25014.77433.060.90
Elasticsearch-9.0-BBQ100-300-30014.61375.540.91
Elasticsearch-9.0-BBQ100-500-50018.88340.370.93
Elasticsearch-9.0-BBQ100-750-75023.59285.790.94
OpenSearch-2.19-faiss100-1000-1000142.9058.480.95
OpenSearch-2.19-faiss100-1200-1200153.0351.040.95
OpenSearch-2.19-faiss100-1500-1500181.7943.200.96
OpenSearch-2.19-faiss100-200-20050.94131.620.83
OpenSearch-2.19-faiss100-2000-2000232.5333.670.96
OpenSearch-2.19-faiss100-250-25057.08131.230.87
OpenSearch-2.19-faiss100-300-30062.76120.100.89
OpenSearch-2.19-faiss100-500-50084.3691.540.93
OpenSearch-2.19-faiss100-750-750111.3369.950.94

BBQ 的改进

自首次发布以来,BBQ 取得了长足的进步。在 Elasticsearch 8.16 版本中,为了进行对比,我们包含了 8.16 的基准测试结果与当前版本的对比,可以看到自那时以来召回率和延迟已经得到了显著改善。

在 Elasticsearch 8.18 和 9.0 中,我们重新编写了向量量化的核心算法。因此,尽管 8.16 版本中的 BBQ 已经表现出色,但最新版本的性能更为强大。你可以在这里和这里阅读相关内容。简而言之,每个向量都通过优化的标量分位数进行单独量化。结果是,用户在向量搜索中可以享受到更高的准确性,同时不影响性能,从而使 Elasticsearch 的向量检索更强大。

结论

在 Elasticsearch BBQ 与 OpenSearch FAISS 的性能对比中,Elasticsearch 在向量搜索上显著优于 OpenSearch,查询速度最多快 5 倍,吞吐量在各个召回率水平上平均高出 3.9 倍。

主要发现包括:

  • Recall@10:Elasticsearch BBQ 最多比 OpenSearch FAISS 快 5 倍(平均快 3.9 倍),吞吐量平均是 OpenSearch FAISS 的 3.2 倍。

  • Recall@50:Elasticsearch BBQ 最多比 OpenSearch FAISS 快 5 倍(平均快 4.2 倍),吞吐量平均是 OpenSearch FAISS 的 3.9 倍。

  • Recall@100:Elasticsearch BBQ 最多比 OpenSearch FAISS 快 5 倍(平均快 4.6 倍),吞吐量平均是 OpenSearch FAISS 的 3.9 倍。

这些结果突出了 Elasticsearch BBQ 在高维向量搜索场景中的高效性和性能优势。Elasticsearch 8.16 中引入的更优二值量化(BBQ)技术提供了显著的内存压缩(约 95%),同时保持了高排名质量,使其成为大规模向量搜索应用的优选方案。

在 Elastic,我们不断创新,致力于提升 Apache Lucene 和 Elasticsearch,以提供最佳的向量数据库,适用于搜索和检索用例,包括 RAG(Retrieval Augmented Generation - 检索增强生成)。我们的最新进展显著提高了性能,使向量搜索比以往更快、更节省空间,基于 Lucene 10 的改进。本文正是这一创新的又一例证。

你可以通过这个自学搜索 AI 的实操教程亲自体验向量搜索。现在,你可以开始免费云试用,或者在本地机器上尝试 Elastic。

原文:Elasticsearch BBQ vs. OpenSearch FAISS: Vector search performance comparison - Elasticsearch Labs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/77342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue 3.4 新特性详解:Composition API 与 Effect 作用域 API 实战

一、Vue 3.4 核心特性概览 Vue 3.4 代号「🏀 Slam Dunk」,带来多项关键升级: 模板解析器性能翻倍:单文件组件(SFC)构建效率提升 44%,解析速度提升 2 倍。响应式系统优化:计算属性和 watchEffect 触发更精准,减少无效渲染。Effect 作用域 API 稳定:通过 effectScope…

【day8】调用AI接口,生成自动化测试用例

1、项目结构建议 project/ ├── api_docs/ # 存放接口文档 │ └── XX系统.swagger.json ├── ai_generator/ # AI测试用例生成模块 │ └── test_case_generator.py ├── tests/ # 生成的测试用例 │ └── test_user_api.py ├── conftest.py # pytest配置 ├─…

React应用开发学习指南

AI生成研究报告:关键词 React应用开发 React 已经成为前端 Web 开发领域的主导力量,它是一个免费且开源的 JavaScript 库,主要用于构建用户界面 (UI) 1。其多功能性延伸到为 Web 和原生应用程序创建 UI,使其成为行业内备受追捧的…

MSTP+VRRP+DHCP(ENSP)

下载链接 通过网盘分享的文件&#xff1a;MSTPVRRPDHCP拓扑图 链接: https://pan.baidu.com/s/1ehRwRQ-WzKC8PsUHsTe70Q?pwd345d 提取码: 345d PC1 PC2 PC5 AR1 为AR1各端口配置IP地址 <Huawei>sys [Huawei]un in en [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/…

第一个Qt开发的OpenCV程序

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 下载安装Qt&#xff1a;https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下载安装OpenCV&#xff1a;https://opencv.org/releases/ 下载安装CMake&#xff1a;Downl…

深入解析 Python 中的装饰器 —— 从基础到实战

1. 装饰器基础 1.1 什么是装饰器&#xff1f; 装饰器本质上是一个 Python 函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象。 1.2 语法糖&#xff1a; 符号 Python 提供了 符号作为装饰器的语法糖&#xff0c…

研究生面试常见问题

研究生面试是考研复试的重要环节&#xff0c;面试表现直接关系到录取结果。以下从面试流程、常见问题分类及回答技巧等方面为您整理了相关内容&#xff0c;帮助您更好地准备面试。 一、研究生面试的基本流程 自我介绍&#xff1a;通常需要准备1分钟左右的中文或英文自我介绍&a…

无人机避障与目标识别技术分析!

一、无人机避障技术 1. 技术实现方式 传感器融合&#xff1a; 视觉传感&#xff08;RGB/双目/红外相机&#xff09;&#xff1a;基于SLAM&#xff08;同步定位与地图构建&#xff09;实现环境建模&#xff0c;但依赖光照条件。 激光雷达&#xff08;LiDAR&#xff09;&…

Facebook隐私保护:从技术到伦理的探索

在这个数字化时代&#xff0c;隐私保护已成为公众关注的焦点。Facebook&#xff0c;作为全球最大的社交媒体平台之一&#xff0c;其用户隐私保护问题更是引起了广泛的讨论。本文将从技术层面和伦理层面探讨 Facebook 在隐私保护方面的努力和挑战。 技术层面的隐私保护 在技术…

vmware17 虚拟机 ubuntu22.04 桥接模式,虚拟机无法接收组播消息

问题描述&#xff1a; 在一个项目中&#xff0c;宿主机win10中&#xff0c;使用的vmware17pro 虚拟机安装的ubuntu22.04&#xff0c;按照网上的教程使用Qt绑定组播消息&#xff0c;在另外一个Ubuntu工控机上发送用wiresahrk抓包的组播消息 sudo tcpreplay -i enp1s0 --loop0 y…

《Operating System Concepts》阅读笔记:p735-p737

《Operating System Concepts》学习第 62 天&#xff0c;p735-p737 总结&#xff0c;总计 3 页。 一、技术总结 1.distributed system (1)定义 A collection of loosely coupled nodes interconnected by a communication network(一组通过通信网络相互连接的松散耦合节点)…

NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)

一个具有n个顶点的连通图&#xff0c;其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说&#xff0c;若砍去⼀条边就会使图不连通图&#xff1b;若增加⼀条边就会形成回路。 ⼀个图的⽣成树可能有多个&#xff0c;将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树…

小白从0学习网站搭建的关键事项和避坑指南(2)

以下是针对小白从零学习网站搭建的 进阶注意事项和避坑指南&#xff08;第二期&#xff09;&#xff0c;覆盖开发中的高阶技巧、常见陷阱及解决方案&#xff0c;帮助你在实战中提升效率和质量&#xff1a; 一、进阶技术选型避坑 1. 前端框架选择 误区&#xff1a;盲目追求最新…

Java的Servlet的监听器Listener 笔记250417

Java的Servlet的监听器Listener 笔记250417 分类1: 一、生命周期监听器 监听容器&#xff08;如 Tomcat&#xff09;中应用、会话或请求的创建与销毁。 监听器接口触发事件典型用途ServletContextListener应用启动 (contextInitialized)、关闭 (contextDestroyed)全局资源管…

网络安全领域的AI战略准备:从概念到实践

网络安全领域的AI准备不仅涉及最新工具和技术的应用&#xff0c;更是一项战略必需。许多企业若因目标不明确、数据准备不足或与业务重点脱节而未能有效利用AI技术&#xff0c;可能面临严重后果&#xff0c;包括高级网络威胁数量的激增。 AI准备的核心要素 构建稳健的网络安全…

[数据结构]2. 顺序表

顺序表 1. 介绍基本概念存储方式优点缺点应用场景 2. 顺序表操作SeqList.hSeqlist.c 1. 介绍 基本概念 顺序表是用一组地址连续的存储单元依次存储线性表的数据元素。线性表是具有相同数据类型的 n 个数据元素的有限序列&#xff0c;在顺序表中&#xff0c;元素之间的逻辑顺序…

o3和o4-mini的升级有哪些亮点?

ChatGPT是基于OpenAI GPT系列的高性能对话生成AI&#xff0c;经过多代迭代不断提升自然语言理解和生成能力。 在过去的一年中&#xff0c;OpenAI先后发布了GPT-4、GPT‑4.1及多种mini版本&#xff0c;为不同使用场景提供灵活选择。​ 随着用户需求向更高效、更精准的推理和视觉…

Chrome漏洞可窃取数据并获得未经授权的访问权限

在发现两个关键漏洞后,谷歌发布了Chrome浏览器的紧急安全更新。这些漏洞可能允许攻击者窃取敏感数据并未经授权访问用户系统。 这些缺陷被识别为CVE-2025-3619和CVE-2025-3620,在Windows和Mac的135.0.7049.95/.96之前影响Chrome版本,影响Linux的135.0.7049.95/.96。该更新将在…

力扣面试150题--两数之和 和 快乐数

Day 25 题目描述 思路 创建一个hashmap从前向后遍历数组如果存在target-nums[i]在map中&#xff0c;记录它们两个的序号返回即可不存在&#xff0c;就将该元素放入map中&#xff0c;存放序号 注意&#xff1a;题目说的是必然存在唯一解 class Solution {public int[] twoSum…

Flutter_学习记录_状态管理之GetX

Flutter GetX 状态管理框架全面解析 1. 状态管理与 Flutter GetX 介绍 1.1 状态管理 通俗理解&#xff1a;当我们需要在多个页面&#xff08;组件/Widget&#xff09;之间共享状态&#xff08;数据&#xff09;&#xff0c;或者在一个页面中的多个子组件之间共享状态时&…