CN112783894B - 基于碰撞的带老化删除的双层无锁哈希表实现方法 - Google Patents
基于碰撞的带老化删除的双层无锁哈希表实现方法 Download PDFInfo
- Publication number
- CN112783894B CN112783894B CN202110032390.0A CN202110032390A CN112783894B CN 112783894 B CN112783894 B CN 112783894B CN 202110032390 A CN202110032390 A CN 202110032390A CN 112783894 B CN112783894 B CN 112783894B
- Authority
- CN
- China
- Prior art keywords
- layer
- linked list
- hash table
- hash
- list
- 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.)
- Active
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
- G06F16/2255—Hash tables
-
- 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/2282—Tablespace storage structures; Management thereof
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9014—Indexing; Data structures therefor; Storage structures hash tables
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F16/00—Information retrieval; Database structures therefor; File system structures therefor
- G06F16/90—Details of database functions independent of the retrieved data types
- G06F16/901—Indexing; Data structures therefor; Storage structures
- G06F16/9024—Graphs; Linked lists
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Databases & Information Systems (AREA)
- Software Systems (AREA)
- Data Mining & Analysis (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
Abstract
本发明涉及数据处理技术领域,具体涉及一种基于碰撞的带老化删除的双层无锁哈希表实现方法。该基于碰撞的带老化删除的双层无锁哈希表实现方法包括以下步骤:S1:设置双层哈希表;S2:进行无锁操作;S3:进行跳跃表+双向链表的运行方式;S4:在步骤S3的基础上,执行FIFO控制;提供一种基于碰撞的带老化删除的双层无锁哈希表实现方法。
Description
技术领域
本发明涉及数据处理技术领域,具体涉及一种基于碰撞的带老化删除的双层无锁哈希表实现方法。
背景技术
通用哈希表的结构大多数是这样的按给定的元素个数创建哈希表;选取哈希算法,候选算法有crc md5 murmur..等等;将输入的key和keysize安装候选算法进行哈希计算,得出一个值,然后这个值于给定的总元素个数进行计算得出索引值;跳到哈希表所在的索引入口,进行增删改查操作;对于索引值相同但内容不同的元素情况称为碰撞,对于该情况进行开链表操作,添加元素到链表尾部。
上述方法无法避免因为碰撞产生的链表层数过深问题,而该问题本质上是哈希算法离散率太低而导致,如果采用重型算法如md5可以避免离散率低的问题,但是该算法会加重系统算力负担,因而拖累整个业务逻辑的性能。因此业界会流传有根据项目不同而采用不同哈希算法一说,在实际使用中哈希算法的选择堪称“玄学”。
通用的哈希表,比如stl的map或者glib的hashmap,都没有包含并发的设计思路,或者说只实现了根据key查找value的操作,将除此之外的操作留给开发者自行实现,比如stl的map,其本质实现是数据结构中的红黑树,这种结构可以实现数据的快速录入和查找,适用于大部分应用场景,然而,对于红黑树,在插入/查询/删除时会对其树上的节点进行大量平衡操作,不适合并发场景,因此在使用stl的map时,不同场景的项目无一例外都采用了在操作map时进行加锁操作,确保操作map期间不受打扰。
但是在并发场景下,当多个cpu同时在操作一个map时,如果使用stl map方案,效率的瓶颈就存在于加锁操作,此时多核cpu的处理效率等同于单个cpu,严重浪费算力资源。
对于通用的哈希表,创建/销毁/插入/删除/查询的方法是必须要实现的,但是对于单位元素的老化删除,都会留给调用者自己实现,这是因为通用哈希表不了解当前使用的场景,元素的老化在不同的平台下会有不同的实现方法,比如可以使用硬件/软件定时器进行老化删除;可以采用轮询遍历的方式进行老化删除。但是上述两种老化删除方法都会有缺点采用定时器进行老化删除的缺点:使用专有硬件定时器或者第三方软件定时器进行老化删除都会使用额外的内存资源,准确的说是至少一倍数量的内存资源。也就是说,哈希表中插入了多少个元素,就要创建多少个元素的定时器资源,通用定时器资源单位元素大多是128字节左右。这在海量数据操作中无疑会增加内存占用。而且维护定时器资源也会消耗不小的系统开销。轮询遍历的方式显而易见会有比较大的性能问题,这个在并发场景下尤其如此。
在并发场景下的无锁操作,删除元素都会面临ABA问题ABA问题的根本在于cas在修改变量的时候,无法记录变量的状态,比如修改的次数,否修改过这个变量。这样就很容易在一个线程将A修改成B时,另一个线程又会把B修改成A,造成casd多次执行的问题。而ABA问题通常在删除时刻更容易涌现。
传统的做法是实现一个垃圾回收机制,用freelist来进行最终删除,这个做法在并发场景下没有逻辑问题,却有效率问题,尤其在资源受限的硬件系统中,建立一个垃圾回收机制的哈希表,其垃圾回收的代码量和复杂性会大大超过其哈希表本身。
发明内容
本发明要解决的技术问题是:克服现有技术的不足,提供一种基于碰撞的带老化删除的双层无锁哈希表实现方法。
本发明为解决其技术问题所采用的技术方案为:基于碰撞的带老化删除的双层无锁哈希表实现方法,包括以下步骤:
S1:设置双层哈希表;双层哈希算法,提高元素离散率,平衡各个哈希桶的层数;
S2:进行无锁操作;哈希桶的节点数据结构放弃通用的链表或数组,使用16层的跳跃表实现对跳表的关键元素使用原子操作而实现了无锁(lockless)运行;
S3:进行跳跃表+双向链表的运行方式;老化超时删除不通过额外的定时器机制或者轮询机制,而是通过特殊方法+时间轮在哈希表插入或者查询时刻判断老化并删除;
S4:在步骤S3的基础上,执行FIFO控制;删除机制,放弃代价高昂的GC机制使用原子操作+延时删除来规避ABA或者死锁问题。
S1的具体步骤包括设置两个不同的哈希函数,分配双层哈希表,针对相同key进行计算,分别得出两个不同的索引值,其中一个索引值定位第一层表位置,第二个索引值定位第二层表位置;如此设置,将加大离散率,能够使数据在哈希表中分布更为均匀;双层哈希方法比单层哈希方法更离散,可以使哈希表中的元素分布的更均衡,这意味着面对相同的数据,尤其是并发场景,双层哈希可以更快地进行查找和插入操作。
S2的具体步骤包括:哈希表入口的数据结构以跳跃表作为基本数据结构,在跳跃表的基础上加大节点层数,形成多级链表;
本发明设置跳跃表的基础是链表,在此基础上加大了节点层数,形成多级链表,用于快速查找,其查找效率可以媲美二叉树。参见图2可知,跳跃表实际上就是多级的链表,其最底层Lev0就是全部的数据,以链表的方式存储,但其存储方式是有序存储(图中是升序排列),在此基础上每一层都是链表,指向的元素以跳跃的方式进行,但都是以有序链表的方式存在。其特点为:
实现简单,就是多层链表的实现;
可以实现无锁设计(lockless),只在操作插入或删除时操作CAS即可。
执行效率高,跳跃表的查找次数近似于层数,时间复杂度为O(logn),插入、删除也为O(logn)。
因为无锁设计,可以达到尽量降低系统开销,将重点放到业务逻辑的目的。
步骤S3中将哈希表入口更改为跳跃表+双向链表的运行方式,每当插入/查询/删除时,同时操作两个数据结构,需要做如下更改:
双向链表的key按照时间戳进行升序排列,也就是说,每当插入某个元素或者查找到某个元素,将该元素置顶到该表头;最终的效果是最活跃的元素在表头,最不活跃的元素在链表尾,用于正向或反向遍历超时标记;
跳跃表的key按照第三套哈希算法计算,进行排序并存储,用于快速查询。
更改完毕后,跳跃表的表头按分层进行查询/插入/删除/修改,双向链表表尾指向的内容就是按时间排序的最不活跃的元素内容,简言之,跳跃表头代表着快速跳表,链表表尾代表着可遍历的超时链表,都指向同一个入口下内容。
所述步骤S4具体操作如下:当元素删除时,先将元素的key从上述两个数据结构中摘除,然后将其放入该入口的freelist中,freelist以FIFO(先进先出)的方式实现,每压进一个元素,就把头元素进行删除。这样做实际上是实现了一个最简易版的GC(垃圾回收)。
与现有技术相比,本发明具有以下有益效果:
1、数据离散率效果好;
2、并发控制理想;
3、在高效查询/插入/删除操作时可同时进行排序,老化标记,延时删除;
4、资源占用少,可不使用任何第三方库和设备。
附图说明
图1是本发明步骤S1的哈希表结构示意图。
图2是本发明步骤S2中跳跃表与链表的区别示意图。
图3是本发明步骤S3中表结构示意图。
图4是本发明步骤S4后表结构示意图。
具体实施方式
下面结合附图对本发明实施例做进一步描述:
实施例
如图1至图4所示,包括以下步骤:
S1:设置双层哈希表;S1的具体步骤包括设置两个不同的哈希函数,分配双层哈希表,针对相同key进行计算,分别得出两个不同的索引值,其中一个索引值定位第一层表位置,第二个索引值定位第二层表位置;如此设置,将加大离散率,能够使数据在哈希表中分布更为均匀,两个表的结构如图1所示;参考图1可知,双层哈希方法比单层哈希方法更离散,可以使哈希表中的元素分布的更均衡,这意味着面对相同的数据,尤其是并发场景,双层哈希可以更快地进行查找和插入操作。
S2:进行无锁操作;S2的具体步骤包括:哈希表入口的数据结构以跳跃表作为基本数据结构,在跳跃表的基础上加大节点层数,形成多级链表;
并发场景下要避免进行锁操作,这是业界的共识,然而,实现无锁的方式和数据结构很多,比如说无锁二叉树等等,本文只探讨哈希表的无锁设计。从图1可知,每一个Entry代表的是哈希表(桶)的入口,当数据插入时,通过索引定位到某个Entry入口,接下来的入口操作实际上决定了哈希表的执行效率和性能。现有入口有以下实现方式:
入口处不做任何操作就进行存储value,这种做法只适用于某些特殊场景,这种场景下数据的索引计算从理论上就不会有冲突,比如端口哈希表的实现,这种实现方法本质上将哈希表退化为数组使用,不适合所有场景。
入口处是链表的首地址,也称之为开链,当输入插入时,其实就是将数据添加到该链表的尾部,查询/删除时从链表头部依次查找定位,为了便于并发操作,在操作该链表时同时对其进行加锁操作。这种做法的好处是实现简单,由于加锁操作只存在于操作该Entry的链表部分,不会对其他Entry造成影响,因此,稀释了锁定的执行时间,更加细化了锁的颗粒度,可以适用大部分并发场景。缺点在于,链表的特性决定了其查询效率不会高,尤其是在链表层数越来越沉的情况的下,无法精确计算最坏执行时间,尽管加上了细颗粒度的锁,但是这也决定了业务逻辑必须在锁内执行,这也破坏了哈希表和外部调用者之间的低耦合高内聚的软件工程理念。
入口处是数组首地址,加锁方法于链表一致,这种方法与链表的执行效率是一样的,缺点也类似。
针对上述问题,对于入口的数据结构选择要达到以下几点要求:
设计的结构要简单,实现起来不复杂;
无锁设计;
执行效率要高效,插入/查询/删除操作的性能要均衡;
可重入执行,不影响调用者业务逻辑。
本发明设置跳跃表的基础是链表,在此基础上加大了节点层数,形成多级链表,用于快速查找,其查找效率可以媲美二叉树。参见图2可知,跳跃表实际上就是多级的链表,其最底层Lev0就是全部的数据,以链表的方式存储,但其存储方式是有序存储(图中是升序排列),在此基础上每一层都是链表,指向的元素以跳跃的方式进行,但都是以有序链表的方式存在。其特点为:
实现简单,就是多层链表的实现;
可以实现无锁设计(lockless),只在操作插入或删除时操作CAS即可;
执行效率高,跳跃表的查找次数近似于层数,时间复杂度为O(logn),插入、删除也为O(logn);
因为无锁设计,可以达到尽量降低系统开销,将重点放到业务逻辑的目的。
S3:进行跳跃表+双向链表的运行方式;步骤S3中将哈希表入口更改为跳跃表+双向链表的运行方式,每当插入/查询/删除时,同时操作两个数据结构,需要做如下更改:
双向链表的key按照时间戳进行升序排列,也就是说,每当插入某个元素或者查找到某个元素,将该元素置顶到该表头;最终的效果是最活跃的元素在表头,最不活跃的元素在链表尾,用于正向或反向遍历超时标记;
跳跃表的key按照第三套哈希算法计算,进行排序并存储,用于快速查询。
如图3所示,更改完毕后,跳跃表的表头按分层进行查询/插入/删除/修改,双向链表表尾指向的内容就是按时间排序的最不活跃的元素内容,简言之,跳跃表头代表着快速跳表,链表表尾代表着可遍历的超时链表,都指向同一个入口下内容。跳跃表主要实现高效查询,而双向链表实现老化标记,由此在高效查询/插入/删除等操作时可同时进行排序,老化标记,进而通过步骤S4进行延时删除。
S4:在步骤S3的基础上,执行FIFO控制。步骤S4具体操作如下:当元素删除时,先将元素的key从上述两个数据结构中摘除,然后将其放入该入口的freelist中,freelist以FIFO(先进先出)的方式实现,每压进一个元素,就把头元素进行删除。这样做实际上是实现了一个最简易版的GC(垃圾回收),实现延时删除,最终效果如图4所示。
Claims (1)
1.一种基于碰撞的带老化删除的双层无锁哈希表实现方法,其特征在于,包括以下步骤:
S1:设置双层哈希表;S1的具体步骤包括设置两个不同的哈希函数,分配双层哈希表,针对相同key进行计算,分别得出两个不同的索引值,其中一个索引值定位第一层表位置,第二个索引值定位第二层表位置;
S2:进行无锁操作;S2的具体步骤包括:哈希表入口的数据结构以跳跃表作为基本数据结构,在跳跃表的基础上加大节点层数,形成多级链表;
S3:进行跳跃表+双向链表的运行方式;步骤S3中将哈希表入口更改为跳跃表+双向链表的运行方式,每当插入/查询/删除时,同时操作两个数据结构,需要做如下更改:
双向链表的key按照时间戳进行升序排列,每当插入某个元素或者查找到某个元素,将该元素置顶到该表头;
跳跃表的key按照第三套哈希算法计算,进行排序并存储,更改完毕后,跳跃表的表头按分层进行查询/插入/删除/修改,双向链表表尾指向的内容就是按时间排序的最不活跃的元素内容;
S4:在步骤S3的基础上,执行FIFO控制;所述步骤S4具体操作如下:当元素删除时,先将元素的key从上述两个数据结构中摘除,然后将其放入该入口的freelist中,freelist以FIFO的方式实现,每压进一个元素,就把头元素进行删除。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110032390.0A CN112783894B (zh) | 2021-01-11 | 2021-01-11 | 基于碰撞的带老化删除的双层无锁哈希表实现方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110032390.0A CN112783894B (zh) | 2021-01-11 | 2021-01-11 | 基于碰撞的带老化删除的双层无锁哈希表实现方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN112783894A CN112783894A (zh) | 2021-05-11 |
CN112783894B true CN112783894B (zh) | 2022-12-20 |
Family
ID=75756568
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110032390.0A Active CN112783894B (zh) | 2021-01-11 | 2021-01-11 | 基于碰撞的带老化删除的双层无锁哈希表实现方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN112783894B (zh) |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008037201A1 (fr) * | 2006-09-29 | 2008-04-03 | Huawei Technologies Co., Ltd. | Procédé et appareil permettant de résoudre une collision de hachage |
CN108280229A (zh) * | 2018-02-26 | 2018-07-13 | 腾讯科技(深圳)有限公司 | 内存数据读写方法和装置 |
CN110413612A (zh) * | 2019-07-02 | 2019-11-05 | 华中科技大学 | 一种基于混合索引的混合内存性能优化方法及系统 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8515965B2 (en) * | 2010-05-18 | 2013-08-20 | Lsi Corporation | Concurrent linked-list traversal for real-time hash processing in multi-core, multi-thread network processors |
-
2021
- 2021-01-11 CN CN202110032390.0A patent/CN112783894B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
WO2008037201A1 (fr) * | 2006-09-29 | 2008-04-03 | Huawei Technologies Co., Ltd. | Procédé et appareil permettant de résoudre une collision de hachage |
CN108280229A (zh) * | 2018-02-26 | 2018-07-13 | 腾讯科技(深圳)有限公司 | 内存数据读写方法和装置 |
CN110413612A (zh) * | 2019-07-02 | 2019-11-05 | 华中科技大学 | 一种基于混合索引的混合内存性能优化方法及系统 |
Non-Patent Citations (1)
Title |
---|
改进的哈希表查找算法;朱芳芳等;《杭州电子科技大学学报》;20131015(第05期);全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN112783894A (zh) | 2021-05-11 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Bender et al. | Two simplified algorithms for maintaining order in a list | |
CN102521334B (zh) | 一种基于分类特性和平衡二叉树的数据存储、查询方法 | |
US8788543B2 (en) | Scalable, concurrent resizing of hash tables | |
US6571261B1 (en) | Defragmentation utility for a shared disk parallel file system across a storage area network | |
US6654773B2 (en) | Method of deterministic garbage collection | |
US7206776B2 (en) | Priority differentiated subtree locking | |
US20070027916A1 (en) | Hybrid object placement in a distributed storage system | |
CN106844584B (zh) | 元数据结构和基于其的操作方法、定位方法、切分方法 | |
CN102420771B (zh) | 高速网络环境中提高tcp并发连接速度的方法 | |
RU2525752C2 (ru) | Способ и устройство хранения, чтения и записи составного документа | |
US7962453B2 (en) | Dynamic redistribution of a distributed memory index when individual nodes have different lookup indexes | |
CN117271531B (zh) | 一种数据存储方法、系统、设备及介质 | |
CN112783894B (zh) | 基于碰撞的带老化删除的双层无锁哈希表实现方法 | |
US7484068B2 (en) | Storage space management methods and systems | |
US20200379955A1 (en) | Incremental metadata aggregation for a file storage system | |
US7308448B1 (en) | Method and apparatus for implementing a lock-free skip list that supports concurrent accesses | |
CN113590332A (zh) | 内存管理方法、装置及内存分配器 | |
CN112711564B (zh) | 合并处理方法以及相关设备 | |
Ramakrishna et al. | Smart dynamic memory allocator for embedded systems | |
US11010070B2 (en) | Methods for aligned, MPU region, and very small heap block allocations | |
Wang et al. | Isle-tree: A b+-tree with intra-cache line sorted leaves for non-volatile memory | |
CN112328389A (zh) | 一种用于二叉树添加和删除结点的内存分配方法 | |
CN104778264A (zh) | 一种键值数据库的内存分配方法 | |
CN110232139B (zh) | 一种适用于嵌入式软件的soc数据管理方法 | |
Halpern | Polymorphic memory resources-r2 |
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 | ||
GR01 | Patent grant | ||
GR01 | Patent grant |