本申请提供了一种基于动态压缩前缀树的KV缓存方法与装置,所述方法包括:获取客户端的请求,并将所述客户端的请求分配至多个线程;对任一线程,通过对所述客户端的请求进行解析获取执行命令,并基于动态压缩前缀树执行所述执行命令,得到执行结果。本申请中的动态压缩前缀树使数据存储全局有序,提高了查询效率,节省了内存空间,提高了缓存局部性,可以更好地支持区间扫描;通过增设prefix key节点进一步确保了数据完整性;通过网络层的请求分配,实现了底层数据结构的多核多线程处理;通过并发管理单元构建了并发安全的索引树,从而能够在海量的并发操作下提供强大的性能保证;通过内存回收单元实现了多线程场景下的内存释放。释放。释放。
【技术实现步骤摘要】
基于动态压缩前缀树的KV缓存方法与装置
[0001]本申请涉及数据处理
,尤其涉及一种基于动态压缩前缀树的KV缓存方法与装置。
技术介绍
[0002]目前著名的中文问答社区已拥有千万级的问题、亿级的回答,而各社区对缓存的依赖规模更加庞大,日均需处理过亿缓存请求。而海量的数据请求的性能、扩展性,对线上用户体验、公司决策、产品策略等非常重要。
[0003]为了解决复杂度较高的缓存请求,通常通过横向扩展充分利用计算机的CPU性能,业界中最常见的解决方案为Redis,但Redis仍存在不足之处,例如,Redis虽然支持I/O线程的多核,但计算逻辑一般多为单核处理,对于复杂的计算命令,多核收效甚微,并且其多核的扩展存在上限;Redis底层基于哈希表实现Key的存储,无法保证Key的有序;此外,Redis对于按照区间的范围查找效果很差,需要扫描全集。
技术实现思路
[0004]本申请提供一种基于动态压缩前缀树的KV缓存方法与装置,以实现横向扩展,解决复杂度高的缓存请求,充分利用现代计算机的CPU性能。
[0005]第一方面,本申请提供一种基于动态压缩前缀树的KV缓存方法,所述方法包括:获取客户端的请求,并将所述客户端的请求分配至多个线程;对任一线程,通过对所述客户端的请求进行解析获取执行命令,并基于动态压缩前缀树执行所述执行命令,得到执行结果;其中,所述动态压缩前缀树包括并发管理单元、内存回收单元、内存压缩单元,所述并发管理单元用于为所述动态压缩前缀树的各节点调整版本号,所述版本号包括读写阻塞标志位和重试标志位。
[0006]根据本申请提供的一种基于动态压缩前缀树的KV缓存方法,所述为所述动态压缩前缀树的各节点调整版本号,包括:若某节点存在写操作,则在进行写操作之前和写操作之后,均对所述节点的版本号进行第一类加处理,以调整所述读写阻塞标志位的值;若某节点存在删除操作,则在进行删除操作时,对所述节点的版本号进行第二类加处理,以调整所述重试标志位的值。
[0007]根据本申请提供的一种基于动态压缩前缀树的KV缓存方法,所述读写阻塞标志位用于判断各节点是否存在写操作以及是否阻塞其他线程的读写操作,相应的,基于所述读写阻塞标志位判断各节点是否存在写操作以及是否阻塞其他线程的读写操作的步骤具体包括:针对任一线程当前访问的节点,获取所述节点的版本号;基于所述节点的版本号,确定所述节点的读写阻塞标志位的值;若所述读写阻塞标志位的值为1,则表示所述节点存在写操作且已阻塞其他线程的读写操作;若所述读写阻塞标志位的值为0,则表示所述节点不存在写操作且未阻塞其他线程的读写操作。
[0008]根据本申请提供的一种基于动态压缩前缀树的KV缓存方法,所述重试标志位用于判断访问各节点是否需要进行重试操作,相应的,基于所述重试标志位判断访问各节点是否需要进行重试操作的步骤具体包括:针对任一线程当前访问的节点,获取所述节点的版本号;基于所述节点的版本号,确定所述节点的重试标志位的值;若所述重试标志位的值为1,则表示访问所述节点需要进行重试操作;若所述重试标志位的值为0,则表示访问所述节点不需要进行重试操作。
[0009]根据本申请提供的一种基于动态压缩前缀树的KV缓存方法,所述内存回收单元用于支持所述动态压缩前缀树实现多线程的内存回收;其中,所述支持所述动态压缩前缀树实现多线程的内存回收,具体包括:针对任一线程,将所述线程的代计数设为最大值;对全局预删除数据列表进行上锁操作,并遍历所有线程确定最小的代计数;对所述全局预删除数据列表进行解锁操作,并删除所述线程对应的预删除数据列表中小于所述最小的代计数的数据。
[0010]根据本申请提供的一种基于动态压缩前缀树的KV缓存方法,所述动态压缩前缀树设有prefix key节点,所述prefix key节点用于存储与前缀相同的数据。
[0011]根据本申请提供的一种基于动态压缩前缀树的KV缓存方法,所述内存压缩单元用于采用路径压缩和惰性扩展对所述动态压缩前缀树进行压缩处理。
[0012]第二方面,本申请还提供一种基于动态压缩前缀树的KV缓存装置,所述装置包括:线程分配模块,用于获取客户端的请求,并将所述客户端的请求分配至多个线程;线程执行模块,用于对任一线程,通过对所述客户端的请求进行解析获取执行命令,并基于动态压缩前缀树执行所述执行命令,得到执行结果;其中,所述动态压缩前缀树包括并发管理单元、内存回收单元、内存压缩单元,所述并发管理单元用于为所述动态压缩前缀树的各节点调整版本号,所述版本号包括读写阻塞标志位和重试标志位。
[0013]第三方面,本申请实施例还提供了一种电子设备,所述电子设备包括存储器和处理器,所述存储器存储有计算机程序,所述处理器运行所述计算机程序时,执行上述的基于动态压缩前缀树的KV缓存方法中的任一实现方式中的步骤。
[0014]第四方面,本申请实施例还提供了一种可读存储介质,所述可读取存储介质中存储有计算机程序,所述计算机程序在处理器上运行时,执行上述的基于动态压缩前缀树的KV缓存方法中的任一实现方式中的步骤。
[0015]综上所述,基于动态压缩前缀树的KV缓存方法与装置,实现了横向扩展,解决了复杂度高的缓存请求,充分利用了现代计算机的CPU性能。通过网络层的请求分配,实现了底层数据结构的多核多线程处理方法;通过构建动态压缩前缀树,不仅使数据存储全局有序,提高了查询效率,还节省了内存空间,提高了缓存局部性,可以更好地支持区间扫描;通过为动态压缩前缀树增设prefix key节点,进一步确保数据的完整性和准确性;通过并发管理单元调整读写阻塞标志位和重试标志位实现对各节点读写操作的并发管理,构建了并发安全的索引树,从而能够在海量的并发操作下提供强大的性能保证;通过内存回收单元实现了多线程场景下的内存释放;通过内存压缩单元进一步节省内存空间。
附图说明
[0016]为了更清楚地说明本申请或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作一简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0017]图1是本申请提供的基于动态压缩前缀树的KV缓存方法的流程示意图;图2是本申请提供的为所述动态压缩前缀树的各节点调整版本号的方法的流程示意图;图3是本申请提供的基于动态压缩前缀树的KV缓存装置的结构示意图;图4是本申请实施例提供的电子设备的结构示意图。
[0018]图标:300
‑
KV缓存装置;310
‑
线程分配模块;320
‑
线程执行模块;400
‑
电子设备;410
‑
存储器;420
‑
处理器;430
‑
总线。
具体实施方式
[0019]为使本申请的目的、技术方案和优点更加清楚,下面将结合本申请中的附图,对本申请中的技术方案进行清楚本文档来自技高网...
【技术保护点】
【技术特征摘要】
1.一种基于动态压缩前缀树的KV缓存方法,其特征在于,所述方法包括:获取客户端的请求,并将所述客户端的请求分配至多个线程;对任一线程,通过对所述客户端的请求进行解析获取执行命令,并基于动态压缩前缀树执行所述执行命令,得到执行结果;其中,所述动态压缩前缀树包括并发管理单元、内存回收单元、内存压缩单元,所述并发管理单元用于为所述动态压缩前缀树的各节点调整版本号,所述版本号包括读写阻塞标志位和重试标志位。2.根据权利要求1所述的方法,其特征在于,所述为所述动态压缩前缀树的各节点调整版本号,包括:若某节点存在写操作,则在进行写操作之前和写操作之后,均对所述节点的版本号进行第一类加处理,以调整所述读写阻塞标志位的值;若某节点存在删除操作,则在进行删除操作时,对所述节点的版本号进行第二类加处理,以调整所述重试标志位的值。3.根据权利要求2所述的方法,其特征在于,所述读写阻塞标志位用于判断各节点是否存在写操作以及是否阻塞其他线程的读写操作,相应的,基于所述读写阻塞标志位判断各节点是否存在写操作以及是否阻塞其他线程的读写操作的步骤具体包括:针对任一线程当前访问的节点,获取所述节点的版本号;基于所述节点的版本号,确定所述节点的读写阻塞标志位的值;若所述读写阻塞标志位的值为1,则表示所述节点存在写操作且已阻塞其他线程的读写操作;若所述读写阻塞标志位的值为0,则表示所述节点不存在写操作且未阻塞其他线程的读写操作。4.根据权利要求2所述的方法,其特征在于,所述重试标志位用于判断访问各节点是否需要进行重试操作,相应的,基于所述重试标志位判断访问各节点是否需要进行重试操作的步骤具体包括:针对任一线程当前访问的节点,获取所述节点的版本号;基于所述节点的版本号,确定所述节点的重试标志位的值;若所述重试标志位的值为1,则表示访问所述节点需要进行重...
【专利技术属性】
技术研发人员:高天一,代晓磊,姜诚,谢丹博,
申请(专利权)人:智者四海北京技术有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。