实现Redis的HASH键的域生命周期控制方法、系统、服务器及存储介质与流程

文档序号:16881076发布日期:2019-02-15 22:09阅读:349来源:国知局
实现Redis的HASH键的域生命周期控制方法、系统、服务器及存储介质与流程

本发明涉及软件工程领域,具体涉及一种实现redis的hash键的域生命周期控制方法、系统、服务器及存储介质。



背景技术:

在软件工程领域,内存数据库redis被广泛使用,redis的高io处理能力和存储读取能力,被广泛用户数据缓存和消息队列。redis中有5种类型的键,string类型,hash类型,list类型,set类型和zset类型。redis为键提供了生命周期的概念,即使用方可以为键设置生存时间,过了生存时间后,键自动被删除。这个特性也被广泛运用在各种类型的业务中,同时也释放了redis的内存空间。

redis中的hash结构由于类似对象结构,即拥有域和值,被广泛使用,但是在使用中发现,有很多业务场景有对hash的域进行生命周期的控制的需求,即要求hash的域能实现自动过期删除。但是redis并没有提供这种特性,redis本身仅仅提供了针对键级别的生命周期控制。而在实际使用中,因为string类型的键具有声明周期控制,所以大多数开发人员不采用hash类型而采用string替代hash,但是无法使用hash的对象关系带来的便利。



技术实现要素:

鉴于现有技术存在的问题,本发明的目的是提供一种实现redis的hash键的域生命周期控制方法、系统、服务器及存储介质,结合redis键的对象活跃属性和定时任务,实现redis的hash类型的域生命周期控制,误差在秒级别的实现了hash的域的自动删除,使得业务能够使用到hash类型带来的存储结构的遍历的同时,又可以控制hash类型的域的生命周期。

为了实现上述目的,本发明采用的技术方案为一种,所述方法包括以下步骤:

s1、在redis中使用第一hash数据结构,所述第一hash数据结构用于存储数据,并为第一hash数据结构的key值备份第二hash数据结构的key值,所述备份的第二hash数据结构的key值用于存储第一hash数据结构中期望实现生命周期控制的域;

s2、将所述第一hash数据结构的key值放置于set数据结构中,用于统一管理;

s3、根据redis提供的object内存结构的lru活跃属性,扫描步骤s2中存放第一hash数据结构的key值的set数据结构,遍历set数据结构即对存储于set中每个数据进行访问并找出根据定时任务设定时间内活跃的第一hash数据结构的key值,然后遍历所述活跃的第一hash数据结构的key值对应的备份第二hash数据结构的key值,同时遍历备份第二hash数据结构的活跃的key值的每个域,用于判断是否到了域自动过期的时间,如果所述域的当前时间大于等于域预设的过期时间,则删除备份第二hash数据和第一hash数据的对应域;如果没有到达域预设的过期时间,则继续遍历所述备份第二hash数据结构中另外key值的每个域。

在上述技术方案中,步骤s1中的第一hash数据结构包含key值、多个域以及每个域对应的value,若第一hash数据结构的key值为my_hash_key,使用中则设置了第一name域,并设定第一value值,设置了第一salary域,同时设定第二value值,期望所述第一salary域能够实现在指定的时间过期,设置了备份第二hash数据结构的key值my_hash_key_expire_time,所述备份第二hash数据结构的key值中存储的是所述my_hash_key键中期望实现生命周期控制的域,同时my_hash_key_expire_time键中有第二salary域,设定值为unix时间戳,这个时间戳即是期望第一hash数据中key值所述my_hash_key中的第一salary域过期的时间,若没有对第一name域做生命周期管理,即不期望该域自动过期。

在上述技术方案中,所述步骤s3中所述定时任务包括第一定时任务每5秒遍历所述set数据结构和第二定时任务每15秒遍历所述set数据结构。

在上述技术方案中,所述第一定时任务中并不用扫描第一hash数据结构中每个key值,只扫描最近5秒活跃的key值;

