CN116257519A - 一种数据读写的方法、装置、计算机设备及存储介质 - Google Patents
一种数据读写的方法、装置、计算机设备及存储介质 Download PDFInfo
- Publication number
- CN116257519A CN116257519A CN202211712145.5A CN202211712145A CN116257519A CN 116257519 A CN116257519 A CN 116257519A CN 202211712145 A CN202211712145 A CN 202211712145A CN 116257519 A CN116257519 A CN 116257519A
- Authority
- CN
- China
- Prior art keywords
- target data
- data
- index
- reading
- read
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/22—Indexing; Data structures therefor; Storage structures
- G06F16/2228—Indexing structures
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/23—Updating
- G06F16/2308—Concurrency control
- G06F16/2336—Pessimistic concurrency control approaches, e.g. locking or multiple versions without time stamps
- G06F16/2343—Locking methods, e.g. distributed locking or locking implementation details
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/20—Information retrieval; Database structures therefor; File system structures therefor of structured data, e.g. relational data
- G06F16/24—Querying
- G06F16/245—Query processing
- G06F16/2455—Query execution
- G06F16/24552—Database cache management
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/46—Multiprogramming arrangements
- G06F9/54—Interprogram communication
- G06F9/544—Buffers; Shared memory; Pipes
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Computational Linguistics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及数据管理领域,尤其涉及一种数据读写的方法、装置、计算机设备及存储介质,以解决数据读写的性能及效率问题。该方法包括:建立目标数据的索引,得到目标数据索引;在共享内存中,根据所述目标数据索引缓存目标数据的索引,得到数据索引缓存;对目标数据进行读操作时,通过读取数据索引缓存,得到数据索引缓存对应的目标数据,从而返回对目标数据的读操作结果。
Description
技术领域
本发明涉及数据管理领域,尤其涉及一种数据读写的方法、装置、计算机设备及存储介质。
背景技术
在对样本特征向量数据的处理中,通常将向量数据存储在数据库中,进而实现对向量数据的读写操作。为了加快向量数据的读写速度,往往会添加向量数据对应的数据索引,以加快向量数据的读写过程中查找目标向量数据的速度。而数据索引一般会缓存在数据库的内存中,即数据索引缓存。但随着时间的推移、样本数量的增加,在数据库中存储的向量数据就越来越多,相应的数据索引缓存也越来越多。
但数据库的内存是有限的,除了向量数据相关的数据表使用数据库的缓存外,还有系统表和其他数据表也同时使用数据库的内存,以缓存自身数据和数据索引。这导致了数据库的内存很快就被各种缓存占满,便需要从最早存入内存的缓存开始逐步对缓存进行依次删除。此时,向量数据的数据索引缓存就有可能被清理掉。
由于向量数据的数据索引缓存的增多,对数据库内存的占用越来越大,而同时数据索引缓存又经常因为其他数据表的占用内存过多而被清空,从而无法很好地通过操作数据索引缓存来加快操作向量数据的效率,同时也导致了缓存对数据库内存的大量占用,严重影响了数据库性能,降低了数据读写的效率。
发明内容
有鉴于此,本发明实施例提供了一种数据读写的方法、装置、计算机设备及存储介质,以提高数据读写的效率。
第一方面,本发明提供了一种数据读写的方法,所述数据读写的方法包括:
建立目标数据的索引,得到目标数据索引;
在共享内存中,根据所述目标数据索引缓存所述目标数据的索引,得到数据索引缓存;
接收到对所述目标数据的读操作指令时,通过读取所述数据索引缓存,得到所述数据索引缓存对应的目标数据,从而返回对所述目标数据的读操作结果。
在一种实现方式中,所述对所述目标数据进行读操作之前,所述方法还包括:
在接收到对所述目标数据进行写操作的指令时,对所述目标数据执行所述写操作;
依据所述写操作的指令,更新所述目标数据对应的所述目标数据索引;
依据所述写操作的指令,更新所述目标数据对应的所述数据索引缓存。
在另一种实现方式中,所述方法还包括:
建立所述读操作或写操作的读写进程;
在所述读写进程上,添加针对所述目标数据的进程锁,直至所述读操作或写操作完成后,删除所述进程锁。
在又一种实现方式中,所述对所述目标数据进行读操作或写操作时,所述方法还包括:
判断对所述读操作或写操作是否中断;
若中断,则回退所述写操作已经执行过的部分写操作。
在又一种实现方式中,所述回退所述写操作已经执行过的部分写操作之前,所述方法还包括:
在所述写操作的每一个执行步骤中,构建所述执行步骤对应的所述目标数据、所述目标数据索引和所述数据索引缓存的回退操作,分别得到每一个所述执行步骤的钩子函数;
将所述钩子函数分别挂载在所述执行步骤对应的执行器上;
所述回退所述写操作已经执行过的部分写操作,包括:
回退操作发生时,依据当前执行步骤对应的执行器,查找到对应的钩子函数,以完成回退操作。
在又一种实现方式中,在所述得到每一个所述执行步骤的钩子函数之后,所述方法还包括:
将所述读操作或写操作的预期执行状态,标记为不同的事务状态;
在所述钩子函数中,依据所述读操作或写操作的不同事务状态,分别对所述目标数据、所述目标数据索引和所述数据索引缓存进行操作。
在又一种实现方式中,所述依据所述读或写操作的不同事务状态,分别对所述目标数据、所述目标数据索引和所述数据索引缓存进行操作,包括:
当所述事务状态为中止或失败时,触发当前执行步骤对应的钩子函数;
依据所述事务状态,所述钩子函数将执行所述回退操作,以还原所述目标数据、所述目标数据索引和所述数据索引缓存。
第二方面,本发明提供了一种数据读写的装置,所述数据读写的装置包括:
建立索引模块,用于建立目标数据的索引,得到目标数据索引;
缓存索引模块,用于在共享内存中,根据所述目标数据索引缓存所述目标数据的索引,得到数据索引缓存;
读取数据模块,用于接收到对所述目标数据的读操作指令时,通过读取所述数据索引缓存,得到所述数据索引缓存对应的目标数据,从而返回对所述目标数据的读操作结果。
第三方面,本发明提供了一种计算机设备,所述计算机设备包括处理器、存储器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如第一方面所述数据读写的方法。
第四方面,本发明提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现如第一方面所述数据读写的方法。
上述数据读写的方法、装置、计算机设备及存储介质,通过在数据库中,建立目标数据的目标数据索引,并在共享内存中,根据目标数据索引缓存目标数据索引,得到数据索引缓存,使得目标数据索引无需与其他系统表和数据表共用数据库的缓存。将数据索引缓存与数据库内存分离,保存在共享内存中,从而有效防止了由于其他数据表的缓存占用数据库内存过多后,导致数据索引缓存被清空。由于保证了数据索引缓存的存在,从而有效地提升了数据读写的效率,另外,由于能直接通过数据索引来操作数据,也降低数据读写的操作时间。之后在接收到对目标数据的读操作指令时,只需要通过读取数据索引缓存,就能返回对目标数据的读操作结果,这有效地减少了读取目标数据的操作时间,提升了数据读取的效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动性的前提下,还可以根据这些附图获得其他的附图。
图1是本发明一实施例中数据读写的方法的一应用环境示意图;
图2是本发明一实施例中数据读写的方法的一交互示意图;
图3是本发明一实施例中数据读写的方法的一流程示意图;
图4是本发明一实施例中数据读写的装置的结构示意图;
图5是本发明一实施例提供的一种计算机设备的结构示意图。
具体实施方式
以下描述中,为了说明而不是为了限定,提出了诸如特定系统结构、技术之类的具体细节,以便透彻理解本发明实施例。然而,本领域的技术人员应当清楚,在没有这些具体细节的其它实施例中也可以实现本发明。在其它情况中,省略对众所周知的系统、装置、电路以及方法的详细说明,以免不必要的细节妨碍本发明的描述。
应当理解,当在本发明说明书和所附权利要求书中使用时,术语“包括”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
还应当理解,在本发明说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
如在本发明说明书和所附权利要求书中所使用的那样,术语“如果”可以依据上下文被解释为“当...时”或“一旦”或“响应于确定”或“响应于检测到”。类似地,短语“如果确定”或“如果检测到[所描述条件或事件]”可以依据上下文被解释为意指“一旦确定”或“响应于确定”或“一旦检测到[所描述条件或事件]”或“响应于检测到[所描述条件或事件]”。
另外,在本发明说明书和所附权利要求书的描述中,术语“第一”、“第二”、“第三”等仅用于区分描述,而不能理解为指示或暗示相对重要性。
在本发明说明书中描述的参考“一个实施例”或“一些实施例”等意味着在本发明的一个或多个实施例中包括结合该实施例描述的特定特征、结构或特点。由此,在本说明书中的不同之处出现的语句“在一个实施例中”、“在一些实施例中”、“在其他一些实施例中”、“在另外一些实施例中”等不是必然都参考相同的实施例,而是意味着“一个或多个但不是所有的实施例”,除非是以其他方式另外特别强调。术语“包括”、“包含”、“具有”及它们的变形都意味着“包括但不限于”,除非是以其他方式另外特别强调。
为了说明本发明的技术方案,下面通过具体实施例来进行说明。
本发明提供的一种数据读写的方法,可应用在如图1的应用环境中,其中,客户端与服务端进行通信。其中,客户端包括但不限于掌上电脑、桌上型计算机、笔记本电脑、超级移动个人计算机(ultra-mobile personal computer,UMPC)、上网本、云端终端设备、个人数字助理(personal digital assistant,PDA)等计算机设备。服务端可以是独立的服务器,也可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器。客户端可以应用于文章列表、图片管理等场景下,客户端向服务端发送数据读写操作指令,例如,在客户端需要展示文章列表场景下,可以按照所需要展示的文章类别和客户端每页显示文章的个数,向服务端发起数据读取请求,服务器接收到数据读取请求后,在共享内存中进行检索,以返回数据读取请求的结果,从而提升数据读写的效率。
参见图3,是本发明提供的一种数据读写的方法的流程示意图,上述数据读写的方法可以应用于图1中的服务端,如图3所示,该数据读写的方法可以包括以下步骤:
S10:建立目标数据的索引,得到目标数据索引。
在服务端得到目标数据后,在数据库中对目标数据进行创建、新增、修改、删除等操作,接着建立目标数据的索引,也就是目标数据索引。其中,目标数据包括但不仅限于向量数据、图像数据等。建立目标数据索引包括但不仅限于对目标数据的索引进行创建、删除、修改、新增等操作。而建立目标数据索引的方法包括但不仅限于采用机器学习的各类算法对近似最近邻数据进行搜索等方法。
具体地,本实施例中采用PostgreSQL(一个开源的关系数据库管理系统)数据库存储向量数据,服务端依据接收到的向量数据,也就是目标数据,在PostgreSQL中进行大规模高维向量的近似最近邻搜索(Approximate Nearest Neighbor Search,ANNS)。基于PostgreSQL的索引接口和存储架构,实现对应的ANNS算法,也就是目标数据索引。
例如,在本实施例中采用的PostgreSQL数据库,该数据库为了在多个客户端进程中共享目标数据索引,需要实现基于共享内存的数据索引缓存。通过Boost库(一个开源的C++工具库,其中,C++是一种计算机高级程序设计语言,由C语言扩展升级而产生)的interprocess模块来创建和管理共享内存,并在共享内存中维护对应向量索引的实例,其中,interprocess模块简化了常见进程间通信和同步机制的使用,并提供了广泛的通信和同步机制,另外还提供了更高级的进程间机制来动态分配共享内存或内存映射文件的部分(通常是分配固定大小的内存段的部分)。使用这些机制,interprocess模块提供了在共享内存和内存映射文件中构造C++对象(包括类似STL的容器,其中,STL全称为StandardTemplate Library,即标准模板库)的有用工具。
S20:在共享内存中,根据目标数据索引缓存目标数据的索引,得到数据索引缓存。
在得到目标数据索引后,在共享内存中缓存目标数据的索引,得到数据索引缓存。其中,共享内存指服务端中与数据库内存分离的内存,包括但不仅限于可以被不同中央处理器访问的大容量内存、允许两个或更多进程访问的同一块内存等。
具体地,将对目标数据索引的相关操作都替换为对共享内存的操作,也就是得到数据索引缓存。其中,相关操作包括对目标数据索引的创建、插入、删除、查询等。同时,给共享内存中的每一个数据索引缓存分配一个主键,也就是唯一标识符,该唯一标识符用于后续数据库进程对目标数据进行访问时,在共享数据中查找对应的数据索引缓存,并使用该数据索引缓存访问目标数据。
例如,PostgreSQL中提供的索引接口,主要是维护一个IndexAmRoutine实例,IndexAmRoutine实例中包含使用索引所需的所有内容,也称为访问方法的API实例,包含指定访问方法的各种固定属性字段。更重要的是,该实例包含指向访问方法的支持函数的指针,这些函数完成了访问索引的所有实际工作。这些支持函数是普通的C函数(一种通用的、面向过程式的计算机程序设计语言的函数),在SQL(结构化查询语言,全称为StructuredQuery Language)级别上不可见或不可调用。因此,该实例主要包含索引构建(ambuild)、索引插入(aminsert)、索引查询(amgettuple)、索引删除(ambulkdelete)等相关访问方法的接口。其中pg_anns_xxx为数据库中的ANNS算法,即目标数据索引,shm_anns_xxx为共享内存对应ANNS算法,也就是数据缓存索引。其中,xxx表示ANNS算法,由于本发明的技术方案包括但不仅限于某一种特定的ANNS算法,而是任意的ANNS算法都适用,因此xxx指任意一种ANNS算法。在各个PostgreSQL索引接口中,除了完成pg_anns_xxx中关于PostgreSQL自身存储架构相关的操作,还会完成shm_anns_xxx中关于共享内存索引的相关操作,从而保持共享内存与PostgreSQL数据库的同步。
S30:对目标数据进行读操作时,通过读取数据索引缓存,得到数据索引缓存对应的目标数据,从而返回对目标数据的读操作结果。
当服务端接收到对目标数据的读操作指令时,通过查找目标数据对应的数据索引缓存,通过数据索引缓存得到目标数据。
具体地,在需要查找目标数据时,通过步骤S20中给数据索引缓存分配的唯一标识符,也就是主键,来查找目标数据。
示例一,目标数据为数据表table,其对应的数据索引缓存的主键为tableId,则需要查找数据表table表时,只需查找其主键tableId,即可查询出目标数据,也就是通过数据索引缓存的主键tableId查询出数据表table。
示例二,如步骤S20中的示例,为了提高数据索引缓存的新增和查询速度,在需要对数据索引缓存进行写操作时才会同时执行pg_anns_xxx中关于PostgreSQL自身存储架构相关的操作和shm_anns_xxx中关于共享内存索引的相关操作,而对向量索引进行只读操作时,则仅使用shm_anns_xxx中关于共享内存索引的相关操作进行替换。不管是在ANNS算法的构建还是查询过程,只读操作都占据大部分IO开销和CPU开销,因此通过shm_anns_xxx中关于共享内存索引的相关操作替换pg_anns_xxx中关于PostgreSQL自身存储架构相关的操作,能大大较少IO操作和CPU消耗,从而提高向量索引的插入和查询速度。
示例三,基于共享内存的数据索引缓存,将索引创建、插入、删除和查询过程中对PostgreSQL索引页面(Page)的相关操作都替换为对共享内存的操作,并给共享内存中的每一个数据索引缓存实例分配一个唯一的标识符(比如,在执行Create Index(创建索引)语句时给定的索引名称),这个标识符用于PostgreSQL用户进程对数据索引缓存进行访问时在共享内存中查找对应的向量索引实例,并使用该向量索引进行访问,避免了使用PostgreSQL自身的存储架构访问向量索引,从而减少了对IO的操作,加快了搜索速度。
需要说明的是,通过在数据库中,建立目标数据的目标数据索引,并在共享内存中,根据目标数据索引缓存目标数据索引,得到数据索引缓存,使得目标数据索引无需与其他系统表和数据表共用数据库的缓存。将数据索引缓存与数据库内存分离,保存在共享内存中,从而有效防止了由于其他数据表的缓存占用数据库内存过多后,导致数据索引缓存被清空。由于保证了数据索引缓存的存在,从而有效地提升了数据读写的效率,另外,由于能直接通过数据索引来操作数据,也降低数据读写的操作时间。之后在接收到对目标数据的读操作指令时,只需要通过读取数据索引缓存,就能返回对目标数据的读操作结果,这有效地减少了读取目标数据的操作时间,提升了数据读取的效率。
在其中一实施例中,步骤S30之前,即对目标数据进行读操作之前,该数据读写的方法还包括如下步骤:
S41:在接收到对目标数据进行写操作的指令时,对目标数据执行写操作。
S42:依据写操作的指令,更新目标数据对应的目标数据索引。
S43:依据写操作的指令,更新目标数据对应的数据索引缓存。
在步骤S41-S43中,主要处理目标数据写入时,数据同步问题:首先,步骤S41将目标数据写入数据库,接着步骤S42依据该写操作指令更新对应的目标数据索引,最后步骤S43依据该写操作指令更新对应的数据索引缓存。
具体地,例如当前对目标数据table表进行写操作create(创建操作指令,即生成数据表的指令),则需要用create这一写操作指令在数据库中生成table表。接着,依据create这一写操作指令,也就是,在数据库中创建出对应table表的tableIndex索引。最后,依据create这一写操作指令,在共享内存中创建对应tableIndex索引的数据索引缓存tableCacheIndex。
例如,步骤S30中的示例,数据库的目标数据索引中pg_anns_xxx和共享内存的数据索引缓存中shm_anns_xxx都会实现对应的ANNS算法,pg_anns_xxx是PostgreSQL索引接口的实现,shm_anns_xxx是共享内存实现。在执行写入操作时,会对数据库与共享内存中的数据进行同步,该同步操作是在PostgreSQL各个索引接口完成关于自身存储结构相关的操作之后,接着调用对应的shm_anns_xxx接口,完成共享内存里面的操作,保证数据库索引与共享内存索引里面的内容一致。
需要说明的是,该实施例中,将写操作与读操作的方法进行相互独立,一方面保证了只有在读操作的时候才直接通过数据索引缓存查询出目标数据,另一方面保证了写操作时数据库与共享内存中的数据同步,防止由于数据库与共享内存中的数据不一致导致的异常。
在其中一实施例中,该数据读写的方法还包括如下步骤:
S51:建立读操作或写操作的读写进程。
S52:在读写进程上,添加针对目标数据的进程锁,直至读操作或写操作完成后,删除进程锁。
在步骤S51中,建立读操作或写操作的操作进程,也就是读写进程,该读写进程指一次读写操作的执行过程,包括但不仅限于在目标数据与客户端之间建立读取目标数据的读写进程、在目标数据与客户端之间建立写入目标数据的读写进程等。
在步骤S52中,在步骤S51的读写进程上加上一资源锁,该资源锁包括但不仅限于进程锁、线程锁、分布式锁等。本实施例中,优选进程锁对进程的访问量进行控制。该进程锁是为了控制同一服务器中多个进程访问同一共享资源时,保证被访问数据的一致性和原子性。直至整个进程结束后,进程锁会被删除。
具体地,本实施例中,共享内存中的数据索引缓存会被多个客户端连接访问,为了维护数据索引缓存的一致性,通过在共享内存中添加进程锁来维护数据索引缓存。例如,在执行PostgreSQL提供的索引接口时,会维护对应数据索引缓存的进程锁状态,该进程锁状态包括但不仅限于锁定状态、未锁定状态等。其中,锁定状态包括但不仅限于目标数据正在被更改、目标数据被占用等。从而通过进程锁保证多个用户能同时正常访问同一个数据索引缓存。
例如,本实施例中采用的PostgreSQL是多进程数据库,即守护进程会为每一个连接创建一个客户端进程,为了维护共享内存中数据索引缓存的原子性(Atomicity)和一致性(Consistency),保证多个用户进程能并发的访问共享内存中同一个向量索引,本实施例在实现基于共享内存的数据索引缓存时,为每一个数据索引缓存实现了必要的锁,并在数据索引缓存被访问过程中维护锁的状态。
需要说明的是,共享内存中的数据索引缓存将会被多个客户端连接访问,为了维护数据索引缓存的原子性和一致性,因此本实施例中通过在共享内存中维护对应数据索引缓存的进程锁来实现对数据索引缓存的维护,以保证多个用户都能够正常连接访问共享内存中的数据索引缓存。
在其中一实施例中,步骤S30与步骤S41中,即对目标数据进行读操作或写操作时,具体还包括如下步骤:
S31:判断对读操作或写操作是否中断。
S32:若中断,则回退写操作已经执行过的部分写操作。
在对目标数据进行读操作或写操作时,始终监听读操作或写操作是否被中断,读操作或写操作被中断,则回退写操作已经执行过的部分写操作。
例如,在数据表face表中新增一条数据,此时新增操作为写操作,但是在新增过程中,执行了取消新增操作,数据库标准操作将针对目标数据已经进行的新增操作和目标数据索引已经进行的新增操作进行回退,另外,本实施例也会使用自定义函数对共享内存中数据索引缓存已经执行过的新增操作进行回退。
需要说明的是,如果不做该实施例中的数据读写中断判断,会导致目标数据与目标数据索引在数据中断后,由于数据库标准操作,因此只会自动对这两项数据进行回退。但共享内存中的数据索引缓存却没有被回退,这将造成数据库与共享内存的数据不一致,影响后续的读操作或写操作。
在其中一实施例中,步骤32之前,即回退写操作已经执行过的部分写操作之前,该数据读写的方法还包括如下步骤:
S61:在写操作的每一个执行步骤中,构建执行步骤对应的目标数据、目标数据索引和数据索引缓存的回退操作,分别得到每一个执行步骤的钩子函数。
S62:将钩子函数分别挂载在执行步骤对应的执行器上。
S63:回退写操作已经执行过的部分写操作,包括:回退操作发生时,依据当前执行步骤对应的执行器,查找到对应的钩子函数,以完成回退操作。
步骤S61中,写操作的每一个执行步骤对应一个执行器,依照每一个执行步骤,构建每一个执行步骤对应的目标数据、目标数据索引和数据索引缓存的回退操作,得到每一个执行步骤的钩子函数。
在步骤S62-S62中,将步骤S61中的钩子函数挂载在相应的执行器上,以保证执行某一个步骤时,触发了回退操作,则可以执行当前步骤执行器上挂载的钩子函数,以完成数据回退操作。
具体地,在本实施例中PostgreSQL执行器运行的每个阶段,会对共享内存进行相应处理。PostgreSQL中提供了执行器的钩子函数(hook function),让用户可以通过钩子函数自定义执行步骤的每一个过程。在步骤S61中,在每个执行步骤的钩子函数中定义每个执行步骤的回退函数,该回退函数包括但不仅限于目标数据的回退、目标数据索引的回退和数据索引缓存的回退。在某个读操作或写操作开始时,即在每个执行器上注册对应的钩子函数,当在某个执行器上触发了中断操作时,执行对应的钩子函数,以执行钩子函数中相应的回退操作。
例如,将shm_index_ExecutorStart_hook、shm_index_ExecutorRun_hook、shm_index_ExecutorFinish_hook、shm_index_ExecutorEnd_hook设定为自定义的钩子函数,在执行步骤开始时,将这四个钩子函数赋值给ExecutorStart_hook、ExecutorRun_hook、ExecutorFinish_hook、ExecutorEnd_hook这四个变量,即完成钩子函数的注册,这四个变量即是PostgreSQL内核提供给用户关于执行器的钩子接口。在自定义的四个钩子函数中,必须要调用PostgreSQL中执行器的标准操作函数。自定义钩子函数挂载在执行步骤的函数ExecutorStart、ExecutorRun、ExecutorFinish、ExecutorEnd中,通过在标准操作函数前后增加自定义操作,从而完成用户自定义的功能。本实施例中,通过在四个自定义的钩子函数中,添加对共享内存中的向量索引的相关操作,完成各个事务状态下,对共享内存中的向量索引的处理,即可保持向量索引在共享内存中和索引文件中的一致性。
需要说明的是,利用自定义的钩子函数,并将钩子函数挂载在对应的执行器上,能很容易确认当前中断指令发生时,已经完成的执行步骤。接着依据已经完成的执行步骤,对目标数据、目标数据索引和数据索引缓存进行数据回滚,保证三者的数据同步和数据一致性,防止后续操作中由于数据不同步导致的错误。
在其中一实施例中,步骤S61之后,即得到每一个执行步骤的钩子函数之后,该数据读写的方法还包括如下步骤:
S71:将读操作或写操作的预期执行状态,标记为不同的事务状态。
S72:在钩子函数中,依据读操作或写操作的不同事务状态,分别对目标数5据、目标数据索引和数据索引缓存进行操作。
在步骤S71中,将读操作或写操作的预期执行状态,标记为不同的事务状态。该事务状态指数据并发控制的状态,包括但不仅限于空闲状态、启动状态、回滚状态、提交状态、准备状态、进行状态等。
在步骤S72中,依据不同的事务状态,对目标数据、目标数据索引和数据0索引缓存进行操作。
例如,在PostgreSQL执行完相应的SQL语句之后,PostgreSQL内部会存在多种事务状态。依据不同的事务状态,PostgreSQL会执行不同的操作。在PostgreSQL的执行器标准操作函数中包含这部分操作。而在自定义的钩子函数
中,依据事务状态,PostgreSQL除了执行标准操作完成PostgreSQL相关功能之5外,还会执行对应的自定义操作,以完成对目标数据、目标数据索引和数据索
引缓存进行的操作。
需要说明的是,采用不同的事务状态标记当前的数据的执行状态,能快速有效地响应数据终端的操作,有利于后续在钩子函数的定义中,依据事务状态
对进行不同的数据操作,让整个读或写操作的执行步骤能按照自定义函数的定0义来执行。
在其中一实施例中,步骤S72中,即依据读或写操作的不同事务状态,分别对目标数据、目标数据索引和数据索引缓存进行操作中,
具体还包括如下步骤:
S721:当事务状态为中止或失败时,触发当前执行步骤对应的钩子函数。5S722:依据事务状态,钩子函数将执行回退操作,以还原目标数据、目标数据索引和数据索引缓存。
步骤S721-S722中,当前执行步骤,也就是执行器获取当前的事务状态,若事务状态为中止或失败,则触发执行器对应的钩子函数。该钩子函数将依据
当前事务状态对目标数据、目标数据索引和数据索引缓存进行自定义操作,也0就是回退操作。
示例一,在数据表face表中新增一条数据,但是在新增过程中,执行了取消插入的操作(比如,在PostgreSQL的交互式终端下面执行ctrl+c操作,即取消操作),这时PostgreSQL中这次事务的状态为TRANS_ABORT(事务中止),标准操作会针对这个状态对PostgreSQL索引里面的数据执行回退,而钩子函数里面的自定义部分同样会根据这个状态,对共享内存中的数据进行处理,将目标数据、目标数据索引和数据索引缓存回退到新增操作之前的状态。
示例二,PostgreSQL中执行器(Executor)为了保证数据索引缓存在SQL语句执行失败时,在共享内存中和索引文件中保持一致,需要在PostgreSQL执行器运行过程的各个阶段,对共享内存进行相应的处理。PostgreSQL中提供了执行器的钩子函数(hookfunction),给予用户自定义执行器各个阶段的执行过程的权利。通过在扩展初始化时,注册对应的钩子函数,即可完成对执行过程的自定义。注册自定义的用于处理共享内存中向量索引的执行器钩子函数之前和之后。
需要说明的是,采用不同的事务状态标记当前的数据的执行状态,能快速有效地响应数据终端的操作,即,在数据中断时,立即将事务状态变更失败或回滚。有利于和后续对相关数据进行回滚,也方便后续操作中获取当前需要响应的事务状态。
应理解,上述实施例中各步骤的序号的大小并不意味着执行顺序的先后,各过程的执行顺序应以其功能和内在逻辑确定,而不应对本发明实施例的实施过程构成任何限定。
对应于上文实施例的数据读写的方法,图4示出了本发明提供的一数据读写的装置的结构框图,上述数据读写的装置应用于服务端,服务端对应的计算机设备连接客户端,以获取对目标数据的读或写操作指令。为了便于说明,仅示出了与本发明实施例相关的部分。
参见图4,该数据读写的装置包括:
建立索引模块,用于建立目标数据的索引,得到目标数据索引;
缓存索引模块,用于在共享内存中,根据所述目标数据索引缓存所述目标数据的索引,得到数据索引缓存;
读取数据模块,用于接收到对所述目标数据的读操作指令时,通过读取所述数据索引缓存,得到所述数据索引缓存对应的目标数据,从而返回对所述目标数据的读操作结果。
在其中一实施例中,所述对所述目标数据进行读操作之前,该数据读取的装置还包括:
数据写入模块,用于在接受到对所述目标数据进行写操作的指令时,对所述目标数据执行所述写操作;
索引写入模块,用于依据所述写操作的指令,更新所述目标数据对应的所述目标数据索引;
缓存写入模块,用于依据所述写操作的指令,更新所述目标数据对应的所述数据索引缓存。
在其中一实施例中,该数据读取的装置还包括:
建立进程模块,用于建立所述读操作或写操作的读写进程;
添加锁模块,用于在所述读写进程上,添加针对所述目标数据的进程锁,直至所述读操作或写操作完成后,删除所述进程锁。
在其中一实施例中,所述对所述目标数据进行读或操作写操作时,该数据读取的装置还包括:
判断终端单元,用于判断对所述读操作或写操作是否中断;
回退操作单元,用于若中断,则回退所述写操作已经执行过的部分写操作。
在其中一实施例中,所述回退所述写操作已经执行过的部分写操作之前,该数据读写的装置还包括:
构建钩子模块,用于在所述写操作的每一个执行步骤中,构建所述执行步骤对应的所述目标数据、所述目标数据索引和所述数据索引缓存的回退操作,分别得到每一个所述执行步骤的钩子函数;
挂载钩子模块,用于将所述钩子函数分别挂载在所述执行步骤对应的执行器上;
所述回退所述写操作已经执行过的部分写操作,包括:
回退操作发生时,依据当前执行步骤对应的执行器,查找到对应的钩子函数,以完成回退操作。
在其中一实施例中,所述得到每一个所述执行步骤的钩子函数之后,该数据读取的装置还包括:
标记事务模块,用于将所述读操作或写操作的预期执行状态,标记为不同的事务状态;
操作数据模块,用于在所述钩子函数中,依据所述读操作或写操作的不同事务状态,分别对所述目标数据、所述目标数据索引和所述数据索引缓存进行操作。
在其中一实施例中,所述依据所述读或写操作的不同事务状态,分别对所述目标数据、所述目标数据索引和所述数据索引缓存进行操作,包括:
触发钩子单元,用于当所述事务状态为中止或失败时,触发当前执行步骤对应的钩子函数;
回退数据单元,用于依据所述事务状态,所述钩子函数将执行所述回退操作,以还原所述目标数据、所述目标数据索引和所述数据索引缓存。
需要说明的是,上述模块、单元、子单元之间的信息交互、执行过程等内容,由于与本发明方法实施例基于同一构思,其具体功能及带来的技术效果,具体可参见方法实施例部分,此处不再赘述。
图5为本发明提供的一种计算机设备的结构示意图。如图5所示,该实施例的计算机设备包括:至少一个处理器(图5中仅示出一个)、存储器以及存储在存储器中并可在至少一个处理器上运行的计算机程序,处理器执行计算机程序时实现以下步骤:
建立目标数据的索引,得到目标数据索引;
在共享内存中,根据所述目标数据索引缓存所述目标数据的索引,得到数据索引缓存;
对所述目标数据进行读操作时,通过读取所述数据索引缓存,得到所述数据索引缓存对应的目标数据,从而返回对所述目标数据的读操作结果。
该计算机设备可包括,但不仅限于,处理器、存储器。本领域技术人员可以理解,图5仅仅是计算机设备的举例,并不构成对计算机设备的限定,计算机设备可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,例如还可以包括网络接口、显示屏和输入装置等。
所称处理器可以是CPU,该处理器还可以是其他通用处理器、数字信号处理器(Digital Signal Processor,DSP)、专用集成电路(Application Specific IntegratedCircuit,ASIC)、现成可编程门阵列(Field-Programmable Gate Array,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
存储器包括可读存储介质、内存储器等,其中,内存储器可以是计算机设备的内存,内存储器为可读存储介质中的操作系统和计算机可读指令的运行提5供环境。可读存储介质可以是计算机设备的硬盘,在另一些实施例中也可以是
计算机设备的外部存储设备,例如,计算机设备上配备的插接式硬盘、智能存储卡(Smart Media Card,SMC)、安全数字(Secure Digital,SD)卡、闪存卡(Flash Card)等。进一步地,存储器还可以既包括计算机设备的内部存储单元
也包括外部存储设备。存储器用于存储操作系统、应用程序、引导装载程序0(BootLoader)、数据以及其他程序等,该其他程序如计算机程序的程序代码等。存储器还可以用于暂时地存储已经输出或者将要输出的数据。
在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,计算机程序被处理器执行时实现以下步骤:
建立目标数据的索引,得到目标数据索引;
5在共享内存中,根据所述目标数据索引缓存所述目标数据的索引,得到数据索引缓存;
对所述目标数据进行读操作时,通过读取所述数据索引缓存,得到所述数据索引缓存对应的目标数据,从而返回对所述目标数据的读操作结果。
所属领域的技术人员可以清楚地了解到,为了描述的方便和简洁,仅以上0述各功能单元、模块的划分进行举例说明,实际应用中,可以根据需要而将上
述功能分配由不同的功能单元、模块完成,即将装置的内部结构划分成不同的功能单元或模块,以完成以上描述的全部或者部分功能。实施例中的各功能单元、模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可
以两个或两个以上单元集成在一个单元中,上述集成的单元既可以采用硬件的5形式实现,也可以采用软件功能单元的形式实现。另外,各功能单元、模块的具体名称也只是为了便于相互区分,并不用于限制本发明的保护范围。上述装置中单元、模块的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。集成的单元如果以软件功能单元的形式实现并作为独立的产品销
售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本0发明实现上述实施例方法中的全部或部分流程,可以通过计算机程序来指令相关的硬件来完成,计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述方法实施例的步骤。其中,计算机程序包括计算机程序代码,计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。计算机可读介质至少可以包括:能够携带计算机程序代码的任何实体或装置、记录介质、计算机存储器、只读存储器(Read-Only Memory,ROM)、随机存取存储器(Random Access Memory,RAM)、电载波信号、电信信号以及软件分发介质。例如U盘、移动硬盘、磁碟或者光盘等。在某些司法管辖区,根据立法和专利实践,计算机可读介质不可以是电载波信号和电信信号。
本发明实现上述实施例方法中的全部或部分流程,也可以通过一种计算机程序产品来完成,当计算机程序产品在计算机设备上运行时,使得计算机设备执行时实现可实现上述方法实施例中的步骤。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述或记载的部分,可以参见其它实施例的相关描述。
本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
在本发明所提供的实施例中,应该理解到,所揭露的装置/计算机设备和方法,可以通过其它的方式实现。例如,以上所描述的装置/计算机设备实施例仅仅是示意性的,例如,模块或单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通讯连接可以是通过一些接口,装置或单元的间接耦合或通讯连接,可以是电性,机械或其它的形式。
作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围,均应包含在本发明的保护范围之内。
Claims (10)
1.一种数据读写的方法,其特征在于,所述方法包括:
建立目标数据的索引,得到目标数据索引;
在共享内存中,根据所述目标数据索引缓存所述目标数据的索引,得到数据索引缓存;
对所述目标数据进行读操作时,通过读取所述数据索引缓存,得到所述数据索引缓存对应的目标数据,从而返回对所述目标数据的读操作结果。
2.根据权利要求1所述数据读写的方法,其特征在于,所述对所述目标数据进行读操作之前,所述方法还包括:
在接收到对所述目标数据进行写操作的指令时,对所述目标数据执行所述写操作;
依据所述写操作的指令,更新所述目标数据对应的所述目标数据索引;
依据所述写操作的指令,更新所述目标数据对应的所述数据索引缓存。
3.根据权利要求2所述数据读写的方法,其特征在于,还包括:
建立所述读操作或写操作的读写进程;
在所述读写进程上,添加针对所述目标数据的进程锁,直至所述读操作或写操作完成后,删除所述进程锁。
4.根据权利要求2所述数据读写的方法,其特征在于,所述对所述目标数据进行读操作或写操作时,所述方法还包括:
判断对所述读操作或写操作是否中断;
若中断,则回退所述写操作已经执行过的部分写操作。
5.根据权利要求2所述数据读写的方法,其特征在于,所述回退所述写操作已经执行过的部分写操作之前,所述方法还包括:
在所述写操作的每一个执行步骤中,构建所述执行步骤对应的所述目标数据、所述目标数据索引和所述数据索引缓存的回退操作,分别得到每一个所述执行步骤的钩子函数;
将所述钩子函数分别挂载在所述执行步骤对应的执行器上;
所述回退所述写操作已经执行过的部分写操作,包括:
回退操作发生时,依据当前执行步骤对应的执行器,查找到对应的钩子函数,以完成回退操作。
6.根据权利要求5所述数据读取的方法,其特征在于,在所述得到每一个所述执行步骤的钩子函数之后,所述方法还包括:
将所述读操作或写操作的预期执行状态,标记为不同的事务状态;
在所述钩子函数中,依据所述读操作或写操作的不同事务状态,分别对所述目标数据、所述目标数据索引和所述数据索引缓存进行操作。
7.根据权利要求6所述数据读取的方法,其特征在于,所述依据所述读或写操作的不同事务状态,分别对所述目标数据、所述目标数据索引和所述数据索引缓存进行操作,包括:
当所述事务状态为中止或失败时,触发当前执行步骤对应的钩子函数;
依据所述事务状态,所述钩子函数将执行所述回退操作,以还原所述目标数据、所述目标数据索引和所述数据索引缓存。
8.一种数据读写的装置,其特征在于,所述装置包括:
建立索引模块,用于建立目标数据的索引,得到目标数据索引;
缓存索引模块,用于在共享内存中,根据所述目标数据索引缓存所述目标数据的索引,得到数据索引缓存;
读取数据模块,用于接收到对所述目标数据的读操作指令时,通过读取所述数据索引缓存,得到所述数据索引缓存对应的目标数据,从而返回对所述目标数据的读操作结果。
9.一种计算机设备,其特征在于,所述计算机设备包括处理器、存储器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时实现如权利要求1至7任一项所述数据读写的方法。
10.一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7任一项所述数据读写的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211712145.5A CN116257519A (zh) | 2022-12-29 | 2022-12-29 | 一种数据读写的方法、装置、计算机设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211712145.5A CN116257519A (zh) | 2022-12-29 | 2022-12-29 | 一种数据读写的方法、装置、计算机设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN116257519A true CN116257519A (zh) | 2023-06-13 |
Family
ID=86683526
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211712145.5A Pending CN116257519A (zh) | 2022-12-29 | 2022-12-29 | 一种数据读写的方法、装置、计算机设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN116257519A (zh) |
-
2022
- 2022-12-29 CN CN202211712145.5A patent/CN116257519A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US11080260B2 (en) | Concurrent reads and inserts into a data structure without latching or waiting by readers | |
US7376674B2 (en) | Storage of multiple pre-modification short duration copies of database information in short term memory | |
EP3170106B1 (en) | High throughput data modifications using blind update operations | |
US7490214B2 (en) | Relocating data from a source page to a target page by marking transaction table entries valid or invalid based on mappings to virtual pages in kernel virtual memory address space | |
US8825959B1 (en) | Method and apparatus for using data access time prediction for improving data buffering policies | |
CN109690522B (zh) | 一种基于b+树索引的数据更新方法、装置及存储装置 | |
US5819306A (en) | Shadow mechanism for a modifiable object oriented system | |
US5692187A (en) | Shadow mechanism having masterblocks for a modifiable object oriented system | |
CN111090663A (zh) | 事务并发控制方法、装置、终端设备及介质 | |
US20230401241A1 (en) | System for lightweight objects | |
US11775527B2 (en) | Storing derived summaries on persistent memory of a storage device | |
US8918370B2 (en) | Dynamic allocation of program libraries | |
US10642745B2 (en) | Key invalidation in cache systems | |
US7908268B2 (en) | Predictive database pool preparation | |
CN110832473B (zh) | 日志结构管理系统及方法 | |
US9009731B2 (en) | Conversion of lightweight object to a heavyweight object | |
CN116257519A (zh) | 一种数据读写的方法、装置、计算机设备及存储介质 | |
US11940994B2 (en) | Mechanisms for maintaining chains without locks | |
US11681664B2 (en) | Journal parsing for object event generation | |
US20220417325A1 (en) | System and method for content management with intelligent data store access across distributed stores | |
US8688662B2 (en) | Copy on access to locked objects | |
CN114860723A (zh) | 数据库的共享内存缓冲池处理方法、存储介质与设备 | |
CN114791913A (zh) | 数据库的共享内存缓冲池处理方法、存储介质与设备 | |
JPH0474232A (ja) | タスク実行方法及びキャッシュ装置の割り当て方法 | |
JPS6036618B2 (ja) | 情報処理システム |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |