Redis复杂对象内存压缩存储方法、装置及设备转让专利

申请号 : CN202310243222.5

文献号 : CN116340275B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 许志武

申请人 : 深圳市乐信信息服务有限公司

摘要 :

本发明实施例公开了Redis复杂对象内存压缩存储方法、装置及设备,包括将待存储对象中各条Redis字符串对象数据均转换成RedisHash对象数据,得到第一处理对象;将第一处理对象中各条RedisHash对象数据中键值进行哈希压缩得到第二处理对象;将第二处理对象中各字段键值进行哈希压缩得到第三处理对象;将第三处理对象中各字段值进行数值放大及数据类型转换处理,得到第四处理对象;将第四处理对象中各条RedisHash对象数据均序列化成序列数组,得到第五处理对象并存储。本发明实现了对待存储对象的多次压缩处理,得到了最终占用存储空间减小的第五处理对象,降低了存储成本。

权利要求 :

1.一种Redis复杂对象内存压缩存储方法,其特征在于,包括:

获取待存储对象;其中,所述待存储对象中包括多条Redis字符串对象数据;

将所述待存储对象中各条Redis字符串对象数据均转换成Redis Hash对象数据,得到第一处理对象;

将所述第一处理对象中各条Redis Hash对象数据中的键值进行第一次哈希压缩,得到第二处理对象;

将所述第二处理对象中各条Redis Hash对象数据中包括Redis Hash对象的字段键值进行第二次哈希压缩,得到第三处理对象;

将所述第三处理对象中各条Redis Hash对象数据中包括Redis Hash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象;

将所述第四处理对象中各条Redis Hash对象数据均序列化成序列数组,得到第五处理对象并存储;

将所述待存储对象中各条Redis字符串对象数据均转换成Redis Hash对象数据,得到第一处理对象,包括:获取所述待存储对象中包括的第1个Redis字符串对象数据至第N个Redis字符串对象数据;其中,N表示所述待存储对象中Redis字符串对象数据的总个数;

将第1个Redis字符串对象数据至第N个Redis字符串对象数据均基于哈希编码,得到与第1个Redis字符串对象数据至第N个Redis字符串对象数据分别对应的第1个Redis Hash对象数据至第N个Redis Hash对象数据,以组成所述第一处理对象。

2. 根据权利要求1所述的方法,其特征在于,所述将所述第一处理对象中各条Redis Hash对象数据中的键值进行第一次哈希压缩,得到第二处理对象,包括:获取所述第一处理对象的第i个Redis Hash对象数据,及第i个Redis Hash对象数据对应的第i个键值;其中,i的初始取值为1,且i的取值范围是[1,N];

将所述第i个键值通过预先存储的第一哈希算法进行哈希运算,得到第i个键值哈希值;其中,所述第一哈希算法为CRC32哈希算法;

将第i个键值哈希值基于预设的第一定长数值取模,得到第i个键值压缩值,并以所述第i个键值压缩值更新所述第一处理对象中第i个Redis Hash对象数据的第i个键值;

将i自增1以更新i的取值;

若确定i小于或等于N,则返回执行所述获取所述第一处理对象的第i个Redis Hash对象数据,及第i个Redis Hash对象数据对应的第i个键值的步骤;

若确定i大于N,则获取更新后的第1个Redis Hash对象数据至更新后的第N个Redis Hash对象数据,组成所述第二处理对象。

3. 根据权利要求2所述的方法,其特征在于,所述将所述第二处理对象中各条Redis Hash对象数据中包括Redis Hash对象的字段键值进行第二次哈希压缩,得到第三处理对象,包括:将所述第二处理对象中第i个Redis Hash对象数据的第j个字段键值通过预先存储的第二哈希算法进行哈希运算,得到第i个Redis Hash对象数据第j个键值哈希值;其中,j的初始取值为1,且j的取值范围是[1,M],M为第i个Redis Hash对象数据中所包括Redis Hash对象的总条数;所述第二哈希算法为Murmur32哈希算法;

以第i个Redis Hash对象数据第j个键值哈希值更新所述第二处理对象中第i个Redis Hash对象数据的第j个字段键值;

将j自增1以更新i的取值;

若确定j小于或等于M,则返回执行所述将所述第二处理对象中第i个Redis Hash对象数据的第j个字段键值通过预先存储的第二哈希算法进行哈希运算,得到第i个Redis Hash对象数据第j个键值哈希值的步骤;

若确定j大于M,则将j重置为1,将i自增1以更新i的取值;

若确定i小于或等于N,则返回执行所述将所述第二处理对象中第i个Redis Hash对象数据的第j个字段键值通过预先存储的第二哈希算法进行哈希运算,得到第i个Redis Hash对象数据第j个键值哈希值的步骤;

若确定i大于N,则获取更新后的第1个Redis Hash对象数据至更新后的第N个Redis Hash对象数据,组成所述第三处理对象。

4. 根据权利要求3所述的方法,其特征在于,所述将所述第三处理对象中各条Redis Hash对象数据中包括Redis Hash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象,包括:将所述第三处理对象中第i个Redis Hash对象数据的第k个字段值乘以预设放大倍数及转换成字符串类型,得到第i个Redis Hash对象数据第k个字符串字段值;其中,k的初始取值为1,且k的取值范围是[1,M];

以第i个Redis Hash对象数据第k个字符串字段值更新所述第三处理对象中第i个Redis Hash对象数据的第k个字段值;

将k自增1以更新k的取值;

若确定k小于或等于M,则返回执行所述将所述第三处理对象中第i个Redis Hash对象数据的第k个字段值乘以预设放大倍数及转换成字符串类型,得到第i个Redis Hash对象数据第k个字符串字段值的步骤;

若确定k大于M,则将k重置为1,将i自增1以更新i的取值;

若确定i小于或等于N,则返回执行所述将所述第三处理对象中第i个Redis Hash对象数据的第k个字段值乘以预设放大倍数及转换成字符串类型,得到第i个Redis Hash对象数据第k个字符串字段值的步骤;

若确定i大于N,则获取更新后的第1个Redis Hash对象数据至更新后的第N个Redis Hash对象数据,组成所述第四处理对象。

5. 根据权利要求4所述的方法,其特征在于,所述将所述第四处理对象中各条Redis Hash对象数据均序列化成序列数组,得到第五处理对象并存储,包括:获取所述第四处理对象中各条Redis Hash对象数据的键值、字段键值及字段值串接,组成各条Redis Hash对象数据对应的序列数组;

基于各条Redis Hash对象数据对应的序列数组组成所述第五处理对象并存储。

6. 根据权利要求1‑5任一项所述的方法,其特征在于,在所述将所述第四处理对象中各条Redis Hash对象数据均序列化成序列数组,得到第五处理对象并存储之后,所述方法还包括:若检测到业务调用指令,将所述第五处理对象进行反序列化处理,还原得到所述第四处理对象。