第二定时任务中需要扫描第一hash数据结构中的全部key值。

本发明还公开一种实现redis的hash键的域生命周期控制系统,所述系统包括备份模块、控制模块、定时扫描模块;

备份模块,用于在redis中使用第一hash数据结构,所述第一hash数据结构用于存储数据,并为第一hash数据结构的key值备份第二hash数据结构的key值,所述备份的第二hash数据结构的key值用于存储第一hash数据结构中期望实现生命周期控制的域;

控制模块,用于将所述第一hash数据结构的key值放置于set数据结构中,用于统一管理;

定时扫描模块,用于根据redis提供的object内存结构的lru活跃属性,扫描步骤s2中存放第一hash数据结构的key值的set数据结构,遍历set数据结构即对存储于set中每个数据进行访问并找出根据定时任务设定时间内活跃的第一hash数据结构的key值,然后遍历所述活跃的第一hash数据结构的key值对应的备份第二hash数据结构的key值,同时遍历备份第二hash数据结构的活跃的key值的每个域,用于判断是否到了域自动过期的时间,如果所述域的当前时间大于等于域预设的过期时间,则删除备份第二hash数据和第一hash数据的对应域;如果没有到达域预设的过期时间,则继续遍历所述备份第二hash数据结构中另外key值的每个域。在上述技术方案中,所述备份模块中的第一hash数据结构包含key值、多个域以及每个域对应的value,若第一hash数据结构的key值为my_hash_key,使用中则设置了第一name域,并设定第一value值,设置了第一salary域,同时设定第二value值,期望所述第一salary域能够实现在指定的时间过期,设置了备份第二hash数据结构的key值my_hash_key_expire_time,所述备份第二hash数据结构的key值中存储的是所述my_hash_key键中期望实现生命周期控制的域,同时my_hash_key_expire_time键中有第二salary域,设定值为unix时间戳,这个时间戳即是期望第一hash数据中key值所述my_hash_key中的第一salary域过期的时间,若没有对第一name域做生命周期管理,即不期望该域自动过期。在上述技术方案中,定时扫描模块中所述定时任务包括第一定时任务每5秒遍历所述set数据结构和第二定时任务每15秒遍历所述set数据结构。

在上述技术方案中,所述第一定时任务中并不用扫描第一hash数据结构中每个key值,只扫描最近5秒活跃的key值;

第二定时任务中需要扫描第一hash数据结构中的全部key值。

本发明还公开一种实现redis的hash键的域生命周期控制系统的服务器,包括存储器、处理器以及存储在所述存储器中并可在所述处理器上运行的计算机程序,所述处理器执行所述计算机程序时上述任一项所述一种实现redis的hash键的域生命周期控制方法的步骤。

本发明还公开一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序被处理器执行时实现上述任一项所述一种实现redis的hash键的域生命周期控制方法的步骤。

本发明一种实现redis的hash键的域生命周期控制方法、系统、服务器及存储介质,具有以下有益效果:结合redis的object内存结构的lru的活跃属性结合两种定时任务算法,实现指定域在秒级别的误差自动删除,使得业务能够使用到hash类型带来的存储结构的便利的同时,又可以控制hash类型的域的生命周期。设置2种定时任务算法,策略处理相互结合,节约了服务器计算资源,同时降低了redis的计算开销和维护开销,系统可维护性和可用性较高。

附图说明

图1为本发明实施例一提供的一种实现redis的hash键的域生命周期控制方法的流程图;

图2本发明实施例二提供一种实现redis的hash键的域生命周期控制系统模块图;

图3为本发明实施例三提供的服务器的结构示意图。

具体实施方式

本发明提供一种实现redis的hash键的域生命周期控制方法、系统、服务器及存储介质,基于redis的键的对象活跃属性和2种不同策略的轻量级定时任务,针对每个hash的数据结构,存储所述hash数据key值的类似的结构,域的值为期望的键的过期时间,实现对hash类型的域的生命周期控制。

