技术特征:
1.一种基于共享内存的golang进程内缓存方法,其特征在于,所述方法的实现包括:通过使用预分配的内存使用模式,基于共享内存的堆外内存分配和管理,自主进行内存池的管理;根据内存对象的状态信息持久化外部存储,定时将内存数据持久化到外部存储;根据内存对象的过期时间、活跃时间信息,进行缓存清理,在内存使用率到达某个上限之后进行过期缓存的回收。2.根据权利要求1所述的一种基于共享内存的golang进程内缓存方法,其特征在于,所述堆外内存分配和管理按照golang内存分配和管理,具体实现方式包括:先向操作系统申请一块内存,切成小块后自行管理,在此基础上为每个内存小块对象添加过期时间、访问时间、状态信息,用于数据的持久化和清理。3.根据权利要求2所述的一种基于共享内存的golang进程内缓存方法,其特征在于,所述内存管理结构和内存区域包括:slabs、hashtable、blocks、pages,其中:pages区域为堆外内存区域,动态分配的内存都是在该区域;将内存分割成8kb大小的内存页,若干连续的内存页组合起来称为slab;所述blocks区域标识所有内存页的使用情况,每个block对应一个内存页;所述hashtable区域标识内存对象的存储地址、状态以及使用情况,以数据的key进行hashtable的hash值计算,每个内存对象有一个唯一key进行标识。4.根据权利要求4所述的一种基于共享内存的golang进程内缓存方法,其特征在于,所述slab是内存管理的基本单元,是由一片连续的8kb的页组成的大块内存,每个slab按照其自身的属性size class的大小分割成若干个object,每个object可存储一个对象;所述size class标识内存对象的大小。5.根据权利要求4所述的一种基于共享内存的golang进程内缓存方法,其特征在于,所述block结构用于管理页数据,使用时遵循懒加载策略,等到使用时才进行初始化;每个slab在使用过程中会进行block的申请和释放,slab所关联的block使用双链表结构来组织内存;每个slab在当前所有block使用完成之后会再次申请新的block,新的block与已有block链表建立关联;每次申请block是地址连续的n个页组成的,n值是根据不同尺寸的对象实际使用统计进行分配,n是根据实际业务逻辑数据使用情况确定的。6.根据权利要求4所述的一种基于共享内存的golang进程内缓存方法,其特征在于,所述hashtable结构的数据结构包括数组与链表,所述方法使用哈希函数将被查找的键转化为数组的索引,使用拉链法避免哈希冲突;所述hashtable结构的hashcode是使用内存对象key通过hash函数计算出来的;所述拉链法的实现包括:把hashcode相同的内存对象连成链表,获取内存对象时根据key找到对应的链表,如果有链表说明是冲突的,此时还需要检测key是否相同。7.根据权利要求4所述的一种基于共享内存的golang进程内缓存方法,其特征在于,所述chunk结构是管理内存对象的结构体,主要包含内存对象以及内存对象的使用情况,其结
构体内详细的字段信息有所属block、内存对象的size class、此内存对象存储数据的长度以及key的长度、当前状态、过期时间、最近访问时间和实际存储的数据。8.根据权利要求5-7任一所述的一种基于共享内存的golang进程内缓存方法,其特征在于,所述内存对象的持久化实现过程包括:将所有修过的内存对象写入到hashcodevector中,每次持久化时依次读取此结构中的hashcode,再去遍历相应的linkedlist,对那些新建或者修改过的chunk数据进行持久化;所述hashcodevector是一个可循环使用的首尾相连的循环向量,写入数据到达最大长度之后再从头部开始写入。9.根据权利要求8所述的一种基于共享内存的golang进程内缓存方法,其特征在于,所述chunk内存对象包括两种类型:临时内存对象、持久化内存对象,其中:临时内存对象是保存在内存中临时使用的数据,不需要持久化到外部存储,持久化内存对象需要持久化到外部存储的数据;临时内存数据在写入内存时会配置过期时间;持久化内存数据使用统一的过期时间,通过内存对象的最近访问时间和过期时间判断是否需要回收,如果最近访问时间加上过期时间小于当前时间就进行内存对象的回收。10.根据权利要求9所述的一种基于共享内存的golang进程内缓存方法,其特征在于,所述chunk内存对象回收过程中,把chunk归还到block,重建block的空闲chunk链表和相应的哈希列表;对于所有chunk都已经回收的block,block从相应的slab链表中删除,将block关联的所有page标记为未使用状态,以便之后的内存申请能够使用。

技术总结
本发明公开了一种基于共享内存的golang进程内缓存方法,所述方法的实现包括:通过使用预分配的内存使用模式,基于共享内存的堆外内存分配和管理,自主进行内存池的管理;根据内存对象的状态信息持久化外部存储,定时将内存数据持久化到外部存储;根据内存对象的过期时间、活跃时间信息,进行缓存清理,在内存使用率到达某个上限之后进行过期缓存的回收。本发明方法通过结合共享内存和golang堆外连续内存,提供了一种高效的、稳定的、安全的进程内缓存方法,通过利用共享内存在进程重启时不丢失数据的特性,以及高效的内存分配和管理策略,能够满足比较高的数据安全性和高效的数据读写效率,填补了对持久化安全要求比较高的进程内缓存的技术空白。内缓存的技术空白。内缓存的技术空白。


技术研发人员:张田田 邓光超 张明
受保护的技术使用者:浪潮云信息技术股份公司
技术研发日:2022.02.14
技术公布日:2022/5/17