7.一种Redis复杂对象内存压缩存储装置,其特征在于,包括:

原始数据获取单元,用于获取待存储对象;其中,所述待存储对象中包括多条Redis字符串对象数据;

第一数据类型转换单元,用于将所述待存储对象中各条Redis字符串对象数据均转换成Redis Hash对象数据,得到第一处理对象;

第一哈希压缩单元,用于将所述第一处理对象中各条Redis Hash对象数据中的键值进行第一次哈希压缩,得到第二处理对象;

第二哈希压缩单元,用于将所述第二处理对象中各条Redis Hash对象数据中包括Redis Hash对象的字段键值进行第二次哈希压缩,得到第三处理对象;

第二数据类型转换单元,用于将所述第三处理对象中各条Redis Hash对象数据中包括Redis Hash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象;

数据序列化单元,用于将所述第四处理对象中各条Redis Hash对象数据均序列化成序列数组,得到第五处理对象并存储;

所述第一数据类型转换单元还用于:

获取所述待存储对象中包括的第1个Redis字符串对象数据至第N个Redis字符串对象数据;其中,N表示所述待存储对象中Redis字符串对象数据的总个数;

将第1个Redis字符串对象数据至第N个Redis字符串对象数据均基于哈希编码,得到与第1个Redis字符串对象数据至第N个Redis字符串对象数据分别对应的第1个Redis Hash对象数据至第N个Redis Hash对象数据,以组成所述第一处理对象。

8.一种计算机设备,其特征在于,所述计算机设备包括存储器及处理器,所述存储器上存储有计算机程序,所述处理器执行所述计算机程序时实现如权利要求1‑6任一项所述的Redis复杂对象内存压缩存储方法。

9.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时可实现如权利要求1‑6中任一项所述的Redis复杂对象内存压缩存储方法。

说明书 :

Redis复杂对象内存压缩存储方法、装置及设备

技术领域

[0001] 本发明涉及数据存储技术领域,尤其涉及一种Redis复杂对象内存压缩存储方法、装置及设备。

背景技术

[0002] 在广告投放过程中,媒体平台/投放平台根据广告主提供的目标人群要求为其筛选出合适的流量,并将筛选出的流量信息通过API(Application ProgrammingInterface,表示应用程序接口)同步给广告主;广告主的接收终端在接收到这流量请求后,会结合自有数据、营销诉求等判断该流量价值并决定是否需要;如果需要,会通过API返回给媒体平台以进一步参与竞价曝光。如果不要,则返回不参与竞价或不投放广告的信息。广告主判断流量价值,需要预先存储海量的设备信息,媒体平台/投放平台实时性要求基本小于60ms,故广告主需要将海量设备分值存储到内存缓存中。而广告主使用的服务器内存昂贵,若直接存储原始的海量设备分值数据,则会导致极大占用服务器内存空间,且极大提高数据存储成本。

发明内容

[0003] 本发明实施例提供了一种Redis复杂对象内存压缩存储方法、装置及设备,旨在解决现有技术中广告主使用的服务器是直接存储原始的海量设备分值数据,导致极大占用服务器内存空间,且极大提高数据存储成本的问题。
[0004] 第一方面,本发明实施例提供了一种Redis复杂对象内存压缩存储方法,其包括:
[0005] 获取待存储对象;其中,所述待存储对象中包括多条Redis字符串对象数据;
[0006] 将所述待存储对象中各条Redis字符串对象数据均转换成RedisHash对象数据,得到第一处理对象;
[0007] 将所述第一处理对象中各条RedisHash对象数据中的键值进行第一次哈希压缩,得到第二处理对象;
[0008] 将所述第二处理对象中各条RedisHash对象数据中包括RedisHash对象的字段键值进行第二次哈希压缩,得到第三处理对象;
[0009] 将所述第三处理对象中各条RedisHash对象数据中包括RedisHash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象;
[0010] 将所述第四处理对象中各条RedisHash对象数据均序列化成序列数组,得到第五处理对象并存储。
[0011] 第二方面,本发明实施例还提供了一种Redis复杂对象内存压缩存储装置,其包括:
[0012] 原始数据获取单元,用于获取待存储对象;其中,所述待存储对象中包括多条Redis字符串对象数据;
[0013] 第一数据类型转换单元,用于将所述待存储对象中各条Redis字符串对象数据均转换成RedisHash对象数据,得到第一处理对象;
[0014] 第一哈希压缩单元,用于将所述第一处理对象中各条RedisHash对象数据中的键值进行第一次哈希压缩,得到第二处理对象;
[0015] 第二哈希压缩单元,用于将所述第二处理对象中各条RedisHash对象数据中包括RedisHash对象的字段键值进行第二次哈希压缩,得到第三处理对象;
[0016] 第二数据类型转换单元,用于将所述第三处理对象中各条RedisHash对象数据中包括RedisHash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象;
[0017] 数据序列化单元,用于将所述第四处理对象中各条RedisHash对象数据均序列化成序列数组,得到第五处理对象并存储。
[0018] 第三方面,本发明实施例还提供了一种计算机设备,其包括存储器及处理器,所述存储器上存储有计算机程序,所述处理器执行所述计算机程序时实现上述第一方面所述的方法。
[0019] 第四方面,本发明实施例还提供了一种计算机可读存储介质,所述计算机可读存储介质存储有计算机程序,所述计算机程序包括程序指令,所述程序指令当被处理器执行时可实现上述第一方面所述的方法。
[0020] 本发明实施例提供了一种Redis复杂对象内存压缩存储方法、装置及设备,方法包括获取待存储对象;将待存储对象中各条Redis字符串对象数据均转换成RedisHash对象数据,得到第一处理对象;将第一处理对象中各条RedisHash对象数据中的键值进行第一次哈希压缩,得到第二处理对象;将第二处理对象中各条RedisHash对象数据中包括RedisHash对象的字段键值进行第二次哈希压缩,得到第三处理对象;将第三处理对象中各条RedisHash对象数据中包括RedisHash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象;将第四处理对象中各条RedisHash对象数据均序列化成序列数组,得到第五处理对象并存储。本发明实施例实现了对待存储对象的多次压缩处理,得到了最终占用存储空间减小的第五处理对象,降低了存储成本。

附图说明

[0021] 为了更清楚地说明本发明实施例技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0022] 图1为本发明实施例提供的Redis复杂对象内存压缩存储方法的应用场景示意图;
[0023] 图2为本发明实施例提供的Redis复杂对象内存压缩存储方法的流程示意图;
[0024] 图3为本发明实施例提供的Redis复杂对象内存压缩存储方法中RedisHash对象数据的数据结构示意图;
[0025] 图4为本发明实施例提供的Redis复杂对象内存压缩存储方法的子流程示意图;
[0026] 图5为本发明实施例提供的Redis复杂对象内存压缩存储方法的子流程示意图;
[0027] 图6为本发明实施例提供的Redis复杂对象内存压缩存储方法的子流程示意图;
[0028] 图7为本发明实施例提供的Redis复杂对象内存压缩存储方法的子流程示意图;
[0029] 图8为本发明实施例提供的Redis复杂对象内存压缩存储方法的子流程示意图;
[0030] 图9为本发明实施例提供的Redis复杂对象内存压缩存储装置的示意性框图;
[0031] 图10为本发明实施例提供的计算机设备的示意性框图。