为使得本发明的发明目的、特征、优点能够更加的明显和易懂,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,下面所描述的实施例仅仅是本发明一部分实施例,而非全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其它实施例,都属于本发明保护的范围。

本发明如图1所示实施例一提供一种实现redis的hash键的域生命周期控制方法,所述方法包括以下步骤,如图1所示:

s1、在redis中使用第一hash数据结构,所述第一hash数据结构用于存储数据,并为第一hash数据结构的key值备份第二hash数据结构的key值,所述备份的第二hash数据结构的key值用于存储第一hash数据结构中期望实现生命周期控制的域;

可选的,步骤s1伪代码表示为:

hsetmy_hash_keynamemike

hsetmy_hash_keysalary10

hsetmy_hash_key_expire_timesalary1520125476

其中,第一hash数据结构包含key值、多个域以及每个域对应的value,若第一hash数据结构的key值为my_hash_key,使用中则设置了第一name域,并设定第一value值为mike,设置了第一salary域,同时设定第二value值为10,同时期望所述第一salary域能够实现在指定的时间过期,设置了备份第二hash数据结构的key值my_hash_key_expire_time,所述备份第二hash数据结构的key值中存储的是所述my_hash_key键中期望实现生命周期控制的域,同时my_hash_key_expire_time键中有第二salary域,设定值为unix时间戳,这个时间戳即是期望第一hash数据中key值所述my_hash_key中的第一salary域过期的时间,若没有对第一name域做生命周期管理,即不期望该域自动过期。

所述hash是(散列、杂凑)函数,是将任意长度的数据映射到有限长度的域上。也就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹)。hash表属于一种存储结构,最常用的存储结构是顺序存储结构和链式存储结构,这两种结构的共同特征就是元素与元素之间存在映射关系。而hash表的元素之间相互独立。hash表具体的实现方式是给定一个参数,称为“键”。参数的类型可以是任何类型的数据,诸如字符、字符串、整型等等。然后根据该参数通过哈希算法计算生成的值来定位“键”对应的元素的存储地址。

redis中的hash是一个string类型的field和value的映射表,hash适合用于存储对象。

s2、将所述第一hash数据结构的key值放置于set数据结构中,用于统一管理;

redis的set是string类型的无序集合,最大可以包含(2的32次方-1)个元素。set数据结构的是通过hash表实现,每个集合可存储40多亿个成员。

s3、根据redis提供的object内存结构的lru活跃属性,扫描步骤s2中存放第一hash数据结构的key值的set数据结构,遍历set数据结构即对存储于set中每个数据进行访问并找出根据定时任务设定时间内活跃的第一hash数据结构的key值,然后遍历所述活跃的第一hash数据结构的key值对应的备份第二hash数据结构的key值,同时遍历备份第二hash数据结构的活跃的key值的每个域,用于判断是否到了域自动过期的时间,如果所述域的当前时间大于等于域预设的过期时间,则删除备份第二hash数据和第一hash数据的对应域;如果没有到达域预设的过期时间,则继续遍历所述备份第二hash数据结构中另外key值的每个域。

所述lru算法作为内存管理的一种有效算法,其含义是在内存有限的情况下,当内存容量不足时,为了保证程序的运行,这时就不得不淘汰内存中的一些对象,释放这些对象占用的空间,选择淘汰的对象是选择最近一段时间内,最久未使用的对象将其淘汰。

可选的,所述步骤s3中所述定时任务包括第一定时任务每5秒遍历所述set数据结构和第二定时任务每15秒遍历所述set数据结构。

其中,hash键即为hash结构结构的key值。

