工业界如何更新内存中的索引?

简介: 工业界常用Double Buffer(双缓冲)机制更新内存索引:维护两份索引,读取时指向旧版本,后台更新新版本,通过原子操作切换指针,实现无锁读写。更新时批量处理,避免频繁切换。但该方案内存占用翻倍,仅适用于中小规模索引,大规模系统需结合磁盘存储与其他策略。

我们先来看这么一个问题:如果现在有一个小规模的倒排索引,它能完全加载在内存中。当有新文章进入内存的时候,倒排索引该如何更新呢?这个问题看似简单,但是实现起来却非常复杂。

我们能想到最直接的解决思路是,只要解析新文章有哪些关键词,然后将文章 ID 加入倒排表中关键词对应的文档列表即可。没错,在没有其他用户使用的情况下,这样的方法是可行的。但如果你有过一定的工程经验,你就会知道,在实际应用中,必然会有多个用户同时访问这个索引。

这个时候,如果我们直接更新倒排索引,就可能造成用户访问错误,甚至会引发程序崩溃。因此,一般来说,我们会对倒排表加上「读写锁」,然后再更新。但是,加上「锁」之后会带来频繁的读写锁切换,整个系统的检索效率会比无锁状态有所下降。

因此,为了使得系统有更好的性能,在工业界的实现中,我们会使用一种叫做 Double Buffer(双缓冲)机制 的解决方案,使得我们可以在无锁状态下对索引完成更新。

所谓 Double Buffer ,就是在内存中同时保存两份一样的索引,一个是索引 A,一个是索引 B。我们会使用一个指针 p 指向索引 A,表示索引 A 是当前可访问的索引。那么用户在访问时就会通过指针 p 去访问索引 A。这个时候,如果我们要更新,只更新索引 B。这样,索引 A 和索引 B 之间就不存在读写竞争的问题了。因此,在这个过程中,索引 A 和索引 B 都可以保持无锁的状态。

那更新完索引 B 之后,我们该如何告知用户应该来访问索引 B 呢?这时候,我们可以将指针 p 通过 原子操作(即无法被打断的最细粒度操作,在 Java 和 C++11 等语言中都有相应实现)从 A 直接切换到 B 上。接着,我们就把索引 B 当作只读索引,然后更新索引 A。

通过这样的机制,我们就能同时维护两个倒排索引,保持一个读、一个写,并且来回切换,最终完成高性能的索引更新。不过,为了避免切换太频繁,我们并不是每来一条新数据就更新,而是积累一批新数据以后再批量更新。这就是工业界常用的 Double Buffer 机制。

笔者没有明白的是:B 有了新增的文档 30 ,切换到 B 了,那么 A 里面并没有文档 30 ,如何同步数据呢?

用 Double Buffer 机制更新索引是一个高效的方案,追求检索性能的应用场景常常会使用这种方案。但是对于索引到了一定量级的应用而言,使用 Double Buffer 会带来翻倍的内存资源开销。比如说,像搜索引擎这样万亿级网页的索引规模,数据大部分存储在磁盘上,更是无法直接使用 Double Buffer 机制进行更新的。因此,我们还是需要寻找其他的解决方案。

相关文章
|
5月前
|
存储 JSON 关系型数据库
MySQL 全面介绍 ,现在企业都用mysql哪个版本?
MySQL是开源高性能关系型数据库,广泛用于Web与企业应用。历经MySQL AB、Sun至Oracle发展,现主流版本为MySQL 8.0——具备窗口函数、CTE、增强JSON支持、角色权限管理及显著性能优化,兼具安全性、可扩展性与活跃社区支持。
760 1
|
安全 API 网络安全
API安全危机四伏!开发者掌握这“十八般武艺”才能破局?
在数字化时代,API作为连接应用的核心枢纽,其安全性至关重要。本文深入解析API安全攻防实战技巧,涵盖数据传输加密、身份认证、输入验证、速率限制、日志监控、API网关应用及持续安全实践等七大防御策略,帮助开发者全面掌握保护数据接口的关键技能,构筑坚实的安全防线。
796 100
|
7月前
|
机器学习/深度学习 JSON 文字识别
0.9B 小模型,OCR 大能力——GLM-OCR 模型实战教程
智谱开源多模态OCR模型GLM-OCR,基于GLM-V架构,融合CogViT视觉编码器与GLM-0.5B语言解码器,支持公式、表格、代码等复杂文档识别,性能达OmniDocBench榜首(94.62分),仅0.9B参数,轻量高效,开箱即用。
3875 3
|
9月前
|
存储 索引
如何使用「全量索引结合增量索引」方案?
采用“全量索引+增量索引”方案可高效处理大规模数据更新。系统周期生成不可变的全量索引,提升检索性能;实时新增数据则构建内存中的增量索引,支持快速写入。查询时合并两者结果,并通过删除列表标记已删数据,避免脏数据返回。结合Double Buffer机制,还可实现无锁访问,显著提升系统并发能力与检索效率。(238字)
|
9月前
|
存储 NoSQL 关系型数据库
什么是 Geohash 编码?
Geohash编码将经纬度转换为字符串,通过不断二分地球坐标区间,交叉合并经纬编码,再转为Base32简化表示。它用短字符串标识位置,支持高效空间索引与查询,广泛应用于Redis、MySQL等系统。
|
9月前
|
存储 算法 数据挖掘
如何使用乘积量化压缩向量?
乘积量化通过将高维向量划分为多个低维子空间,对每个子空间聚类并用聚类ID表示子向量,大幅压缩存储空间。例如,1024维向量可分段聚类,用32比特替代原始4KB空间,压缩率达1/1024,显著提升内存加载与检索效率。
|
9月前
|
算法 搜索推荐
如何使用概率模型中的 BM25 算法进行打分?
BM25是一种基于概率模型的文本相关性打分算法,可视为TF-IDF的升级版。它综合考虑词频(TF)、逆文档频率(IDF)、文档长度及查询词频,并引入非线性增长与饱和机制。通过参数k1、k2和b调节词频权重、文档长度影响和查询词权重,使评分更精准。广泛应用于Elasticsearch、Lucene等搜索引擎中。
|
9月前
|
算法 搜索推荐
经典的 TF-IDF 算法是什么?
TF-IDF是衡量词与文档相关性的经典算法,由词频(TF)和逆文档频率(IDF)相乘得出。TF反映词在文档中的重要性,IDF体现词的区分度。词频越高、文档频率越低的词,权重越大。通过累加各词项的TF-IDF值,可计算查询与文档的整体相关性,广泛应用于搜索引擎排序。
|
9月前
|
搜索推荐 数据库 索引
广告引擎的整体架构和工作过程
广告引擎核心是匹配用户与广告。通过用户标签、广告位信息及广告主定向条件,构建倒排索引,实现高效召回与排序,0.1秒内完成广告返回,并实时监测展现、点击与计费,确保精准投放与预算控制。
|
9月前
|
机器学习/深度学习 自然语言处理 搜索推荐
搜索引擎是如何进行查询纠错的?
当用户输入错误查询词时,搜索引擎通过查询纠错功能自动识别并修正错误。该过程分为三步:首先判断输入是否存在错误,利用字典或语言模型评估置信度;接着召回候选词,基于拼音、字形或编辑距离生成可能的正确词;最后对候选词打分排序,选出最优结果。结合查询推荐,搜索引擎能更好理解用户意图,提升检索效果。