CN113297101A - 用于哈希缓存的方法以及装置 - Google Patents

用于哈希缓存的方法以及装置 Download PDF

Info

Publication number
CN113297101A
CN113297101A CN202011069352.4A CN202011069352A CN113297101A CN 113297101 A CN113297101 A CN 113297101A CN 202011069352 A CN202011069352 A CN 202011069352A CN 113297101 A CN113297101 A CN 113297101A
Authority
CN
China
Prior art keywords
hash
slot
key
mapped
atomic
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
Application number
CN202011069352.4A
Other languages
English (en)
Inventor
郑晓茵
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Alibaba Cloud Computing Ltd
Original Assignee
Alibaba Cloud Computing Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by Alibaba Cloud Computing Ltd filed Critical Alibaba Cloud Computing Ltd
Priority to CN202011069352.4A priority Critical patent/CN113297101A/zh
Publication of CN113297101A publication Critical patent/CN113297101A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0877Cache access modes
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F12/00Accessing, addressing or allocating within memory systems or architectures
    • G06F12/02Addressing or allocation; Relocation
    • G06F12/08Addressing or allocation; Relocation in hierarchically structured memory systems, e.g. virtual memory systems
    • G06F12/0802Addressing of a memory level in which the access to the desired data or data block requires associative addressing means, e.g. caches
    • G06F12/0893Caches characterised by their organisation or structure
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/46Multiprogramming arrangements
    • G06F9/52Program synchronisation; Mutual exclusion, e.g. by means of semaphores
    • G06F9/524Deadlock detection or avoidance

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Memory System Of A Hierarchy Structure (AREA)

Abstract

本说明书实施例提供用于哈希缓存的方法以及装置,其中所述用于哈希缓存的方法包括:在哈希表中查找出关键码映射的哈希槽,由于所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,因此,所述哈希槽可以设置有原子锁;获取所述关键码映射的哈希槽的原子锁以加锁;针对所述关键码映射的哈希槽执行访问;释放所述关键码映射的哈希槽的原子锁,从而不仅保证线程安全,并发冲突少,且可在多核能力下实现高吞吐的读写访问。

Description

用于哈希缓存的方法以及装置
技术领域
本说明书实施例涉及计算机技术领域,特别涉及一种用于哈希缓存的方法。本说明书一个或者多个实施例同时涉及一种用于哈希缓存的装置,一种计算设备,以及一种计算机可读存储介质。
背景技术
随着互联网的普及,服务器的信息量越来越多,访问量也越来越大。为了实现高吞吐的读写访问,利用哈希缓存存储一部分磁盘中的数据,是较为常见的一种存储方式。哈希缓存,是基于哈希表实现的缓存技术。哈希表,是根据关键码(Key)直接访问在内存储存位置的数据结构。通过哈希函数计算关键码的哈希值,将关键码映射到哈希表中哈希值对应的位置来访问记录,从而一定程度上加快了访问速度。
但是,由于哈希缓存在多线程访问时,可能存在并发冲突,因此,如何使哈希缓存既能避免并发冲突,又能提高读写吞吐,成为困扰人们的难题。
发明内容
有鉴于此,本说明书施例提供了一种用于哈希缓存的方法。本说明书一个或者多个实施例同时涉及一种用于哈希缓存的装置,一种计算设备,以及一种计算机可读存储介质,以解决现有技术中存在的技术缺陷。
根据本说明书实施例的第一方面,提供了一种用于哈希缓存的方法,包括:在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁;获取所述关键码映射的哈希槽的原子锁以加锁;针对所述关键码映射的哈希槽执行访问;释放所述关键码映射的哈希槽的原子锁。
可选地,所述哈希槽设置有哈希标签位,所述在哈希表中查找出关键码映射的哈希槽包括:通过计算需要访问的关键码的哈希值,确定所述关键码对应的哈希标签,所述哈希标签为所述哈希值的部分取值;根据所述哈希表中的哈希槽的哈希标签位,查找出与所述关键码对应的哈希标签相同的哈希槽;从与所述关键码对应的哈希标签相同的哈希槽中,查找出与关键码具有映射关系的哈希槽。
可选地,所述哈希槽设置有用于指向键值对对象的指针,所述键值对对象用于存储关键码及对应的值;所述针对所述关键码映射的哈希槽执行访问包括:利用所述关键码映射的哈希槽的指针指向的键值对对象,执行所述访问。
可选地,所述哈希槽设置有最近标识符,所述方法还包括:在释放所述关键码映射的哈希槽的原子锁之前,将所述关键码映射的哈希槽的最近标识符对应的值设置为真。
可选地,所述在哈希表中查找出关键码映射的哈希槽包括:通过计算需要访问的关键码的哈希值,查找出所述哈希值对应的哈希槽;在所述访问为写入关键码的情况下,判断查找出的哈希槽中是否存在空哈希槽;如果查找出的哈希槽中存在空哈希槽,则将所述空哈希槽作为所述关键码映射的哈希槽;如果查找出的哈希槽中不存在空哈希槽,则从所述关键码映射的哈希桶中查找出最近标识符对应的值为假的哈希槽作为所述关键码映射的哈希槽,且将所述关键码映射的哈希槽中原有关键码的数据逐出。
可选地,所述方法还包括:开始对所述哈希表中的哈希槽进行遍历;判断当前遍历到的哈希槽的最近标识符是否为真或假;如果当前遍历到的哈希槽的最近标识符为假,判断是否能获取所述当前遍历到的哈希槽的原子锁,如果能获取到当前遍历到的哈希槽的原子锁,则将当前遍历到的哈希槽中的原有关键码的数据逐出;如果当前遍历到的哈希槽的最近标识符为真,判断是否能获取所述当前遍历到的哈希槽的原子锁,如果能获取到当前遍历到的哈希槽的原子锁,则对当前遍历到的哈希槽的原子锁加锁且将当前遍历到的哈希槽的最近标识符置为假,释放当前遍历到的哈希槽的原子锁;继续遍历下一哈希槽,返回到所述判断当前遍历到的哈希槽的最近标识符是否为真或假的步骤。
可选地,所述开始对所述哈希表中的哈希槽进行遍历包括:当所述哈希缓存对内存资源的占用达到预设开始逐出水位时,开始对所述哈希表中的哈希槽进行遍历。所述方法还包括:当所述哈希缓存对内存资源的占用达到预设停止逐出水位时,停止对所述哈希表中的哈希槽进行遍历。
可选地,所述方法还包括:接收对所述预设开始逐出水位和/或所述预设停止逐出水位的配置指令;根据所述配置指令,设置所述预设开始逐出水位和/或所述预设停止逐出水位的值。
可选地,所述方法还包括:如果在对所述哈希表完成一次遍历的过程中,没有遍历到最近标识符为假的哈希槽,则从所述哈希表中随机选择哈希槽,获取随机选择到的哈希槽的原子锁,将所述随机选择到的哈希槽中的原有关键码的数据逐出,释放所述随机选择到的哈希槽的原子锁。
根据本说明书实施例的第二方面,提供了一种用于哈希缓存的装置,包括:查找模块,被配置为在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁。加锁模块,被配置为获取所述关键码映射的哈希槽的原子锁以加锁。执行模块,被配置为针对所述关键码映射的哈希槽执行访问。释锁模块,被配置为释放所述关键码映射的哈希槽的原子锁。
根据本说明书实施例的第三方面,提供了一种计算设备,包括:存储器和处理器;所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁;获取所述关键码映射的哈希槽的原子锁以加锁;针对所述关键码映射的哈希槽执行访问;释放所述关键码映射的哈希槽的原子锁。
根据本说明书实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时实现本说明书任意实施例所述用于哈希缓存的方法的步骤。
本说明书一个实施例提供了用于哈希缓存的方法,由于该方法在哈希表中查找出关键码映射的哈希槽,而所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,从而基于固定槽数的哈希表可以为哈希槽设置原子锁。针对关键码的访问,可以获取所述关键码映射的哈希槽的原子锁,对哈希槽级别的原子锁进行加锁。由于哈希槽的原子锁的粒度小,锁住的范围小,并发冲突少,从而在哈希槽级别的锁基础上,针对关键码映射的哈希槽执行访问,在访问结束后,释放关键码映射的哈希槽的原子锁,不仅保证线程安全,并发冲突少,且可在多核能力下实现高吞吐的读写访问。
附图说明
图1是本说明书一个实施例提供的一种用于哈希缓存的方法的流程图;
图2是本说明书一个实施例提供的一种哈希表结构示意图;
图3是本说明书一个实施例提供的一种用于哈希缓存的方法的数据逐出的处理流程图;
图4是本说明书一个实施例提供的一种环形逻辑结构示意图;
图5是本说明书一个实施例提供的一种用于哈希缓存的方法的读访问的处理过程流程图;
图6是本说明书一个实施例提供的一种用于哈希缓存的装置的结构示意图;
图7是本说明书另一个实施例提供的一种用于哈希缓存的装置的结构示意图;
图8是本说明书一个实施例提供的一种计算设备的结构框图。
具体实施方式
在下面的描述中阐述了很多具体细节以便于充分理解本说明书。但是本说明书能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本说明书内涵的情况下做类似推广,因此本说明书不受下面公开的具体实施的限制。
在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。
应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
首先,对本说明书一个或多个实施例涉及的名词术语进行解释。
哈希桶(bucket),是哈希表中的存储单位,一个哈希表包括多个哈希桶。
哈希槽(slot),是哈希桶的存储单位,一个哈希桶包括多个哈希槽。
在本说明书中,提供了一种用于哈希缓存的方法,本说明书同时涉及一种用于哈希缓存的装置,一种计算设备,以及一种计算机可读存储介质,在下面的实施例中逐一进行详细说明。
图1示出了根据本说明书一个实施例提供的一种用于哈希缓存的方法的流程图,包括步骤102至步骤108。
步骤102:在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁。
例如,如图2所示的哈希表结构示意图,哈希表有固定个数的bucket,每个bucket有固定数量的slot,无链表维护,是紧凑的内存空间,通过地址偏移量即可访问到。可以为每个哈希槽设置原子锁(atomic lock)。例如,该原子锁可以为1字节的原子变量,通过CAS的方式来获取锁,锁粒度在slot级别。
步骤104:获取所述关键码映射的哈希槽的原子锁以加锁。
步骤106:针对所述关键码映射的哈希槽执行访问。
其中,所述访问可以为读访问、插入或更新关键码的访问。
例如,在所述访问为读访问的情况下,可以根据关键码映射的哈希槽的指针指向的键值对对象或者哈希槽存储的键值对,读取出关键码对应的值。
再例如,在所述访问为插入或更新访问的情况下,可以在对应的哈希槽执行插入或更新关键码的操作。
步骤108:释放所述关键码映射的哈希槽的原子锁。
可见,由于该方法在哈希表中查找出关键码映射的哈希槽,而所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,从而基于固定槽数的哈希表可以为哈希槽设置原子锁。针对关键码的访问,可以获取所述关键码映射的哈希槽的原子锁,对哈希槽级别的原子锁进行加锁。由于哈希槽的原子锁的粒度小,锁住的范围小,并发冲突少,从而在哈希槽级别的锁基础上,针对关键码映射的哈希槽执行访问,并在访问结束后,释放关键码映射的哈希槽的原子锁,不仅支持线程安全,并发冲突少,且可在多核能力下实现高吞吐的读写访问。
为了加速对关键码的查找,本说明书一个或多个实施例中,所述哈希槽设置有哈希标签位。例如,如图2所示,可以为每个哈希槽设置哈希标签位(tag)。该哈希标签位,可以用于存储哈希标签,所述哈希标签为哈希值的部分取值。例如,tag,可以是1字节的hash值,每次比较key之前先比较tag值。相应地,所述在哈希表中查找出关键码映射的哈希槽可以包括:通过计算需要访问的关键码的哈希值,确定所述关键码对应的哈希标签,所述哈希标签为所述哈希值的部分取值;根据所述哈希表中的哈希槽的哈希标签位,查找出与所述关键码对应的哈希标签相同的哈希槽;从与所述关键码对应的哈希标签相同的哈希槽中,查找出关键码映射的哈希槽。
在该实施方式中,比较key之前先比较tag值,从而利用tag加速了key的查找。例如,在哈希缓存中查找到tag相同的哈希槽之后,可以将tag相同的哈希槽的key与要访问的key进行比较,key一致的哈希槽为要访问的key的哈希槽。
为了提高哈希缓存的读写效率以及减少对内存资源的占用,本说明书一个或多个实施例中,哈希槽采用指针的方式存储键值对对象(键值对对象可以为如图2所示的kvobject)。具体地,所述哈希槽设置有用于指向键值对对象的指针,所述键值对对象用于存储关键码及对应的值。相应地,所述针对所述关键码映射的哈希槽执行访问可以包括:利用所述关键码映射的哈希槽的指针指向的键值对对象,执行所述访问。
在该实施方式中,通过指针指向键值对对象,键值对对象存储关键码及对应的值,避免哈希表对内存资源的浪费,通过操作指针来读写关键码及对应的值,有效提高了哈希缓存的读写效率。例如,在确定了要访问的key的哈希槽后,可以利用该哈希槽的指针读取出其指向的关键码及对应的值。
lru:(Least Recently Used,即最近最少使用),是一种数据置换的算法,选择最近最少访问的数据置换出去。由于基于lru的哈希缓存,能够避免哈希缓存对内存资源的浪费,因此,本说明书一个或多个实施例中,还为所述哈希槽设置最近标识符,从而可以基于哈希槽的最近标识符实现lru cache。例如,如图2所示,可以为每个哈希槽设置最近标识符位(recent flag)。recent flag:用来表示当前是否被访问过,为真如“1”则表示已被访问过,为假如“0”则表示无访问过。相应地,所述方法还包括:在释放所述关键码映射的哈希槽的原子锁之前,将所述关键码映射的哈希槽的最近标识符对应的值设置为真(如,设置为“1”)。
本说明书一个或多个实施例中,由于设置了最近标识符位的哈希槽,可以根据最近标识符位,在需要写入关键码的情况下,基于最近最少使用的原理,写入关键码。具体地,例如,所述在哈希表中查找出关键码映射的哈希槽可以包括:通过计算需要访问的关键码的哈希值,查找出所述哈希值对应的哈希槽;在所述访问为写入关键码的情况下,判断查找出的哈希槽中是否存在空哈希槽;如果查找出的哈希槽中存在空哈希槽,则将所述空哈希槽作为所述关键码映射的哈希槽;如果查找出的哈希槽中不存在空哈希槽,则从所述关键码映射的哈希桶中查找出最近标识符对应的值为假的哈希槽作为所述关键码映射的哈希槽,且将所述关键码映射的哈希槽中原有关键码的数据逐出。其中,将所述关键码映射的哈希槽中原有关键码的数据逐出的步骤,可以在获取了该哈希槽的原子锁加锁之后,以及执行写访问之前执行。
在该实施方式中,由于根据最近标识符位,在需要写入关键码的情况下,基于最近最少使用的原理,写入关键码,实现了基于最近最少使用的数据逐出策略,有效地避免了哈希缓存对内存资源的浪费。
本说明书另一个或多个实施例中,可以根据最近标识符位按需基于LRU策略逐出数据。具体地,下述结合附图3,以本说明书提供的用于哈希缓存的方法在逐出数据的应用为例,对所述用于哈希缓存的方法进行进一步说明。其中,图3示出了本说明书一个实施例提供的一种用于哈希缓存的方法的数据逐出的处理流程图,具体步骤包括步骤302至步骤316。
步骤302:开始对所述哈希表中的哈希槽进行遍历。
步骤304:判断当前遍历到的哈希槽的最近标识符是否为真或假。
步骤306:如果当前遍历到的哈希槽的最近标识符为假,判断是否能获取所述当前遍历到的哈希槽的原子锁。
步骤308:如果能获取到当前遍历到的哈希槽的原子锁,则对当前遍历到的哈希槽的原子锁加锁且将当前遍历到的哈希槽中的原有关键码的数据逐出。
如果不能获取到原子锁,则可以放行,进入步骤316继续遍历。
步骤310:如果当前遍历到的哈希槽的最近标识符为真,判断是否能获取所述当前遍历到的哈希槽的原子锁。
步骤312:如果能获取到当前遍历到的哈希槽的原子锁,则对当前遍历到的哈希槽的原子锁加锁且将当前遍历到的哈希槽的最近标识符置为假。
如果不能获取到原子锁,则可以放行,进入步骤316继续遍历。
步骤314:释放当前遍历到的哈希槽的原子锁。
步骤316:继续遍历下一哈希槽。返回到步骤304所述判断当前遍历到的哈希槽的最近标识符是否为真或假的步骤。
在该实施方式中,通过对哈希表中的哈希槽的遍历,维护了一个如图4所示的数据逐出的环形逻辑结构。需要说明的是,图4所示的结构中,仅示意性地示出了部分哈希桶及哈希槽,实际可能包括更多哈希桶和哈希槽,如包括未示出的哈希桶bucket0和哈希槽slot0等。例如,可以从哈希表的第bucket0的slot0开始扫描,遇到recent flag=1的放行,尝试获取锁将其置为0,获取不到继续放行,遇到recent flag=0的,尝试删除逐出,获取锁失败后继续往下扫描。由于环形逻辑时钟只是一个逻辑的环形遍历,并不存储具体的bucket,几乎无内存消耗。可见,基于哈希槽的最近使用标识符位,可以使用逻辑环形时钟做lru淘汰,有效减少了对内存空间的消耗。
为了避免大范围逐出数据,本说明书一个或多个实施例中,采用逻辑环形时钟和内存水位结合的方法,根据LRU策略逐出数据。具体地,所述开始对所述哈希表中的哈希槽进行遍历可以包括:当所述哈希缓存对内存资源的占用达到预设开始逐出水位时,开始对所述哈希表中的哈希槽进行遍历。所述方法还可以包括:当所述哈希缓存对内存资源的占用达到预设停止逐出水位时,停止对所述哈希表中的哈希槽进行遍历。例如,当哈希缓存对内存资源的占用超出1G(如,每个bucket的slot个数为8个,bucket的个数为102400,预设开始逐出水位可以设置为1G)后开始进行遍历以便扫描出可逐出数据的哈希槽,当内存水位维持在理想的水位如低于1G后,则停止逐出扫描,从而既避免对内存资源的浪费又避免了大范围的逐出数据。
由于理想的内存水位随着实施环境的变化,也需要进行动态调整,因此,为了能够灵活配置用于控制逐出数据的内存水位,本说明书一个或多个实施例中,所述方法还可以包括:接收对所述预设开始逐出水位和/或所述预设停止逐出水位的配置指令;根据所述配置指令,设置所述预设开始逐出水位和/或所述预设停止逐出水位的值。
为了能够使哈希缓存维持在理想的内存水位,本说明书一个或多个实施例中,所述方法还包括:如果在对所述哈希表完成一次遍历的过程中,没有遍历到最近标识符为假的哈希槽,则从所述哈希表中随机选择哈希槽,获取随机选择到的哈希槽的原子锁,将所述随机选择到的哈希槽中的原有关键码的数据逐出,释放所述随机选择到的哈希槽的原子锁。例如,在完成一次环形遍历过程中,没有遍历到recent tag=0的哈希槽,则可以随机选择一个或多个哈希槽逐出数据。
下面,再对结合了本说明书多个实施例的一实施方式进行详细说明。例如,在该实施方式中,每个哈希槽如图2所示可以包括如下内容:
(1)atomic lock:1字节的原子变量,通过如CAS的方式来获取锁,锁粒度在slot级别。CAS(compare and swap)比较并替换,比较和替换是线程并发算法时用到的一种技术,是cpu的一个指令,用来实现并发安全。
(2)tag:1字节的hash值,取自key哈希值的一部分,每次比较key之前先比较tag值。
(3)recent flag:用来表示当前是否被访问过,为1已被访问过,为0表示无访问过。
(4)ptr:执行kv object的指针。
根据该实施方式的哈希槽,下述结合附图5,以本说明书提供的用于哈希缓存的方法在读访问的应用为例,对所述用于哈希缓存的方法进行进一步说明。其中,图5示出了本说明书一个实施例提供的一种用于哈希缓存的方法的读访问的处理过程流程图,具体步骤包括步骤502至步骤516。
步骤502:计算读访问要查找的关键码key的bucket值,tag值。
步骤504:遍历bucket中的每个slot,找到相同tag的slot。
步骤506:获取相同tag的slot的atomic lock,加锁。
步骤508:获取相同tag的slot的ptr。
步骤510:通过比较读访问要查找的key与ptr指向的键值对对象kv object的key,确定与要查找的key相同的slot。
步骤512:利用获取的ptr读取出key相同的slot的kv object的value值。
步骤514:将读取出value值的slot的recent flag置为1。
步骤516:释放相同tag的slot的atomic lock。
本说明书实施例提供的用于哈希缓存的方法在插入或更新key的应用与上述读访问的应用的查找key过程类似。例如,可以按照上述查找key的流程找到目标slot,加锁成功之后,执行写入,将执行写入的slot的recent flag置为1,释放锁。如果找不到空的slot可以写入,则可以从要写入的key映射的bucket头部的slot开始,选取recent flag=0的slot提出原来的key,将新key写入。
综合本说明书多个实施例可见,由于本说明书实施例提供的用于哈希缓存的方法使用固定个数的bucket和slot作为lru cache的基础,在此基础上能实现slot级别的原子锁粒度,既保证了线程安全,也保证了读写的高吞吐访问量,另外基于逻辑环形时钟结合内存水位的数据逐出策略,达到几乎零内存的消耗,极大节省了内存空间。
与上述方法实施例相对应,本说明书还提供了用于哈希缓存的装置实施例,图6示出了本说明书一个实施例提供的一种用于哈希缓存的装置的结构示意图。如图6所示,该装置包括:查找模块602、加锁模块604、执行模块606及释锁模块608。
该查找模块602,可以被配置为在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁。
该加锁模块604,可以被配置为获取所述关键码映射的哈希槽的原子锁以加锁。
该执行模块606,可以被配置为针对所述关键码映射的哈希槽执行访问。
该释锁模块608,可以被配置为释放所述关键码映射的哈希槽的原子锁。
可见,由于该装置在哈希表中查找出关键码映射的哈希槽,而所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,从而基于固定槽数的哈希表可以为哈希槽设置原子锁。针对关键码的访问,可以获取所述关键码映射的哈希槽的原子锁,对哈希槽级别的原子锁进行加锁。由于哈希槽的原子锁的粒度小,锁住的范围小,并发冲突少,从而在哈希槽级别的锁基础上,针对关键码映射的哈希槽执行访问,并在访问结束后,释放关键码映射的哈希槽的原子锁,不仅支持线程安全,并发冲突少,且可在多核能力下实现高吞吐的读写访问。
为了加速对关键码的查找,本说明书一个或多个实施例中,所述哈希槽设置有哈希标签位。图7示出了本说明书另一个实施例提供的一种用于哈希缓存的装置的结构示意图。如图7所示,该装置的查找模块602可以包括:
哈希标签计算子模块6022,可以被配置为通过计算需要访问的关键码的哈希值,确定所述关键码对应的哈希标签,所述哈希标签为所述哈希值的部分取值。
相同标签查找子模块6024,可以被配置为根据所述哈希表中的哈希槽的哈希标签位,查找出与所述关键码对应的哈希标签相同的哈希槽。
关键码比较子模块6026,可以被配置为从与所述关键码对应的哈希标签相同的哈希槽中,查找出关键码映射的哈希槽。
在该实施方式中,比较key之前先比较tag值,从而利用tag加速了key的查找。例如,在哈希缓存中查找到tag相同的哈希槽之后,可以将tag相同的哈希槽的key与要访问的key进行比较,key一致的哈希槽为要访问的key的哈希槽。
为了提高哈希缓存的读写效率以及减少对内存资源的占用,本说明书一个或多个实施例中,所述哈希槽设置有用于指向键值对对象的指针,所述键值对对象用于存储关键码及对应的值。相应地,所述执行模块606,可以被配置为利用所述关键码映射的哈希槽的指针指向的键值对对象,执行所述访问。
本说明书一个或多个实施例中,所述哈希槽设置有最近标识符。如图7所示,所述装置还可以包括:标识符设置模块610,可以被配置为在释放所述关键码映射的哈希槽的原子锁之前,将所述关键码映射的哈希槽的最近标识符对应的值设置为真。在该实施例中,可以基于哈希槽的最近标识符实现lru cache,基于lru的哈希缓存,能够避免哈希缓存对内存资源的浪费。
本说明书一个或多个实施例中,可以根据最近标识符位,在需要写入关键码的情况下,基于最近最少使用的原理,写入关键码。具体地,如图7所示,所述查找模块602可以包括:
空槽判断子模块6028,可以被配置为在所述访问为写入关键码的情况下,判断查找出的哈希槽中是否存在空哈希槽。所述查找出的空哈希槽可以是通过计算需要访问的关键码的哈希值查找出的、所述哈希值对应的哈希槽。例如,可以是基于上述实施例中的相同标签查找子模块6024查找出的哈希槽。
空槽确定子模块6029,可以被配置为如果查找出的哈希槽中存在空哈希槽,则将所述空哈希槽作为所述关键码映射的哈希槽。
逐出槽确定子模块6030,可以被配置为如果查找出的哈希槽中不存在空哈希槽,则从所述关键码映射的哈希桶中查找出最近标识符对应的值为假的哈希槽作为所述关键码映射的哈希槽。
逐出执行子模块6031,可以被配置为将所述关键码映射的哈希槽中原有关键码的数据逐出。
在该实施方式中,由于根据最近标识符位,在需要写入关键码的情况下,基于最近最少使用的原理,写入关键码,实现了基于最近最少使用的数据逐出策略,有效地避免了哈希缓存对内存资源的浪费。
本说明书一个或多个实施例中,可以根据最近标识符位按需主动基于LRU策略逐出数据。如图7所示,所述装置还可以包括:
遍历开始模块612,可以被配置为开始对所述哈希表中的哈希槽进行遍历。
最近使用判断模块614,可以被配置为判断当前遍历到的哈希槽的最近标识符是否为真或假。
逐出执行模块616,可以被配置为如果所述最近使用判断模块614判定当前遍历到的哈希槽的最近标识符为假,则判断是否能获取所述当前遍历到的哈希槽的原子锁,如果能获取到当前遍历到的哈希槽的原子锁,则将当前遍历到的哈希槽中的原有关键码的数据逐出。
标识符更新模块618,可以被配置为如果所述最近使用判断模块614判定当前遍历到的哈希槽的最近标识符为真,判断是否能获取所述当前遍历到的哈希槽的原子锁,如果能获取到当前遍历到的哈希槽的原子锁,则对当前遍历到的哈希槽的原子锁加锁且将当前遍历到的哈希槽的最近标识符置为假,释放当前遍历到的哈希槽的原子锁。
继续遍历模块620,可以被配置为继续遍历下一哈希槽,触发所述最近使用判断模块614返回到所述判断当前遍历到的哈希槽的最近标识符是否为真或假的步骤。
在该实施方式中,通过对哈希表中的哈希槽的遍历,维护了一个如图4所示的数据逐出的环形逻辑结构。由于环形逻辑时钟只是一个逻辑的环形遍历,并不存储具体的bucket,几乎无内存消耗。可见,基于哈希槽的最近使用标识符位,可以使用逻辑环形时钟做lru淘汰,有效减少了对内存空间的消耗。
为了避免大范围逐出数据,本说明书一个或多个实施例中,如图7所示,所述遍历开始模块612,可以被配置为当所述哈希缓存对内存资源的占用达到预设开始逐出水位时,开始对所述哈希表中的哈希槽进行遍历。相应地,所述装置还可以包括:遍历停止模块624,可以被配置为当所述哈希缓存对内存资源的占用达到预设停止逐出水位时,停止对所述哈希表中的哈希槽进行遍历。在该实施例中,可以避免在内存水位充足的情况下频繁的数据逐出和加载slot,在内存水位不足的情况下,自动逐出数据,从而使得哈希缓存的内存水位可以按需维持在理想状态,避免对内存资源的浪费。
由于理想的内存水位随着实施环境的变化,也需要进行动态调整,因此,为了能够灵活配置用于控制逐出数据的内存水位,本说明书一个或多个实施例中,如图7所示,所述装置还可以包括:配置指令接收模块626,可以被配置为接收对所述预设开始逐出水位和/或所述预设停止逐出水位的配置指令。配置执行模块628,可以被配置为根据所述配置指令,设置所述预设开始逐出水位和/或所述预设停止逐出水位的值。
为了能够使哈希缓存维持在理想的内存水位,本说明书一个或多个实施例中,如图7所示,所述装置还可以包括:随机逐出模块622,可以被配置为如果在对所述哈希表完成一次遍历的过程中,没有遍历到最近标识符为假的哈希槽,则从所述哈希表中随机选择哈希槽,获取随机选择到的哈希槽的原子锁,将所述随机选择到的哈希槽中的原有关键码的数据逐出,释放所述随机选择到的哈希槽的原子锁。
上述为本实施例的一种用于哈希缓存的装置的示意性方案。需要说明的是,该用于哈希缓存的装置的技术方案与上述的用于哈希缓存的方法的技术方案属于同一构思,用于哈希缓存的装置的技术方案未详细描述的细节内容,均可以参见上述用于哈希缓存的方法的技术方案的描述。
图8示出了根据本说明书一个实施例提供的一种计算设备800的结构框图。该计算设备800的部件包括但不限于存储器810和处理器820。处理器820与存储器810通过总线830相连接,数据库850用于保存数据。
计算设备800还包括接入设备840,接入设备840使得计算设备800能够经由一个或多个网络860通信。这些网络的示例包括公用交换电话网(PSTN)、局域网(LAN)、广域网(WAN)、个域网(PAN)或诸如因特网的通信网络的组合。接入设备840可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(NIC))中的一个或多个,诸如IEEE802.11无线局域网(WLAN)无线接口、全球微波互联接入(Wi-MAX)接口、以太网接口、通用串行总线(USB)接口、蜂窝网络接口、蓝牙接口、近场通信(NFC)接口,等等。
在本说明书的一个实施例中,计算设备800的上述部件以及图8中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图8所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。
计算设备800可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或PC的静止计算设备。计算设备800还可以是移动式或静止式的服务器。
其中,处理器820用于执行如下计算机可执行指令:
在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁;
获取所述关键码映射的哈希槽的原子锁以加锁;
针对所述关键码映射的哈希槽执行访问;
释放所述关键码映射的哈希槽的原子锁。
上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的用于哈希缓存的方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述用于哈希缓存的方法的技术方案的描述。
本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时以用于:
在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁;
获取所述关键码映射的哈希槽的原子锁以加锁;
针对所述关键码映射的哈希槽执行访问;
释放所述关键码映射的哈希槽的原子锁。
上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的用于哈希缓存的方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述用于哈希缓存的方法的技术方案的描述。
上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。
所述计算机指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。
需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本说明书实施例并不受所描述的动作顺序的限制,因为依据本说明书实施例,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本说明书实施例所必须的。
在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。
以上公开的本说明书优选实施例只是用于帮助阐述本说明书。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书实施例的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本说明书实施例的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本说明书。本说明书仅受权利要求书及其全部范围和等效物的限制。