具体的,第一个定时任务每5秒(根据系统实际需要可以调整)执行1次,第二个定时任务每15秒(根据系统实际需要可以调整)执行1次。第一个定时任务利用redis提供的object内存结构的lru活跃属性,扫描存放第一hash数据结构的key值的set数据结构,遍历set并找到最近5秒钟活跃的键,然后遍历该键的备份键,遍历备份键的每个域,看是否到了域自动过期的时间,如果当前时间大于等于域过期时间,则删除备份第二hash键和第一hash键中该域;如果没有到达域过期时间,则继续遍历备份第二hash键的下个键。第一个定时任务只扫描最近5秒钟活跃的键,第二定时任务则不同,定时任务2扫描第二步中存放第一hash数据结构的key值的set数据结构,遍历集合中每个hash键的备份键,扫描备份键的每个域,如果到达过期时间则删除备份第二hash键和第一hash键中该域;如果没有到达域过期时间,则继续遍历备份第二hash键下个键。

可选的,所述第一定时任务中并不用扫描第一hash数据结构中每个key值,只扫描最近5秒活跃的key值;

第二定时任务中需要扫描第一hash数据中的全部key值。

具体的,第一定时任务利用了redis的object内存结构的lru的活跃属性,即扫描所有hash键集合的时候,并不是每个键都去扫描它的备份hash键进行生命周期控制,而且只扫描最近5秒活跃(有读写操作)的键。而第二定时任务是扫描全量的hash键,进行hash键的声明周期的控制。目的是通过第二定时任务实现对访问频繁的键及时进行域的生命周期的控制,而访问不频繁的键不进行处理,这样节约了服务器计算资源,同时在保证业务需要的同时,对必要的hash键进行了生命周期控制。第二定时任务是全量扫描,对所有的键即包括近期不活跃(没有读写操作)的键进行生命周期控制,这样保证了数据的完整性和业务的要求。设置第二定时任务的执行周期小于第一定时任务,节约了服务器计算资源,同时降低了redis的计算开销和维护开销。伪代码如下:

第一定时任务:

every5seconddo

{

//扫描包含所有hash键的集合

list<key>list=scankeyset;

//遍历每个key

for(eachkey){

if(objectidletimekey<5s){

//该key最近5秒活跃

//扫描该key的备份key

list<field>fields=scankey_expire_time;

for(eachfield){

if(hgetkey_expire_timefield<=now_unix_time){

//备份键中该域的过期时间小于等于当前时间

//删除备份hash键和原hash键中该域

hdelkey_expire_timefield

hdelkeyfield

}

}

}

}

}

第二定时任务:

every15seconddo

{

//扫描包含所有hash键的集合

list<key>list=scankeyset;

for(eachkey){

//不判断是否活跃,扫描所有key的备份key

list<field>fields=scankey_expire_time;

for(eachfield){

if(hgetkey_expire_timefield<=now_unix_time){

//备份键中该域的过期时间小于等于当前时间

//删除备份hash键和原hash键中该域

hdelkey_expire_timefield

hdelkeyfield

}

}

}

}

本发明实施例二如图2所示提供一种实现redis的hash键的域生命周期控制系统,所述系统包括备份模块、控制模块、定时扫描模块;

备份模块,用于在redis中使用第一hash数据结构,所述第一hash数据结构用于存储数据,并为第一hash数据结构的key值备份第二hash数据结构的key值,所述备份的第二hash数据结构的key值用于存储第一hash数据结构中期望实现生命周期控制的域;

控制模块,用于将所述第一hash数据结构的key值放置于set数据结构中,用于统一管理;

定时扫描模块,用于根据redis提供的object内存结构的lru活跃属性,扫描步骤s2中存放第一hash数据结构的key值的set数据结构,遍历set数据结构即对存储于set中每个数据进行访问并找出根据定时任务设定时间内活跃的第一hash数据结构的key值,然后遍历所述活跃的第一hash数据结构的key值对应的备份第二hash数据结构的key值,同时遍历备份第二hash数据结构的活跃的key值的每个域,用于判断是否到了域自动过期的时间,如果所述域的当前时间大于等于域预设的过期时间,则删除备份第二hash数据和第一hash数据的对应域;如果没有到达域预设的过期时间,则继续遍历所述备份第二hash数据结构中另外key值的每个域。可选的,所述备份模块中伪代码表示为:

hsetmy_hash_keynamemike

hsetmy_hash_keysalary10

hsetmy_hash_key_expire_timesalary1520125476

其中,第一hash数据结构包含key值、多个域以及每个域对应的value,若第一hash数据结构的key值为my_hash_key,使用中则设置了第一name域,并设定第一value值为mike,设置了第一salary域,同时设定第二value值为10,同时期望所述第一salary域能够实现在指定的时间过期,设置了备份第二hash数据结构的key值my_hash_key_expire_time,所述备份第二hash数据结构的key值中存储的是所述my_hash_key键中期望实现生命周期控制的域,同时my_hash_key_expire_time键中有第二salary域,设定值为unix时间戳,这个时间戳即是期望第一hash数据中key值所述my_hash_key中的第一salary域过期的时间,若没有对第一name域做生命周期管理,即不期望该域自动过期。可选的,定时扫描模块中所述定时任务包括第一定时任务每5秒遍历所述set数据结构和第二定时任务每15秒遍历所述set数据结构。

可选的,所述第一定时任务中并不用扫描第一hash数据结构中每个key值,只扫描最近5秒活跃的key值;

第二定时任务中需要扫描第一hash数据结构中的全部key值。

本发明实施例三如图3所示提供一种实现redis的hash键的域生命周期控制系统的服务器结构示意图,所述实施例的服务器包括:处理器30、存储器31以及存储在所述存储器31中并可在所述处理器30上运行的计算机程序32。所述处理器30执行所述计算机程序32时实现上述各方法实施例中的步骤,所述处理器30执行所述计算机程序32时实现上述装置实施例中各模块的功能。

所述一种实现redis的hash键的域生命周期控制系统的服务器可以是桌上型计算机、笔记本、掌上电脑及云端服务器等计算设备,所述一种实现redis的hash键的域生命周期控制系统的服务器可包括,但不限于,处理器30、存储器31。图3仅仅是对此服务器的示例,并不构成对此服务器的限定,可以包括比图示更多或更少的部件,或者组合某些部件,或者不同的部件,所述一种实现redis的hash键的域生命周期控制系统的服务器还可以包括输入输出设备33、显示设备34等。

所述处理器30可以是中央处理单元,还可以是其他通用处理器、数字信号处理器、专用集成电路、现成可编程门阵列或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。

所述存储器31可以是所述一种实现redis的hash键的域生命周期控制系统的服务器的内部存储单元、硬盘或内存。所述存储器31也可以是所述服务器的外部存储设备,或配备的插接式硬盘,智能存储卡,安全数字卡,闪存卡等。

进一步地,所述存储器31还可以既包括所述服务器的内部存储单元也包括外部存储设备。所述存储器31用于存储所述计算机程序以及所述电子设备所需的其他程序和数据。所述存储器31还可以用于暂时地存储已经输出或者将要输出的数据。

所述的输入输出设备33可用于接收输入的数字或字符信息,具体的,输入输出设备33还可以包括但不限于键盘、鼠标、操作杆等中的一种和多种。

所述的显示设备34可用于显示由用户输入的信息或提供给用户信息以及终端的各种菜单,显示设备34可包括显示面板,可选的,可采用液晶显示器。

所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。

本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各实施例的模块、方法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。

所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明实现上述实施例方法中的全部或部分流程,也可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一计算机可读存储介质中,该计算机程序在被处理器执行时,可实现上述各个方法实施例的步骤。其中,所述计算机程序包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、u盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(rom,read-onlymemory)、随机存取存储器(ram,randomaccessmemory)、电载波信号、电信信号以及软件分发介质等。需要说明的是,所述计算机可读介质包含的内容可以根据司法管辖区内立法和专利实践的要求进行适当的增减,例如在某些司法管辖区,根据立法和专利实践,计算机可读介质不包括电载波信号和电信信号。

以上所述,以上实施例仅用以说明本发明的技术方案,而非对其限制;尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本发明各实施例技术方案的精神和范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1