具体实施方式

[0032] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0033] 应当理解,当在本说明书和所附权利要求书中使用时,术语“包括”和“包含”指示所描述特征、整体、步骤、操作、元素和/或组件的存在,但并不排除一个或多个其它特征、整体、步骤、操作、元素、组件和/或其集合的存在或添加。
[0034] 还应当理解,在此本发明说明书中所使用的术语仅仅是出于描述特定实施例的目的而并不意在限制本发明。如在本发明说明书和所附权利要求书中所使用的那样,除非上下文清楚地指明其它情况,否则单数形式的“一”、“一个”及“该”意在包括复数形式。
[0035] 还应当进一步理解,在本发明说明书和所附权利要求书中使用的术语“和/或”是指相关联列出的项中的一个或多个的任何组合以及所有可能组合,并且包括这些组合。
[0036] 本发明实施例提供了一种Redis复杂对象内存压缩存储方法、装置及设备。本发明实施例中的Redis复杂对象内存压缩存储方法应用于服务器,服务器中设置有一个或多个处理器、存储器,以及一个或多个应用程序,其中一个或多个应用程序被存储于存储器中,并配置为由处理器执行以实现Redis复杂对象内存压缩存储方法。
[0037] 如图1所示,图1为本发明实施例Redis复杂对象内存压缩存储方法的场景示意图,本发明实施例中Redis复杂对象内存压缩存储场景中包括服务器10和若干个用户服务器20,其中服务器10中集成有Redis复杂对象内存压缩存储装置,运行Redis复杂对象内存压缩存储方法对应的存储介质,以执行Redis复杂对象内存压缩存储方法的步骤。
[0038] 可以理解的是,图1所示Redis复杂对象内存压缩存储方法的具体应用场景中的服务器10,或者服务器10中包含的装置并不构成对本发明实施例的限制,即Redis复杂对象内存压缩存储方法的具体应用场景中包含的设备数量、设备种类,或者各个设备中包含的装置数量、装置种类不影响本发明实施例中技术方案整体实现,均可以算作本发明实施例要求保护技术方案的等效替换或衍生。
[0039] 本发明实施例中服务器10主要用于:获取待存储对象;其中,所述待存储对象中包括多条Redis字符串对象数据;将所述待存储对象中各条Redis字符串对象数据均转换成RedisHash对象数据,得到第一处理对象;将所述第一处理对象中各条RedisHash对象数据中的键值进行第一次哈希压缩,得到第二处理对象;将所述第二处理对象中各条RedisHash对象数据中包括RedisHash对象的字段键值进行第二次哈希压缩,得到第三处理对象;将所述第三处理对象中各条RedisHash对象数据中包括RedisHash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象;将所述第四处理对象中各条RedisHash对象数据均序列化成序列数组,得到第五处理对象并存储。
[0040] 本领域技术人员可以理解,图1中示出的应用环境,仅仅是与本发明方案一种应用场景,并不构成对本发明方案应用场景的限定,其他的应用环境还可以包括比图1中所示更多或更少的服务器10或用户服务器20,或者服务器10的网络连接关系,例如图1中仅示出1个服务器10,可以理解的,该Redis复杂对象内存压缩存储方法的具体应用场景还可以包括一个或多个其他服务器10,具体此处不作限定;该服务器10中还可以包括存储器。
[0041] 图2是本发明实施例提供的Redis复杂对象内存压缩存储方法的流程示意图。如图2所示,该方法包括以下步骤S110‑S160。
[0042] S110、获取待存储对象;其中,所述待存储对象中包括多条Redis字符串对象数据。
[0043] 在本实施例中,是以用户服务器为执行主体来描述技术方案。例如,以服务器是用于提供广告投放的媒体平台/投放平台为例,用户服务器则是接收媒体平台/投放平台所筛选数据的广告主所使用的服务器。由于媒体平台/投放平台基于预设筛选条件筛选出的待存储对象需要发送至用户服务器并存储在用户服务器本地,故为了降低待存储对象在用户服务器中占用的存储空间,可以对其进行多次压缩,从而降低待存储数据的存储成本。在对待存储对象进行存储时,可以先具体获取本次的待存储对象。例如,在服务器中是以一天为压缩存储周期来执行Redis复杂对象内存压缩存储方法,且更具体的可以设置每天的中午1点开始执行Redis复杂对象内存压缩存储方法。当然,也可以在服务器中设置每当接收到用户服务器的获取请求后,则开始执行Redis复杂对象内存压缩存储方法。
[0044] S120、将所述待存储对象中各条Redis字符串对象数据均转换成RedisHash对象数据,得到第一处理对象。
[0045] 在本实施例中,服务器中获取到的待存储对象是Redis字符串格式的数据,其初始是较占用存储空间的数据格式即Redis字符串格式。Redis字符串格式的数据中Redis键值数量大,Redis键值均采用RedisBucket(即Redis桶)存储时,Redis桶占用空间较大,造成了较多的内存消耗,将其转换成与其他格式(如本申请后续步骤中提及的RedisHash对象数据格式)的数据有利于减小数据所占内存空间。本申请中具体是将所述待存储对象中各条32
Redis字符串对象数据均转换成RedisHash对象数据,使得Redis桶占用内存数量由2 的数
25
量级减少到2 的数量级,从而实现数据的第一次压缩。
[0046] 其中,第一处理对象中包括的各条RedisHash对象数据中,其数据结构如图3所示,在第一处理对象中每一条RedisHash对象数据对应一个RedisHash对象的键值(即每一条RedisHash对象数据对应一个RedisHash对象的Key值)。而且每一条RedisHash对象数据中又包括若干组字段键值‑字段值的取值对,其中字段键值即RedisHash对象数据中的FieldKey值,字段值即RedisHash对象数据中的FieldValue值。若对第一处理对象中包括的各条RedisHash对象数据不继续进行压缩,仍占用了较大的存储空间,可以进一步进行数据压缩。
[0047] 在一实施例中,如图4所示,步骤S120包括:
[0048] S121、获取所述待存储对象中包括的第1个Redis字符串对象数据至第N个Redis字符串对象数据;其中,N表示所述待存储对象中Redis字符串对象数据的总个数;
[0049] S122、将第1个Redis字符串对象数据至第N个Redis字符串对象数据均基于哈希编码,得到与第1个Redis字符串对象数据至第N个Redis字符串对象数据分别对应的第1个RedisHash对象数据至第N个RedisHash对象数据,以组成所述第一处理对象。
[0050] 在本实施例中,若以所述待存储对象中包括N个Redis字符串对象数据,将原始为char[]类型(即字符串类型)的N个Redis字符串对象数据分别基于预设的哈希编码规则进行哈希编码,使得N个Redis字符串对象数据分别对应转换成第1个RedisHash对象数据至第N个RedisHash对象数据,以组成所述第一处理对象。可见,基于哈希编码改变数据存储类型,能初步减小待存储对象存储时占用的空间。
[0051] S130、将所述第一处理对象中各条RedisHash对象数据中的键值进行第一次哈希压缩,得到第二处理对象。
[0052] 在本实施例中,继续参考图3中RedisHash对象数据的数据结构,由于已将初始的各条Redis字符串对象数据分别转换成RedisHash对象数据,是进行了数据类型上的转换而实现初次压缩,故此时还可选择对各条RedisHash对象数据中的键值(即RedisHash对象的Key值)进行压缩以实现数据的二次压缩。具体的,将各条RedisHash对象数据中的键值进行哈希压缩,得到更新后的各条RedisHash对象数据,并组成第二处理对象。可见,一条RedisHash对象数据的Key值长度是32位,在对各条RedisHash对象数据中的键值进行压缩后,一条RedisHash对象数据的Key值长度则降为了8位,又一次实现了数据压缩。
[0053] 在一实施例中,如图5所示,步骤S130包括:
[0054] S131、获取所述第一处理对象的第i个RedisHash对象数据,及第i个Redis Hash对象数据对应的第i个键值;其中,i的初始取值为1,且i的取值范围是[1,N];
[0055] S132、将所述第i个键值通过预先存储的第一哈希算法进行哈希运算,得到第i个键值哈希值;其中,所述第一哈希算法为CRC32哈希算法;
[0056] S133、将第i个键值哈希值基于预设的第一定长数值取模,得到第i个键值压缩值,并以所述第i个键值压缩值更新所述第一处理对象中第i个RedisHash对象数据的第i个键值;
[0057] S134、将i自增1以更新i的取值;
[0058] S135、若确定i小于或等于N,则返回执行所述获取所述第一处理对象的第i个RedisHash对象数据,及第i个RedisHash对象数据对应的第i个键值的步骤;
[0059] S136、若确定i大于N,则获取更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,组成所述第二处理对象。
[0060] 在本实施例中,可以依照所述第一处理对象中各RedisHash对象数据的存储地址的先后顺序,依次将各RedisHash对象数据中的键值先基于CRC32哈希算法进行哈希压缩后再对所述第一定长数值取模,得到各RedisHash对象数据中更新后的键值。其中,CRC32哈希算法是CRC32类,且为32位的System.IO.Hashing算法(即系统输入输出哈希算法),其与MD5算法类似,但因其采用32位运算的,故结果更短一些且速度也更快。
[0061] 例如,先以对第一处理对象中第1个RedisHash对象数据对应的第1个键值的压缩过程为例来说明。先对第1个键值基于CRC32哈希算法得到第1个键值压缩值,并以所述第1个键值压缩值更新所述第一处理对象中第1个Redis Hash对象数据的第1个键值,从而实现了第1个键值的压缩。以此类推,之后的各RedisHash对象数据对应的键值均参考第1个键值的压缩过程进行压缩,从而得到更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,并组成所述第二处理对象。可见,基于对各条RedisHash对象数据中的键值进行压缩后,各条RedisHash对象数据的Key值长度从32位降为了8位,实现了数据的第二次压缩,节省了数据存储时占用的空间。
[0062] S140、将所述第二处理对象中各条RedisHash对象数据中包括RedisHash对象的字段键值进行第二次哈希压缩,得到第三处理对象。
[0063] 在本实施例中,继续参考图3中RedisHash对象数据的数据结构,由于已将各RedisHash对象数据的键值进行的第一次哈希压缩及取模运算,是进行了数据长度上的转换而实现第二次压缩,故此时还可选择对各条RedisHash对象数据中的字段键值(即RedisHash对象的FieldKey值)进行压缩以实现数据的第三次压缩。具体的,将各条RedisHash对象数据中的各字段键值通过第二哈希算法进行哈希压缩,得到更新后的各条RedisHash对象数据,并组成第三处理对象。可见,一条RedisHash对象数据的FieldKey值长度是32位,在对各条RedisHash对象数据中的FieldKey值进行压缩后,一条RedisHash对象数据的FieldKey值则降为了十六进制的8位字符串,又一次实现了数据压缩。
[0064] 在一实施例中,如图6所示,步骤S140包括:
[0065] S141、将所述第二处理对象中第i个RedisHash对象数据的第j个字段键值通过预先存储的第二哈希算法进行哈希运算,得到第i个RedisHash对象数据第j个键值哈希值;其中,j的初始取值为1,且j的取值范围是[1,M],M为第i个RedisHash对象数据中所包括RedisHash对象的总条数;所述第二哈希算法为Murmur32哈希算法;
[0066] S142、以第i个RedisHash对象数据第j个键值哈希值更新所述第二处理对象中第i个RedisHash对象数据的第j个字段键值;
[0067] S143、将j自增1以更新i的取值;
[0068] S144、若确定j小于或等于M,则返回执行所述将所述第二处理对象中第i个RedisHash对象数据的第j个字段键值通过预先存储的第二哈希算法进行哈希运算,得到第i个RedisHash对象数据第j个键值哈希值的步骤;
[0069] S145、若确定j大于M,则将j重置为1,将i自增1以更新i的取值;
[0070] S146、若确定i小于或等于N,则返回执行所述将所述第二处理对象中第i个RedisHash对象数据的第j个字段键值通过预先存储的第二哈希算法进行哈希运算,得到第i个RedisHash对象数据第j个键值哈希值的步骤;
[0071] S147、若确定i大于N,则获取更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,组成所述第三处理对象。
[0072] 在本实施例中,可以依照所述第二处理对象中各RedisHash对象数据的存储地址的先后顺序,依次将各RedisHash对象数据中的各字段键值先基于Murmur32哈希算法进行哈希运算后,得到各RedisHash对象数据中各字段键值更新后的字段键值。其中,Murmur32哈希算法是一种32位的非加密散列函数,适用于一般的基于散列的查找。
[0073] 例如,先以对第二处理对象中第1个RedisHash对象数据对应的第1个字段键值的压缩过程为例来说明。先对第1个RedisHash对象数据中第1个字段键值基于Murmur32哈希算法得到第1个RedisHash对象数据第1个键值哈希值,并以第1个RedisHash对象数据第1个键值哈希值更新所述第二处理对象中第1个RedisHash对象数据的第1个字段键值,从而实现了第1个字段键值的压缩。以此类推,之后的各RedisHash对象数据对应的字段键值均参考第1个Redis Hash对象数据中第1个字段键值的压缩过程进行压缩,从而得到更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,并组成所述第三处理对象。
可见,基于对各条RedisHash对象数据中的字段键值进行压缩后,各条RedisHash对象数据的FieldKey值长度从32位降为了8位,实现了数据的第三次压缩,再一次节省了数据存储时占用的空间。
[0074] S150、将所述第三处理对象中各条RedisHash对象数据中包括RedisHash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象。
[0075] 在本实施例中,继续参考图3中RedisHash对象数据的数据结构,由于已将各RedisHash对象数据的字段键值进行的第二次哈希压缩,也是进行了数据长度上的转换而实现第三次压缩,故此时还可选择对各条RedisHash对象数据中的各字段值(即RedisHash对象的FieldValue值)进行压缩以实现数据的第四次压缩。具体的,将各条RedisHash对象数据中的各字段值的数值放大预设倍数(如10000倍等倍数)及数据类型转换(如转换成字符串类型等)处理,得到更新后的各条RedisHash对象数据,并组成第四处理对象。可见,一条Redis Hash对象数据的FieldValue值长度是350位,在对各条RedisHash对象数据中的FieldValue值进行数值放大及数据类型转换处理以进行压缩后,一条Redis Hash对象数据的FieldValue值则降为了62位长度char[],又一次实现了数据压缩。
[0076] 在一实施例中,如图7所示,步骤S150包括:
[0077] S151、将所述第三处理对象中第i个RedisHash对象数据的第k个字段值乘以预设放大倍数及转换成字符串类型,得到第i个RedisHash对象数据第k个字符串字段值;其中,k的初始取值为1,且k的取值范围是[1,M];
[0078] S152、以第i个RedisHash对象数据第k个字符串字段值更新所述第三处理对象中第i个RedisHash对象数据的第k个字段值;
[0079] S153、将k自增1以更新k的取值;
[0080] S154、若确定k小于或等于M,则返回执行所述将所述第三处理对象中第i个RedisHash对象数据的第k个字段值乘以预设放大倍数及转换成字符串类型,得到第i个RedisHash对象数据第k个字符串字段值的步骤;
[0081] S155、若确定k大于M,则将k重置为1,将i自增1以更新i的取值;
[0082] S156、若确定i小于或等于N,则返回执行所述将所述第三处理对象中第i个RedisHash对象数据的第k个字段值乘以预设放大倍数及转换成字符串类型,得到第i个RedisHash对象数据第k个字符串字段值的步骤;
[0083] S157、若确定i大于N,则获取更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,组成所述第四处理对象。
[0084] 在本实施例中,可以依照所述第三处理对象中各RedisHash对象数据的存储地址的先后顺序,依次将各RedisHash对象数据中的各字段值先乘以预设放大倍数(如放大倍数设置为1000、5000、10000等自定义值的整数倍数)及转换成字符串类型后,得到各RedisHash对象数据中各字段值更新后的字段值。
[0085] 例如,先以对第三处理对象中第1个RedisHash对象数据对应的第1个字段值的压缩过程为例来说明。先对第1个RedisHash对象数据中第1个字段值先放大10000倍再转换成字符串类型的数据,得到第1个RedisHash对象数据第1个字符串字段值,并以第1个RedisHash对象数据第1个字符串字段值更新所述第三处理对象中第1个RedisHash对象数据的第1个字段值,从而实现了第1个字段值的压缩。以此类推,之后的各RedisHash对象数据对应的字段值均参考第1个RedisHash对象数据中第1个字段值的压缩过程进行压缩,从而得到更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,并组成所述第四处理对象。可见,基于对各条RedisHash对象数据中的字段值进行压缩后,各条RedisHash对象数据的FieldValue值长度从350位降为了62位,实现了数据的第四次压缩,又一次节省了数据存储时占用的空间。
[0086] S160、将所述第四处理对象中各条RedisHash对象数据均序列化成序列数组,得到第五处理对象并存储。
[0087] 在本实施例中,由于将所述第四处理对象中各条RedisHash对象数据的FieldKey值小于512位,且各条RedisHash对象数据的FieldValue小于64位,故采用将所述第四处理对象中各条RedisHash对象数据均序列化成序列数组,以ziplist存储能进一步再次压缩数据大小,再一次节省了数据存储时占用的空间。
[0088] 在一实施例中,如图8所示,步骤S160包括:
[0089] S161、获取所述第四处理对象中各条RedisHash对象数据的键值、字段键值及字段值串接,组成各条RedisHash对象数据对应的序列数组;
[0090] S162、基于各条RedisHash对象数据对应的序列数组组成所述第五处理对象并存储。
[0091] 在本实施例中,参考如图3中RedisHash对象数据的数据结构可知,每一行的RedisHash对象数据的键值、字段键值及字段值对应用户服务器中的一条数据(即一条广告流量数据),故可以将每一行且包括有RedisHash对象数据的键值、字段键值及字段值的数据串接后组成与每一行数据分别对应的序列数组(即byte[])。之后,再将各条RedisHash对象数据对应的序列数组组成所述第五处理对象并存储,以通过byte[]存储时能使用连续空间以有效减少空间碎片,从而增加Redis空间利用率。
[0092] 在一实施例中,步骤S160之后还包括:
[0093] 若检测到业务调用指令,将所述第五处理对象进行反序列化处理,还原得到所述第四处理对象。
[0094] 在本实施例中,由于服务器中已将待存储数据转换成序列化byte[]的形式存储,故当实际需要使用所述待存储数据进行业务调用及计算时,将所述第五处理对象进行反序列化处理,还原得到所述第四处理对象即可参与业务调用及计算。也即,通过上述方式实现了有实际数据使用需求时再还原数据,其他时候则是保持压缩存储状态。
[0095] 可见,该方法的实施例实现了对待存储对象的多次压缩处理,得到了最终占用存储空间减小的第五处理对象,降低了存储成本。
[0096] 图9是本发明实施例提供的一种Redis复杂对象内存压缩存储装置的示意性框图。如图9所示,对应于以上Redis复杂对象内存压缩存储方法,本发明还提供一种Redis复杂对象内存压缩存储装置。该Redis复杂对象内存压缩存储装置包括用于执行上述Redis复杂对象内存压缩存储方法的单元。请参阅图9,该Redis复杂对象内存压缩存储装置100包括:原始数据获取单元110、第一数据类型转换单元120、第一哈希压缩单元130、第二哈希压缩单元140、第二数据类型转换单元150和数据序列化单元160。
[0097] 原始数据获取单元110,用于获取待存储对象;其中,所述待存储对象中包括多条Redis字符串对象数据。
[0098] 在本实施例中,是以用户服务器为执行主体来描述技术方案。例如,以服务器是用于提供广告投放的媒体平台/投放平台为例,用户服务器则是接收媒体平台/投放平台所筛选数据的广告主所使用的服务器。由于媒体平台/投放平台基于预设筛选条件筛选出的待存储对象需要发送至用户服务器并存储在用户服务器本地,故为了降低待存储对象在用户服务器中占用的存储空间,可以对其进行多次压缩,从而降低待存储数据的存储成本。在对待存储对象进行存储时,可以先具体获取本次的待存储对象。例如,在服务器中是以一天为压缩存储周期来执行Redis复杂对象内存压缩存储方法,且更具体的可以设置每天的中午1点开始执行Redis复杂对象内存压缩存储方法。当然,也可以在服务器中设置每当接收到用户服务器的获取请求后,则开始执行Redis复杂对象内存压缩存储方法。
[0099] 第一数据类型转换单元120,用于将所述待存储对象中各条Redis字符串对象数据均转换成RedisHash对象数据,得到第一处理对象。
[0100] 在本实施例中,服务器中获取到的待存储对象是Redis字符串格式的数据,其初始是较占用存储空间的数据格式即Redis字符串格式。Redis字符串格式的数据中Redis键值数量大,Redis键值均采用RedisBucket(即Redis桶)存储时,Redis桶占用空间较大,造成了较多的内存消耗,将其转换成与其他格式(如本申请后续步骤中提及的RedisHash对象数据格式)的数据有利于减小数据所占内存空间。本申请中具体是将所述待存储对象中各条32
Redis字符串对象数据均转换成RedisHash对象数据,使得Redis桶占用内存数量由2 的数
25
量级减少到2 的数量级,从而实现数据的第一次压缩。
[0101] 其中,第一处理对象中包括的各条RedisHash对象数据中,其数据结构如图3所示,在第一处理对象中每一条RedisHash对象数据对应一个RedisHash对象的键值(即每一条RedisHash对象数据对应一个RedisHash对象的Key值)。而且每一条RedisHash对象数据中又包括若干组字段键值‑字段值的取值对,其中字段键值即RedisHash对象数据中的FieldKey值,字段值即RedisHash对象数据中的FieldValue值。若对第一处理对象中包括的各条RedisHash对象数据不继续进行压缩,仍占用了较大的存储空间,可以进一步进行数据压缩。
[0102] 在一实施例中,第一数据类型转换单元120还用于:
[0103] 获取所述待存储对象中包括的第1个Redis字符串对象数据至第N个Redis字符串对象数据;其中,N表示所述待存储对象中Redis字符串对象数据的总个数;
[0104] 将第1个Redis字符串对象数据至第N个Redis字符串对象数据均基于哈希编码,得到与第1个Redis字符串对象数据至第N个Redis字符串对象数据分别对应的第1个RedisHash对象数据至第N个RedisHash对象数据,以组成所述第一处理对象。
[0105] 在本实施例中,若以所述待存储对象中包括N个Redis字符串对象数据,将原始为char[]类型(即字符串类型)的N个Redis字符串对象数据分别基于预设的哈希编码规则进行哈希编码,使得N个Redis字符串对象数据分别对应转换成第1个RedisHash对象数据至第N个RedisHash对象数据,以组成所述第一处理对象。可见,基于哈希编码改变数据存储类型,能初步减小待存储对象存储时占用的空间。
[0106] 第一哈希压缩单元130,用于将所述第一处理对象中各条RedisHash对象数据中的键值进行第一次哈希压缩,得到第二处理对象。
[0107] 在本实施例中,继续参考图3中RedisHash对象数据的数据结构,由于已将初始的各条Redis字符串对象数据分别转换成RedisHash对象数据,是进行了数据类型上的转换而实现初次压缩,故此时还可选择对各条RedisHash对象数据中的键值(即RedisHash对象的Key值)进行压缩以实现数据的二次压缩。具体的,将各条RedisHash对象数据中的键值进行哈希压缩,得到更新后的各条RedisHash对象数据,并组成第二处理对象。可见,一条RedisHash对象数据的Key值长度是32位,在对各条RedisHash对象数据中的键值进行压缩后,一条RedisHash对象数据的Key值长度则降为了8位,又一次实现了数据压缩。
[0108] 在一实施例中,第一哈希压缩单元130还用于:
[0109] 获取所述第一处理对象的第i个RedisHash对象数据,及第i个RedisHash对象数据对应的第i个键值;其中,i的初始取值为1,且i的取值范围是[1,N];
[0110] 将所述第i个键值通过预先存储的第一哈希算法进行哈希运算,得到第i个键值哈希值;其中,所述第一哈希算法为CRC32哈希算法;
[0111] 将第i个键值哈希值基于预设的第一定长数值取模,得到第i个键值压缩值,并以所述第i个键值压缩值更新所述第一处理对象中第i个RedisHash对象数据的第i个键值;
[0112] 将i自增1以更新i的取值;
[0113] 若确定i小于或等于N,则返回执行所述获取所述第一处理对象的第i个RedisHash对象数据,及第i个RedisHash对象数据对应的第i个键值的步骤;
[0114] 若确定i大于N,则获取更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,组成所述第二处理对象。
[0115] 在本实施例中,可以依照所述第一处理对象中各RedisHash对象数据的存储地址的先后顺序,依次将各RedisHash对象数据中的键值先基于CRC32哈希算法进行哈希压缩后再对所述第一定长数值取模,得到各RedisHash对象数据中更新后的键值。其中,CRC32哈希算法是CRC32类,且为32位的System.IO.Hashing算法(即系统输入输出哈希算法),其与MD5算法类似,但因其采用32位运算的,故结果更短一些且速度也更快。
[0116] 例如,先以对第一处理对象中第1个RedisHash对象数据对应的第1个键值的压缩过程为例来说明。先对第1个键值基于CRC32哈希算法得到第1个键值压缩值,并以所述第1个键值压缩值更新所述第一处理对象中第1个Redis Hash对象数据的第1个键值,从而实现了第1个键值的压缩。以此类推,之后的各RedisHash对象数据对应的键值均参考第1个键值的压缩过程进行压缩,从而得到更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,并组成所述第二处理对象。可见,基于对各条RedisHash对象数据中的键值进行压缩后,各条RedisHash对象数据的Key值长度从32位降为了8位,实现了数据的第二次压缩,节省了数据存储时占用的空间。
[0117] 第二哈希压缩单元140,用于将所述第二处理对象中各条RedisHash对象数据中包括RedisHash对象的字段键值进行第二次哈希压缩,得到第三处理对象。
[0118] 在本实施例中,继续参考图3中RedisHash对象数据的数据结构,由于已将各RedisHash对象数据的键值进行的第一次哈希压缩及取模运算,是进行了数据长度上的转换而实现第二次压缩,故此时还可选择对各条RedisHash对象数据中的字段键值(即RedisHash对象的FieldKey值)进行压缩以实现数据的第三次压缩。具体的,将各条RedisHash对象数据中的各字段键值通过第二哈希算法进行哈希压缩,得到更新后的各条RedisHash对象数据,并组成第三处理对象。可见,一条RedisHash对象数据的FieldKey值长度是32位,在对各条RedisHash对象数据中的FieldKey值进行压缩后,一条RedisHash对象数据的FieldKey值则降为了十六进制的8位字符串,又一次实现了数据压缩。
[0119] 在一实施例中,第二哈希压缩单元140还用于:
[0120] 将所述第二处理对象中第i个RedisHash对象数据的第j个字段键值通过预先存储的第二哈希算法进行哈希运算,得到第i个RedisHash对象数据第j个键值哈希值;其中,j的初始取值为1,且j的取值范围是[1,M],M为第i个Redis Hash对象数据中所包括RedisHash对象的总条数;所述第二哈希算法为Murmur32哈希算法;
[0121] 以第i个RedisHash对象数据第j个键值哈希值更新所述第二处理对象中第i个RedisHash对象数据的第j个字段键值;
[0122] 将j自增1以更新i的取值;
[0123] 若确定j小于或等于M,则返回执行所述将所述第二处理对象中第i个Redis Hash对象数据的第j个字段键值通过预先存储的第二哈希算法进行哈希运算,得到第i个RedisHash对象数据第j个键值哈希值的步骤;
[0124] 若确定j大于M,则将j重置为1,将i自增1以更新i的取值;
[0125] 若确定i小于或等于N,则返回执行所述将所述第二处理对象中第i个Redis Hash对象数据的第j个字段键值通过预先存储的第二哈希算法进行哈希运算,得到第i个RedisHash对象数据第j个键值哈希值的步骤;
[0126] 若确定i大于N,则获取更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,组成所述第三处理对象。
[0127] 在本实施例中,可以依照所述第二处理对象中各RedisHash对象数据的存储地址的先后顺序,依次将各RedisHash对象数据中的各字段键值先基于Murmur32哈希算法进行哈希运算后,得到各RedisHash对象数据中各字段键值更新后的字段键值。其中,Murmur32哈希算法是一种32位的非加密散列函数,适用于一般的基于散列的查找。
[0128] 例如,先以对第二处理对象中第1个RedisHash对象数据对应的第1个字段键值的压缩过程为例来说明。先对第1个RedisHash对象数据中第1个字段键值基于Murmur32哈希算法得到第1个RedisHash对象数据第1个键值哈希值,并以第1个RedisHash对象数据第1个键值哈希值更新所述第二处理对象中第1个RedisHash对象数据的第1个字段键值,从而实现了第1个字段键值的压缩。以此类推,之后的各RedisHash对象数据对应的字段键值均参考第1个Redis Hash对象数据中第1个字段键值的压缩过程进行压缩,从而得到更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,并组成所述第三处理对象。
可见,基于对各条RedisHash对象数据中的字段键值进行压缩后,各条RedisHash对象数据的FieldKey值长度从32位降为了8位,实现了数据的第三次压缩,再一次节省了数据存储时占用的空间。
[0129] 第二数据类型转换单元150,用于将所述第三处理对象中各条RedisHash对象数据中包括RedisHash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象。
[0130] 在本实施例中,继续参考图3中RedisHash对象数据的数据结构,由于已将各RedisHash对象数据的字段键值进行的第二次哈希压缩,也是进行了数据长度上的转换而实现第三次压缩,故此时还可选择对各条RedisHash对象数据中的各字段值(即RedisHash对象的FieldValue值)进行压缩以实现数据的第四次压缩。具体的,将各条RedisHash对象数据中的各字段值的数值放大预设倍数(如10000倍等倍数)及数据类型转换(如转换成字符串类型等)处理,得到更新后的各条RedisHash对象数据,并组成第四处理对象。可见,一条Redis Hash对象数据的FieldValue值长度是350位,在对各条RedisHash对象数据中的FieldValue值进行数值放大及数据类型转换处理以进行压缩后,一条Redis Hash对象数据的FieldValue值则降为了62位长度char[],又一次实现了数据压缩。
[0131] 在一实施例中,第二数据类型转换单元150还用于:
[0132] 将所述第三处理对象中第i个RedisHash对象数据的第k个字段值乘以预设放大倍数及转换成字符串类型,得到第i个RedisHash对象数据第k个字符串字段值;其中,k的初始取值为1,且k的取值范围是[1,M];
[0133] 以第i个RedisHash对象数据第k个字符串字段值更新所述第三处理对象中第i个RedisHash对象数据的第k个字段值;
[0134] 将k自增1以更新k的取值;
[0135] 若确定k小于或等于M,则返回执行所述将所述第三处理对象中第i个Redis Hash对象数据的第k个字段值乘以预设放大倍数及转换成字符串类型,得到第i个RedisHash对象数据第k个字符串字段值的步骤;
[0136] 若确定k大于M,则将k重置为1,将i自增1以更新i的取值;
[0137] 若确定i小于或等于N,则返回执行所述将所述第三处理对象中第i个Redis Hash对象数据的第k个字段值乘以预设放大倍数及转换成字符串类型,得到第i个RedisHash对象数据第k个字符串字段值的步骤;
[0138] 若确定i大于N,则获取更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,组成所述第四处理对象。
[0139] 在本实施例中,可以依照所述第三处理对象中各RedisHash对象数据的存储地址的先后顺序,依次将各RedisHash对象数据中的各字段值先乘以预设放大倍数(如放大倍数设置为1000、5000、10000等自定义值的整数倍数)及转换成字符串类型后,得到各RedisHash对象数据中各字段值更新后的字段值。
[0140] 例如,先以对第三处理对象中第1个RedisHash对象数据对应的第1个字段值的压缩过程为例来说明。先对第1个RedisHash对象数据中第1个字段值先放大10000倍再转换成字符串类型的数据,得到第1个RedisHash对象数据第1个字符串字段值,并以第1个RedisHash对象数据第1个字符串字段值更新所述第三处理对象中第1个RedisHash对象数据的第1个字段值,从而实现了第1个字段值的压缩。以此类推,之后的各RedisHash对象数据对应的字段值均参考第1个RedisHash对象数据中第1个字段值的压缩过程进行压缩,从而得到更新后的第1个RedisHash对象数据至更新后的第N个RedisHash对象数据,并组成所述第四处理对象。可见,基于对各条RedisHash对象数据中的字段值进行压缩后,各条RedisHash对象数据的FieldValue值长度从350位降为了62位,实现了数据的第四次压缩,又一次节省了数据存储时占用的空间。
[0141] 数据序列化单元160,用于将所述第四处理对象中各条RedisHash对象数据均序列化成序列数组,得到第五处理对象并存储。
[0142] 在本实施例中,由于将所述第四处理对象中各条RedisHash对象数据的FieldKey值小于512位,且各条RedisHash对象数据的FieldValue小于64位,故采用将所述第四处理对象中各条RedisHash对象数据均序列化成序列数组,以ziplist存储能进一步再次压缩数据大小,再一次节省了数据存储时占用的空间。
[0143] 在一实施例中,数据序列化单元160还用于:
[0144] 获取所述第四处理对象中各条RedisHash对象数据的键值、字段键值及字段值串接,组成各条RedisHash对象数据对应的序列数组;
[0145] 基于各条RedisHash对象数据对应的序列数组组成所述第五处理对象并存储。
[0146] 在本实施例中,参考如图3中RedisHash对象数据的数据结构可知,每一行的RedisHash对象数据的键值、字段键值及字段值对应用户服务器中的一条数据(即一条广告流量数据),故可以将每一行且包括有RedisHash对象数据的键值、字段键值及字段值的数据串接后组成与每一行数据分别对应的序列数组(即byte[])。之后,再将各条RedisHash对象数据对应的序列数组组成所述第五处理对象并存储,以通过byte[]存储时能使用连续空间以有效减少空间碎片,从而增加Redis空间利用率。
[0147] 在一实施例中,Redis复杂对象内存压缩存储装置100还包括:
[0148] 反序列化处理单元,用于若检测到业务调用指令,将所述第五处理对象进行反序列化处理,还原得到所述第四处理对象。
[0149] 在本实施例中,由于服务器中已将待存储数据转换成序列化byte[]的形式存储,故当实际需要使用所述待存储数据进行业务调用及计算时,将所述第五处理对象进行反序列化处理,还原得到所述第四处理对象即可参与业务调用及计算。也即,通过上述方式实现了有实际数据使用需求时再还原数据,其他时候则是保持压缩存储状态。
[0150] 可见,该装置的实施例实现了对待存储对象的多次压缩处理,得到了最终占用存储空间减小的第五处理对象,降低了存储成本。
[0151] 需要说明的是,所属领域的技术人员可以清楚地了解到,上述Redis复杂对象内存压缩存储装置和各单元的具体实现过程,可以参考前述方法实施例中的相应描述,为了描述的方便和简洁,在此不再赘述。
[0152] 上述Redis复杂对象内存压缩存储装置可以实现为一种计算机程序的形式,该计算机程序可以在如图10所示的计算机设备上运行。
[0153] 请参阅图10,图10是本发明实施例提供的一种计算机设备的示意性框图。该计算机设备集成了本发明实施例所提供的任一种Redis复杂对象内存压缩存储装置。
[0154] 参阅图10,该计算机设备包括通过系统总线401连接的处理器402、存储器和网络接口405,其中,存储器可以包括存储介质403和内存储器404。
[0155] 该存储介质403可存储操作系统4031和计算机程序4032。该计算机程序4032包括程序指令,该程序指令被执行时,可使得处理器402执行一种Redis复杂对象内存压缩存储方法。
[0156] 该处理器402用于提供计算和控制能力,以支撑整个计算机设备的运行。
[0157] 该内存储器404为存储介质403中的计算机程序4032的运行提供环境,该计算机程序4032被处理器402执行时,可使得处理器402执行上述的Redis复杂对象内存压缩存储方法。
[0158] 该网络接口405用于与其它设备进行网络通信。本领域技术人员可以理解,图10中示出的结构,仅仅是与本发明方案相关的部分结构的框图,并不构成对本发明方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
[0159] 其中,所述处理器402用于运行存储在存储器中的计算机程序4032,以实现如下步骤:
[0160] 获取待存储对象;其中,所述待存储对象中包括多条Redis字符串对象数据;
[0161] 将所述待存储对象中各条Redis字符串对象数据均转换成RedisHash对象数据,得到第一处理对象;
[0162] 将所述第一处理对象中各条RedisHash对象数据中的键值进行第一次哈希压缩,得到第二处理对象;
[0163] 将所述第二处理对象中各条RedisHash对象数据中包括RedisHash对象的字段键值进行第二次哈希压缩,得到第三处理对象;
[0164] 将所述第三处理对象中各条RedisHash对象数据中包括RedisHash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象;
[0165] 将所述第四处理对象中各条RedisHash对象数据均序列化成序列数组,得到第五处理对象并存储。
[0166] 应当理解,在本发明实施例中,处理器402可以是中央处理单元(Central ProcessingUnit,CPU),该处理器402还可以是其他通用处理器、数字信号处理器(DigitalSignalProcessor,DSP)、专用集成电路(ApplicationSpecific IntegratedCircuit,ASIC)、现成可编程门阵列(Field‑ProgrammableGateArray,FPGA)或者其他可编程逻辑器件、分立门或者晶体管逻辑器件、分立硬件组件等。其中,通用处理器可以是微处理器或者该处理器也可以是任何常规的处理器等。
[0167] 本领域普通技术人员可以理解的是实现上述实施例的方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成。该计算机程序包括程序指令,计算机程序可存储于一存储介质中,该存储介质为计算机可读存储介质。该程序指令被该计算机系统中的至少一个处理器执行,以实现上述方法的实施例的流程步骤。
[0168] 因此,本发明还提供一种存储介质。该存储介质可以为计算机可读存储介质。该计算机可读存储介质可以是存储介质,也可以是易失性存储介质。该存储介质存储有计算机程序,其中计算机程序包括程序指令。该程序指令被处理器执行时使处理器执行如下步骤:
[0169] 获取待存储对象;其中,所述待存储对象中包括多条Redis字符串对象数据;
[0170] 将所述待存储对象中各条Redis字符串对象数据均转换成RedisHash对象数据,得到第一处理对象;
[0171] 将所述第一处理对象中各条RedisHash对象数据中的键值进行第一次哈希压缩,得到第二处理对象;
[0172] 将所述第二处理对象中各条RedisHash对象数据中包括RedisHash对象的字段键值进行第二次哈希压缩,得到第三处理对象;
[0173] 将所述第三处理对象中各条RedisHash对象数据中包括RedisHash对象的字段值进行数值放大及数据类型转换处理,得到第四处理对象;
[0174] 将所述第四处理对象中各条RedisHash对象数据均序列化成序列数组,得到第五处理对象并存储。
[0175] 所述存储介质可以是U盘、移动硬盘、只读存储器(Read‑OnlyMemory,ROM)、磁碟或者光盘等各种可以存储程序代码的计算机可读存储介质。
[0176] 本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
[0177] 在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的。例如,各个单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。
[0178] 本发明实施例方法中的步骤可以根据实际需要进行顺序调整、合并和删减。本发明实施例装置中的单元可以根据实际需要进行合并、划分和删减。另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以是两个或两个以上单元集成在一个单元中。
[0179] 该集成的单元如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分,或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,终端,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。
[0180] 以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到各种等效的修改或替换,这些修改或替换都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以权利要求的保护范围为准。