Claims (12)

1.一种用于哈希缓存的方法,包括:
在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁;
获取所述关键码映射的哈希槽的原子锁以加锁;
针对所述关键码映射的哈希槽执行访问;
释放所述关键码映射的哈希槽的原子锁。
2.根据权利要求1所述的方法,所述哈希槽设置有哈希标签位,所述在哈希表中查找出关键码映射的哈希槽包括:
通过计算需要访问的关键码的哈希值,确定所述关键码对应的哈希标签,所述哈希标签为所述哈希值的部分取值;
根据所述哈希表中的哈希槽的哈希标签位,查找出与所述关键码对应的哈希标签相同的哈希槽;
从与所述关键码对应的哈希标签相同的哈希槽中,查找出与关键码具有映射关系的哈希槽。
3.根据权利要求1所述的方法,所述哈希槽设置有用于指向键值对对象的指针,所述键值对对象用于存储关键码及对应的值;
所述针对所述关键码映射的哈希槽执行访问包括:
利用所述关键码映射的哈希槽的指针指向的键值对对象,执行所述访问。
4.根据权利要求1-3任一项所述的方法,所述哈希槽设置有最近标识符,所述方法还包括:
在释放所述关键码映射的哈希槽的原子锁之前,将所述关键码映射的哈希槽的最近标识符对应的值设置为真。
5.根据权利要求4所述的方法,所述在哈希表中查找出关键码映射的哈希槽包括:
通过计算需要访问的关键码的哈希值,查找出所述哈希值对应的哈希槽;
在所述访问为写入关键码的情况下,判断查找出的哈希槽中是否存在空哈希槽;
如果查找出的哈希槽中存在空哈希槽,则将所述空哈希槽作为所述关键码映射的哈希槽;
如果查找出的哈希槽中不存在空哈希槽,则从所述关键码映射的哈希桶中查找出最近标识符对应的值为假的哈希槽作为所述关键码映射的哈希槽,且将所述关键码映射的哈希槽中原有关键码的数据逐出。
6.根据权利要求4所述的方法,还包括:
开始对所述哈希表中的哈希槽进行遍历;
判断当前遍历到的哈希槽的最近标识符是否为真或假;
如果当前遍历到的哈希槽的最近标识符为假,判断是否能获取所述当前遍历到的哈希槽的原子锁,如果能获取到当前遍历到的哈希槽的原子锁,则将当前遍历到的哈希槽中的原有关键码的数据逐出;
如果当前遍历到的哈希槽的最近标识符为真,判断是否能获取所述当前遍历到的哈希槽的原子锁,如果能获取到当前遍历到的哈希槽的原子锁,则对当前遍历到的哈希槽的原子锁加锁且将当前遍历到的哈希槽的最近标识符置为假,释放当前遍历到的哈希槽的原子锁;
继续遍历下一哈希槽,返回到所述判断当前遍历到的哈希槽的最近标识符是否为真或假的步骤。
7.根据权利要求6所述的方法,所述开始对所述哈希表中的哈希槽进行遍历包括:当所述哈希缓存对内存资源的占用达到预设开始逐出水位时,开始对所述哈希表中的哈希槽进行遍历;
所述方法还包括:
当所述哈希缓存对内存资源的占用达到预设停止逐出水位时,停止对所述哈希表中的哈希槽进行遍历。
8.根据权利要求7所述的方法,还包括:
接收对所述预设开始逐出水位和/或所述预设停止逐出水位的配置指令;
根据所述配置指令,设置所述预设开始逐出水位和/或所述预设停止逐出水位的值。
9.根据权利要求6所述的方法,还包括:
如果在对所述哈希表完成一次遍历的过程中,没有遍历到最近标识符为假的哈希槽,则从所述哈希表中随机选择哈希槽,获取随机选择到的哈希槽的原子锁,将所述随机选择到的哈希槽中的原有关键码的数据逐出,释放所述随机选择到的哈希槽的原子锁。
10.一种用于哈希缓存的装置,包括:
查找模块,被配置为在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁;
加锁模块,被配置为获取所述关键码映射的哈希槽的原子锁以加锁;
执行模块,被配置为针对所述关键码映射的哈希槽执行访问;
释锁模块,被配置为释放所述关键码映射的哈希槽的原子锁。
11.一种计算设备,包括:
存储器和处理器;
所述存储器用于存储计算机可执行指令,所述处理器用于执行所述计算机可执行指令:
在哈希表中查找出关键码映射的哈希槽,其中,所述哈希表中设置有固定数量的哈希桶,所述哈希桶设置有固定数量的哈希槽,所述哈希槽设置有原子锁;
获取所述关键码映射的哈希槽的原子锁以加锁;
针对所述关键码映射的哈希槽执行访问;
释放所述关键码映射的哈希槽的原子锁。
12.一种计算机可读存储介质,其存储有计算机指令,该指令被处理器执行时实现权利要求1至9任意一项所述用于哈希缓存的方法的步骤。
CN202011069352.4A 2020-09-30 2020-09-30 用于哈希缓存的方法以及装置 Pending CN113297101A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202011069352.4A CN113297101A (zh) 2020-09-30 2020-09-30 用于哈希缓存的方法以及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202011069352.4A CN113297101A (zh) 2020-09-30 2020-09-30 用于哈希缓存的方法以及装置

Publications (1)

Publication Number Publication Date
CN113297101A true CN113297101A (zh) 2021-08-24

Family

ID=77318312

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202011069352.4A Pending CN113297101A (zh) 2020-09-30 2020-09-30 用于哈希缓存的方法以及装置

Country Status (1)

Country Link
CN (1) CN113297101A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114584482A (zh) * 2022-02-14 2022-06-03 阿里巴巴(中国)有限公司 基于内存存储检测数据的方法、装置以及网卡

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104809179A (zh) * 2015-04-16 2015-07-29 华为技术有限公司 访问哈希表的装置和方法
CN111400307A (zh) * 2020-02-20 2020-07-10 上海交通大学 支持远程并发访问的持久哈希表访问系统
US10754788B1 (en) * 2016-09-30 2020-08-25 EMC IP Holding Company LLC Hash tables in flash memory

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104809179A (zh) * 2015-04-16 2015-07-29 华为技术有限公司 访问哈希表的装置和方法
US10754788B1 (en) * 2016-09-30 2020-08-25 EMC IP Holding Company LLC Hash tables in flash memory
CN111400307A (zh) * 2020-02-20 2020-07-10 上海交通大学 支持远程并发访问的持久哈希表访问系统

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
汤小丹: "《计算机操作系统》", 31 May 2007 *

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN114584482A (zh) * 2022-02-14 2022-06-03 阿里巴巴(中国)有限公司 基于内存存储检测数据的方法、装置以及网卡
CN114584482B (zh) * 2022-02-14 2023-09-08 阿里巴巴(中国)有限公司 基于内存存储检测数据的方法、装置以及网卡

Similar Documents

Publication Publication Date Title
US10176057B2 (en) Multi-lock caches
US10860323B2 (en) Method and apparatus for processing instructions using processing-in-memory
US6658522B1 (en) Method to reduce overhead associated with system I/O in a multiprocessor computer system
CN110502452B (zh) 访问电子设备中的混合缓存的方法及装置
CN110727675B (zh) 一种链表的处理方法及装置
US9229869B1 (en) Multi-lock caches
EP1782212A1 (en) System and method for maintaining objects in a lookup cache
US20080027946A1 (en) File Management in a Computing Device
US7493464B2 (en) Sparse matrix
CN107015922B (zh) 缓存存储器
CN101826107A (zh) 哈希数据处理方法和装置
CN113934655B (zh) 解决高速缓冲存储器地址二义性问题的方法和装置
CN113204435A (zh) 数据处理方法以及系统
CN109376125A (zh) 一种元数据存储方法、装置、设备及计算机可读存储介质
CN115168248B (zh) 支持simt架构的高速缓冲存储器及相应处理器
CN113297101A (zh) 用于哈希缓存的方法以及装置
CN106164874B (zh) 多核系统中数据访问者目录的访问方法及设备
CN107133334B (zh) 基于高带宽存储系统的数据同步方法
EP4369191A1 (en) Memory scanning method and apparatus
US11726788B2 (en) Tuple checkout with notify in coordination namespace system
CN112286947B (zh) 保持不同存储系统的数据一致的方法以及装置
US7904474B2 (en) Entry based access control cache
CN114780246A (zh) 内存访问信息的确定方法、存储介质及程序产品
KR100570731B1 (ko) 다사용자 저장 시스템에서 개선된 재기회 희생자 버퍼페이지 선정방법
CN111221647B (zh) 一种分布式存储缓存回收的优化方法及装置

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
REG Reference to a national code

Ref country code: HK

Ref legal event code: DE

Ref document number: 40057452

Country of ref document: HK

RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20210824