首页 / 专利库 / 电信 / 节点 / 基于Redis集群的数据均匀缓存方法、装置、终端及存储介质

基于Redis集群的数据均匀缓存方法、装置、终端及存储介质

阅读:1046发布:2020-05-29

专利汇可以提供基于Redis集群的数据均匀缓存方法、装置、终端及存储介质专利检索,专利查询,专利分析的服务。并且本 发明 提供一种基于Redis集群的数据均匀缓存方法,包括:初始化set数组;关联所述set数组的索引与Redis集群中的存储 节点 ;当接收到数据的缓存指令时,计算所述数据的哈希值;对所述哈希值与最大int型数据进行逻辑与运算;对进行逻辑与运算后的结果与所述set数组的长度进行求余运算得到key值;从所述set数组中匹配出与所述key值相同的目标索引;将所述key值对应的数据存储在与所述目标索引对应的存储节点中。本发明还提供一种基于Redis集群的数据均匀缓存装置、终端及存储介质。本发明能够将数据均匀的缓存在Redis集群中,避免了Redis集群中的一个存储节点的内存使用完了,其他存储节点的内存还有大量空闲。,下面是基于Redis集群的数据均匀缓存方法、装置、终端及存储介质专利的具体信息内容。

1.一种基于Redis集群的数据均匀缓存方法,其特征在于,所述方法包括:
初始化set数组;
关联所述set数组的索引与Redis集群中的存储节点
当接收到数据的缓存指令时,计算所述数据的哈希值;
对所述哈希值与最大int型数据进行逻辑与运算;
对进行逻辑与运算后的结果与所述set数组的长度进行求余运算得到key值;
从所述set数组中匹配出与所述key值相同的目标索引;
将所述key值对应的数据存储在与所述目标索引对应的存储节点中。
2.如权利要求1所述的方法,其特征在于,所述初始化set数组包括:
获取所述Redis集群中存储节点的数量;
根据所述数量确定所述set数组的长度范围;
获取所述Redis集群中存储节点的性能;
当所述性能大于预设性能阈值时,确定所述set数组的长度为所述长度范围中的最大值;
当所述性能小于预设性能阈值时,确定所述set数组的长度为所述长度范围中的中间值,其中,所述中间值是指处于所述长度范围中间区域中的任意一个值。
3.如权利要求1所述的方法,其特征在于,所述关联所述set数组的索引与Redis集群中的存储节点包括:
计算所述set数组的每个索引的第一哈希值;
计算所述Redis集群中的每个存储节点的第二哈希值;
匹配与所述第二哈希值相同的目标第一哈希值;
将所述目标第一哈希值对应的set数组的索引与所述第二哈希值对应的存储节点进行关联。
4.如权利要求3所述的方法,其特征在于,所述计算所述Redis集群中的每个存储节点的第二哈希值包括:
获取所述Redis集群中的每个存储节点的标识,其中,所述标识为存储节点的IP地址或者存储节点的主机名称;
根据所述标识计算第二哈希值。
5.如权利要求1所述的方法,其特征在于,所述当接收到数据的缓存指令时,计算所述数据的哈希值包括:
当接收到数据的缓存指令时,逐行读取所述数据中的每行数据的键值;
计算每行数据的键值的哈希值。
6.如权利要求1所述的方法,其特征在于,在所述对所述哈希值与最大int型数据进行逻辑与运算之后,所述方法还包括:
判断进行逻辑与运算后的结果是否为-2147483648;
当进行逻辑与运算后的结果为-2147483648时,将所述结果确定为2147483647;
当进行逻辑与运算后的结果不为-2147483648时,将所述结果确定为进行逻辑与运算后的绝对值。
7.如权利要求1至6中任意一项所述的方法,其特征在于,所述方法还可以包括:
当接收到所述数据的读取指令时,获取所述set数组的所有索引;
获取所述Redis集群中与每个索引对应的存储节点;
按照所述索引的顺序依次读取与每个索引对应的存储节点中的数据;
连接所读取的数据并显示。
8.一种基于Redis集群的数据均匀缓存装置,其特征在于,所述装置包括:
初始化模,用于初始化set数组;
索引关联模块,用于关联所述set数组的索引与Redis集群中的存储节点;
哈希计算模块,用于当接收到数据的缓存指令时,计算所述数据的哈希值;
逻辑运算模块,用于对所述哈希值与最大int型数据进行逻辑与运算;
求余运算模块,用于对进行逻辑与运算后的结果与所述set数组的长度进行求余运算得到key值;
索引匹配模块,用于从所述set数组中匹配出与所述key值相同的目标索引;
数据存储模块,用于将所述key值对应的数据存储在与所述目标索引对应的存储节点中。
9.一种终端,其特征在于,所述终端包括处理器,所述处理器用于执行存储器中存储的计算机程序时实现如权利要求1至7中任意一项所述基于Redis集群的数据均匀缓存方法。
10.一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现如权利要求1至7中任意一项所述基于Redis集群的数据均匀缓存方法。

说明书全文

基于Redis集群的数据均匀缓存方法、装置、终端及存储介质

技术领域

[0001] 本发明涉及数据缓存技术领域,具体涉及一种基于Redis集群的数据均匀缓存方法、装置、终端及存储介质。

背景技术

[0002] 随着信息技术的快速发展,现代社会信息量呈爆炸式增长,在大数据时代的今天应用数据体积激增,传统的数据架构已经不能满足大型互联网应用的高并发、高可用、优质响应时间等需求。由此产生了一系列的例如NoSQL的解决方案,其中远程数据服务(Remote Dictionary Server,Redis)作为优质的选择之一,渐渐被各大企业采用作为其数据架构的补充。
[0003] Redis集群缓存数据是通过每一个key值进行一致hash算法得到数据应该放入那个节点,一致性hash算法将整个hash值空间组织成一个虚拟的圆环,整个空间按顺时针方向组织,下一步将各个master节点进行hash。这样就能确定每个节点在其哈希环上的位置。然而,这种方式存在当某一个key有大量数据时,导致同一个key的大量数据存储在一个master节点,该master节点的内存被使用完,其他的master节点的内存还有大量空闲。内存被使用完的master节点超出自身承受能,引起性能下降甚至造成数据不可用,同时内存还有大量空闲的master节点无法服务其他数据请求,造成资源浪费。
[0004] 因此,有必要提供一种基于Redis集群的数据均匀缓存的方案,使得Redis集群中的各个master节点的内存使用均匀。

发明内容

[0005] 鉴于以上内容,有必要提出一种基于Redis集群的数据均匀缓存方法、装置、终端及存储介质,能够将数据均匀的缓存在Redis集群中。
[0006] 本发明的第一方面提供一种基于Redis集群的数据均匀缓存方法,所述方法包括:
[0007] 初始化set数组;
[0008] 关联所述set数组的索引与Redis集群中的存储节点;
[0009] 当接收到数据的缓存指令时,计算所述数据的哈希值;
[0010] 对所述哈希值与最大int型数据进行逻辑与运算;
[0011] 对进行逻辑与运算后的结果与所述set数组的长度进行求余运算得到key值;
[0012] 从所述set数组中匹配出与所述key值相同的目标索引;
[0013] 将所述key值对应的数据存储在与所述目标索引对应的存储节点中。
[0014] 根据本发明的一个优选实施例,所述初始化set数组包括:
[0015] 获取所述Redis集群中存储节点的数量;
[0016] 根据所述数量确定所述set数组的长度范围;
[0017] 获取所述Redis集群中存储节点的性能;
[0018] 当所述性能大于预设性能阈值时,确定所述set数组的长度为所述长度范围中的最大值;
[0019] 当所述性能小于预设性能阈值时,确定所述set数组的长度为所述长度范围中的中间值,其中,所述中间值是指处于所述长度范围中间区域中的任意一个值。
[0020] 根据本发明的一个优选实施例,所述关联所述set数组的索引与Redis集群中的存储节点包括:
[0021] 计算所述set数组的每个索引的第一哈希值;
[0022] 计算所述Redis集群中的每个存储节点的第二哈希值;
[0023] 匹配与所述第二哈希值相同的目标第一哈希值;
[0024] 将所述目标第一哈希值对应的set数组的索引与所述第二哈希值对应的存储节点进行关联。
[0025] 根据本发明的一个优选实施例,所述计算所述Redis集群中的每个存储节点的第二哈希值包括:
[0026] 获取所述Redis集群中的每个存储节点的标识,其中,所述标识为存储节点的IP地址或者存储节点的主机名称;
[0027] 根据所述标识计算第二哈希值。
[0028] 根据本发明的一个优选实施例,所述当接收到数据的缓存指令时,计算所述数据的哈希值包括:
[0029] 当接收到数据的缓存指令时,逐行读取所述数据中的每行数据的键值;
[0030] 计算每行数据的键值的哈希值。
[0031] 根据本发明的一个优选实施例,在所述对所述哈希值与最大int型数据进行逻辑与运算之后,所述方法还包括:
[0032] 判断进行逻辑与运算后的结果是否为-2147483648;
[0033] 当进行逻辑与运算后的结果为-2147483648时,将所述结果确定为2147483647;
[0034] 当进行逻辑与运算后的结果不为-2147483648时,将所述结果确定为进行逻辑与运算后的绝对值。
[0035] 根据本发明的一个优选实施例,所述方法还可以包括:
[0036] 当接收到所述数据的读取指令时,获取所述set数组的所有索引;
[0037] 获取所述Redis集群中与每个索引对应的存储节点;
[0038] 按照所述索引的顺序依次读取与每个索引对应的存储节点中的数据;
[0039] 连接所读取的数据并显示。
[0040] 本发明的第二方面提供一种基于Redis集群的数据均匀缓存装置,所述装置包括:
[0041] 初始化模,用于初始化set数组;
[0042] 索引关联模块,用于关联所述set数组的索引与Redis集群中的存储节点;
[0043] 哈希计算模块,用于当接收到数据的缓存指令时,计算所述数据的哈希值;
[0044] 逻辑运算模块,用于对所述哈希值与最大int型数据进行逻辑与运算;
[0045] 求余运算模块,用于对进行逻辑与运算后的结果与所述set数组的长度进行求余运算得到key值;
[0046] 索引匹配模块,用于从所述set数组中匹配出与所述key值相同的目标索引;
[0047] 数据存储模块,用于将所述key值对应的数据存储在与所述目标索引对应的存储节点中。
[0048] 本发明的第三方面提供一种终端,所述终端包括处理器,所述处理器用于执行存储器中存储的计算机程序时实现所述基于Redis集群的数据均匀缓存方法。
[0049] 本发明的第四方面提供一种计算机可读存储介质,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现所述基于Redis集群的数据均匀缓存方法。
[0050] 综上所述,本发明所述的基于Redis集群的数据均匀缓存方法、装置、终端及存储介质,通过初始化set数组,将set数组的索引与Redis集群中的存储节点建立关联关系,对于要缓存的数据,则计算每个数据的哈希值,对每一个哈希值与最大int型数据进行逻辑与运算再与set数据的长度进行求余运算得到key值正好对应set数组的索引,如此便能够匹配出与每个key值相同的所述set数组的目标索引,进而确定与目标索引对应的目标存储节点,最后将所述key值对应的数据存储在所述目标存储节点中。在保证缓存数据不会重复的基础上,还保证了大数据量在Redis集群上的均匀分布。此外,以数据的key(键)为对象计算哈希值,能够将具有相同key的数据存储在同一个存储节点中,具有不同key的数据存储在不同的存储节点中;而结合Redis集群的规模和存储节点的性能综合考虑初始化set数组的长度,不仅使得Redis集群数据分布均匀,还不会影响数据写入和读取的速度。附图说明
[0051] 为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0052] 图1是本发明实施例一提供的基于Redis集群的数据均匀缓存方法的流程图
[0053] 图2是本发明实施例二提供的基于Redis集群的数据均匀缓存装置的结构图。
[0054] 图3是本发明实施例三提供的终端的结构示意图。
[0055] 如下具体实施方式将结合上述附图进一步说明本发明。

具体实施方式

[0056] 为了能够更清楚地理解本发明的上述目的、特征和优点,下面结合附图和具体实施例对本发明进行详细描述。需要说明的是,在不冲突的情况下,本发明的实施例及实施例中的特征可以相互组合。
[0057] 在下面的描述中阐述了很多具体细节以便于充分理解本发明,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0058] 除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。
[0059] 实施例一
[0060] 图1是本发明实施例一提供的基于Redis集群的数据均匀缓存方法的流程图。
[0061] 在本实施例中,所述基于Redis集群的数据均匀缓存方法可以应用于终端中,对于需要进行基于Redis集群的数据均匀缓存的终端,可以直接在终端上集成本发明的方法所提供的基于Redis集群的数据均匀缓存的功能,或者以软件开发工具包(Software Development Kit,SKD)的形式运行在终端中。
[0062] 如图1所示,所述基于Redis集群的数据均匀缓存方法具体包括以下步骤,根据不同的需求,该流程图中步骤的顺序可以改变,某些可以省略。
[0063] S11,初始化set数组。
[0064] Redis可以在不同的物理机或者同一个物理机用不同的端口启动服务实例,作为一致性哈希环中的存储节点。每一个存储节点按照物理机的实际内存作设置。一致性哈希是把数据和虚拟节点全部映射到0-231的数值空间上,同时将这数值空间首尾相连作为哈希环。对虚拟节点进行哈希运算,会映射到哈希环上的一个数字,将这个数字与虚拟节点的对应关系保存下来就是哈希映射表。
[0065] 初始化时,除了初始化一个set数组,可以为Redis集群设置一个主节点Master,用于管理Redis集群的元数据,维护一致性哈希映射表,例如,维护set数组与存储节点之间的关联关系,其他Redis启动的服务实例将作为数据存储的从属节点Slave,负责数据的管理与存储,维护本节点实例状态,对Master节点进行数据和状态交互。
[0066] 在一个优选的实施例中,所述初始化set数组包括:
[0067] 获取所述Redis集群中存储节点的数量;
[0068] 根据所述数量确定所述set数组的长度范围;
[0069] 获取所述Redis集群中存储节点的性能;
[0070] 当所述性能大于预设性能阈值时,确定所述set数组的长度为所述长度范围中的最大值;
[0071] 当所述性能小于预设性能阈值时,确定所述set数组的长度为所述长度范围中的中间值,其中,所述中间值是指处于所述长度范围中间区域中的任意一个值。
[0072] 在该可选的实施例中,初始化set数组的长度越长,后续将数据存储在Redis集群将会越均匀。但set数组的长度太长,而存储节点的性能较低时,虽然使得Redis集群数据分布越均匀,但写入和读取的速度也会越慢。因而需要结合Redis集群的规模和存储节点的性能综合考虑初始化set数组的长度。
[0073] 假设Redis集群中存储节点的数量为N,set数组的长度为L,则可能分配给每个存储节点的set数组的索引的个数M=L/N。M的范围可以取值N/2-2N,L的范围则取值为N2/2-2N2。若存储节点的性能较优(大于预设性能阈值),则M可以取大点,对应的set数组的长度也会较长,可以取范围中的最大值2N2。若存储节点的性能较差(小于预设性能阈值),则M可
2
以取小点,对应的set数组的长度也会较短,可以取范围中的中间值N。
[0074] 其中,所述中间值不是指处于长度范围最中间的一个值,而是指处于长度范围中间区域中的任意一个值。所述中间区域可以是预先设定的处于所述长度范围的1/4-3/4之间的区域。
[0075] 示例性的,假设Redis集群中存储节点的数量N=6,分配给每个存储节点的set数组的索引的个数M=6,则set数组的长度L=6*6=36。
[0076] S12,关联所述set数组的索引与Redis集群中的存储节点。
[0077] 本实施例中,初始化set数组后,为set数组的索引与Redis集群中的存储节点之间建立关联关系,并存储所述关联关系。
[0078] 在一个优选的实施例中,所述关联所述set数组的索引与Redis集群中的存储节点包括:
[0079] 计算所述set数组的每个索引的第一哈希值;
[0080] 计算所述Redis集群中的每个存储节点的第二哈希值;
[0081] 匹配与所述第二哈希值相同的目标第一哈希值;
[0082] 将所述目标第一哈希值对应的set数组的索引与所述第二哈希值对应的存储节点进行关联。
[0083] 在该可选的实施例中,可以根据set数组的索引的名称来计算set数组的索引的哈希值。通过哈希计算,能将set数组的每一个索引与Redis集群中的某一个存储节点进行关联。
[0084] 可以使用安全散列算法(Secure Hash Algorithm,SHA)来计算哈希值。
[0085] 示例性的,假设计算得到所述set数组的第1个索引S0的第一哈希值为1,第2个索引S1的第一哈希值为4,计算得到Redis集群中的第1个存储节点的第二哈希值为1,第4个存储节点的第二哈希值为4,则将set数组的第1个索引S0与第1个存储节点进行关联,将set数组的第2个索引S1与第4个存储节点进行关联。
[0086] 在一个优选的实施例中,所述计算所述Redis集群中的每个存储节点的第二哈希值包括:
[0087] 获取所述Redis集群中的每个存储节点的标识,其中,所述标识为存储节点的IP地址或者存储节点的主机名称;
[0088] 根据所述标识计算第二哈希值。
[0089] 不同的储存节点的IP地址或者主机名称不同,由此计算得到的第二哈希值不同。
[0090] S13,当接收到数据的缓存指令时,计算所述数据的哈希值。
[0091] 本实施例中,触发了数据的缓存指令时,即认为接收到了数据的缓存指令,则计算待存储的数据中的每一个数据的哈希值。不同的数据的哈希值不同,相同的数据的哈希值相同。
[0092] 在一个优选的实施例中,所述当接收到数据的缓存指令时,计算所述数据的哈希值包括:
[0093] 当接收到数据的缓存指令时,逐行读取所述数据中的每行数据的键值;
[0094] 计算每行数据的键值的哈希值。
[0095] 由于Redis集群是以key-velue进行存储数据的,因此以数据的键(key)为对象计算哈希值,能够将具有相同key的数据存储在同一个存储节点中,具有不同key的数据存储在不同的存储节点中。
[0096] S14,对所述哈希值与最大int型数据进行逻辑与运算。
[0097] 由于计算出的数据的哈希值有可能为负数,因而在计算出数据的哈希值之后,再将哈希值与最大int型数据进行逻辑&运算,如此可以确保得到一个非负数的int型的值。
[0098] 关于Java的逻辑与预算为现有技术,本发明在此不再详细阐述。
[0099] 在一个优选的实施例中,在所述对所述哈希值与最大int型数据进行逻辑与运算之后,所述方法还包括:
[0100] 判断进行逻辑与运算后的结果是否为-2147483648;
[0101] 当进行逻辑与运算后的结果为-2147483648时,将所述结果确定为2147483647;
[0102] 当进行逻辑与运算后的结果不为-2147483648时,将所述结果确定为进行逻辑与运算后的绝对值。
[0103] Java中int型数据占32位的时候,最大可以赋值为:2147483647,用十六进制表示为:0x7fffffff,最小可以赋值为:-2147483648,用十六进制表示为:0x8fffffff。即Java的int型数据的范围在-2147483648-2147483647。应当理解的是:0x7fffffff中7的二进制形式最高位为0,如果对2147483647+1,则输出的就是-2147483648,0x8fffffff中8的二进制形式最高位是符号位。
[0104] 由于Java中int型数据的最大值为2147483647,而-2147483648的绝对值是2147483648,比最大值2147483647大1,因而对-2147483648直接取绝对值时得到的数据超过系统的最大值2147483647的范围了,系统会报错。为了避免进行逻辑与运算后系统出错,对每一个哈希值与最大int型数据进行逻辑与运算之后得到的结果,除了将结果为-
2147483648修订为2147483647外,其他的结果都为绝对值。
[0105] S15,对进行逻辑与运算后的结果与所述set数组的长度进行求余运算得到key值。
[0106] 其中,所述set数组的长度为所述set数组中索引的个数。例如,set数组中索引的个数为36,则set数组的长度为36。
[0107] Java中使用%作为求余运算(取模运算)的运算符,进行求余运算后的结果的符号总是与被除数的符号保持一致。因而,对进行逻辑与运算后的结果再与所述set数组的长度进行求余运算后得到的key值正好对应set数组的索引。
[0108] 关于Java的求余运算为现有技术,本发明在此不再详细阐述。
[0109] 示例性的,假设set数组的长度为36,set数组的索引则为0,1,……,35。对进行逻辑与运算后的结果再与所述set数组的长度进行求余运算后得到的key值,在0-35之间,因此,运算得到的key值一定可以与set数组的某一个索引相同,如此,即可确定所述key值对应的数据应当对应于哪一个set数组的索引,即应当存储于哪一个存储节点中。保证了相同的数据一定会对应相同的key,避免数据重复缓存。
[0110] S16,从所述set数组中匹配出与所述key值相同的目标索引。
[0111] 本实施例中,在计算得到每个数据对应的key值之后,由于key值一定可以与set数组的某一个索引相同,因此,将set数组的索引中与key值相同的索引作为目标索引,便于后续匹配出与所述目标索引对应的目标存储节点,并将所述数据存储在所述目标存储节点中。
[0112] 示例性的,假如第一数据对应的key值为6,则set数组的索引中索引S6为所述第一数据的目标索引,与所述目标索引S6对应的存储节点M3为目标存储节点;又如第二数据对应的key值为0,则set数组的索引中索引S0为所述第二数据的目标索引,与所述目标索引S0对应的存储节点M1为目标存储节点。
[0113] S17,将所述key值对应的数据存储在与所述目标索引对应的存储节点中。
[0114] 本实施例中,确定了目标索引,即可根据set数组与存储节点的关联关系确定出与目标索引对应的目标存储节点,并将所述key值对应的数据存储在所述目标存储节点中。
[0115] 如上述示例中的,将第一数据存储在存储节点M3中,将第二数据存储在存储节点M1中。
[0116] 在一个优选的实施例中,所述方法还可以包括:
[0117] 当接收到所述数据的读取指令时,获取所述set数组的所有索引;
[0118] 获取所述Redis集群中与每个索引对应的存储节点;
[0119] 按照所述索引的顺序依次读取与每个索引对应的存储节点中的数据;
[0120] 连接所读取的数据并显示。
[0121] 示例性的,假设Redis集群的存储节点分别为M1、M2、M3、M4、M5及M6,set数组长度为12,索引分别为S0、S1、S2、S3、S4、S5、S6、S7、S8、S9、S10、S11。其中,当接收到所述数据的读取指令时,获取所述set数组的所有索引,然后从所述Redis集群中获取与索引S0对应的存储节点M1,与索引S1对应的存储节点M3,与索引S2对应的存储节点M4,与索引S3对应的存储节点M2,与索引S4对应的存储节点M6,与索引S5对应的存储节点M5,与索引S6对应的存储节点M3,与索引S7对应的存储节点M1,与索引S8对应的存储节点M6,与索引S9对应的存储节点M4,与索引S10对应的存储节点M2,与索引S11对应的存储节点M5,按照索引的顺序0-11,分别读取存储节点M1、M3、M4、M2、M6、M5、M3、M1、M6、M4、M2、M5中的数据,最后将读取到的数据连接起来作为最终的结果进行显示。
[0122] 具体的,每次读取某一个存储节点中数据时,按照从上到下的数据依次进行读取。优选地,每读取出该存储节点中的数据后,将所述存储节点中的数据进行标记,下一次读取该存储节点时,直接将指针定位至所述标记的下一行,即可读取到所需要的数据。
[0123] 综上所述,本发明所述的基于Redis集群的数据均匀缓存方法,通过初始化set数组,将set数组的索引与Redis集群中的存储节点建立关联关系,对于要缓存的数据,则计算每个数据的哈希值,对每一个哈希值与最大int型数据进行逻辑与运算再与set数据的长度进行求余运算得到key值正好对应set数组的索引,如此便能够匹配出与每个key值相同的所述set数组的目标索引,进而确定与目标索引对应的目标存储节点,最后将所述key值对应的数据存储在所述目标存储节点中。在保证缓存数据不会重复的基础上,还保证了大数据量在Redis集群上的均匀分布。
[0124] 此外,以数据的key(键)为对象计算哈希值,能够将具有相同key的数据存储在同一个存储节点中,具有不同key的数据存储在不同的存储节点中;而结合Redis集群的规模和存储节点的性能综合考虑初始化set数组的长度,不仅使得Redis集群数据分布均匀,还不会影响数据写入和读取的速度。
[0125] 实施例二
[0126] 图2是本发明实施例二提供的基于Redis集群的数据均匀缓存装置的结构图。
[0127] 在一些实施例中,所述基于Redis集群的数据均匀缓存装置20可以包括多个由程序代码段所组成的功能模块。所述基于Redis集群的数据均匀缓存装置20中的各个程序段的程序代码可以存储于终端的存储器中,并由所述至少一个处理器所执行,以执行(详见图1描述)基于Redis集群的数据均匀缓存的功能。
[0128] 本实施例中,所述基于Redis集群的数据均匀缓存装置20根据其所执行的功能,可以被划分为多个功能模块。所述功能模块可以包括:初始化模块201、索引关联模块202、哈希计算模块203、逻辑运算模块204、结果判断模块205、求余运算模块206、索引匹配模块207、数据存储模块208、索引获取模块209及数据读取模块210。本发明所称的模块是指一种能够被至少一个处理器所执行并且能够完成固定功能的一系列计算机程序段,其存储在存储器中。在本实施例中,关于各模块的功能将在后续的实施例中详述。
[0129] 初始化模块201,用于初始化set数组。
[0130] Redis可以在不同的物理机或者同一个物理机用不同的端口启动服务实例,作为一致性哈希环中的存储节点。每一个存储节点按照物理机的实际内存作设置。一致性哈希是把数据和虚拟节点全部映射到0-231的数值空间上,同时将这数值空间首尾相连作为哈希环。对虚拟节点进行哈希运算,会映射到哈希环上的一个数字,将这个数字与虚拟节点的对应关系保存下来就是哈希映射表。
[0131] 初始化时,除了初始化一个set数组,可以为Redis集群设置一个主节点Master,用于管理Redis集群的元数据,维护一致性哈希映射表,例如,维护set数组与存储节点之间的关联关系,其他Redis启动的服务实例将作为数据存储的从属节点Slave,负责数据的管理与存储,维护本节点实例状态,对Master节点进行数据和状态交互。
[0132] 在一个优选的实施例中,所述初始化模块201初始化set数组包括:
[0133] 获取所述Redis集群中存储节点的数量;
[0134] 根据所述数量确定所述set数组的长度范围;
[0135] 获取所述Redis集群中存储节点的性能;
[0136] 当所述性能大于预设性能阈值时,确定所述set数组的长度为所述长度范围中的最大值;
[0137] 当所述性能小于预设性能阈值时,确定所述set数组的长度为所述长度范围中的中间值,其中,所述中间值是指处于所述长度范围中间区域中的任意一个值。
[0138] 在该可选的实施例中,初始化set数组的长度越长,后续将数据存储在Redis集群将会越均匀。但set数组的长度太长,而存储节点的性能较低时,虽然使得Redis集群数据分布越均匀,但写入和读取的速度也会越慢。因而需要结合Redis集群的规模和存储节点的性能综合考虑初始化set数组的长度。
[0139] 假设Redis集群中存储节点的数量为N,set数组的长度为L,则可能分配给每个存储节点的set数组的索引的个数M=L/N。M的范围可以取值N/2-2N,L的范围则取值为N2/2-2N2。若存储节点的性能较优(大于预设性能阈值),则M可以取大点,对应的set数组的长度也会较长,可以取范围中的最大值2N2。若存储节点的性能较差(小于预设性能阈值),则M可以取小点,对应的set数组的长度也会较短,可以取范围中的中间值N2。
[0140] 其中,所述中间值不是指处于长度范围最中间的一个值,而是指处于长度范围中间区域中的任意一个值。所述中间区域可以是预先设定的处于所述长度范围的1/4-3/4之间的区域。
[0141] 示例性的,假设Redis集群中存储节点的数量N=6,分配给每个存储节点的set数组的索引的个数M=6,则set数组的长度L=6*6=36。
[0142] 索引关联模块202,用于关联所述set数组的索引与Redis集群中的存储节点。
[0143] 本实施例中,初始化set数组后,为set数组的索引与Redis集群中的存储节点之间建立关联关系,并存储所述关联关系。
[0144] 在一个优选的实施例中,所述索引关联模块202关联所述set数组的索引与Redis集群中的存储节点包括:
[0145] 计算所述set数组的每个索引的第一哈希值;
[0146] 计算所述Redis集群中的每个存储节点的第二哈希值;
[0147] 匹配与所述第二哈希值相同的目标第一哈希值;
[0148] 将所述目标第一哈希值对应的set数组的索引与所述第二哈希值对应的存储节点进行关联。
[0149] 在该可选的实施例中,可以根据set数组的索引的名称来计算set数组的索引的哈希值。通过哈希计算,能将set数组的每一个索引与Redis集群中的某一个存储节点进行关联。
[0150] 可以使用安全散列算法(Secure Hash Algorithm,SHA)来计算哈希值。
[0151] 示例性的,假设计算得到所述set数组的第1个索引S0的第一哈希值为1,第2个索引S1的第一哈希值为4,计算得到Redis集群中的第1个存储节点的第二哈希值为1,第4个存储节点的第二哈希值为4,则将set数组的第1个索引S0与第1个存储节点进行关联,将set数组的第2个索引S1与第4个存储节点进行关联。
[0152] 在一个优选的实施例中,所述计算所述Redis集群中的每个存储节点的第二哈希值包括:
[0153] 获取所述Redis集群中的每个存储节点的标识,其中,所述标识为存储节点的IP地址或者存储节点的主机名称;
[0154] 根据所述标识计算第二哈希值。
[0155] 不同的储存节点的IP地址或者主机名称不同,由此计算得到的第二哈希值不同。
[0156] 哈希计算模块203,用于当接收到数据的缓存指令时,计算所述数据的哈希值。
[0157] 本实施例中,触发了数据的缓存指令时,即认为接收到了数据的缓存指令,则计算待存储的数据中的每一个数据的哈希值。不同的数据的哈希值不同,相同的数据的哈希值相同。
[0158] 在一个优选的实施例中,所述当接收到数据的缓存指令时,哈希计算模块203计算所述数据的哈希值包括:
[0159] 逐行读取所述数据中的每行数据的键值;
[0160] 计算每行数据的键值的哈希值。
[0161] 由于Redis集群是以key-velue进行存储数据的,因此以数据的键(key)为对象计算哈希值,能够将具有相同key的数据存储在同一个存储节点中,具有不同key的数据存储在不同的存储节点中。
[0162] 逻辑运算模块204,用于对所述哈希值与最大int型数据进行逻辑与运算。
[0163] 由于计算出的数据的哈希值有可能为负数,因而在计算出数据的哈希值之后,再将哈希值与最大int型数据进行逻辑&运算,如此可以确保得到一个非负数的int型的值。
[0164] 关于Java的逻辑与预算为现有技术,本发明在此不再详细阐述。
[0165] 在一个优选的实施例中,在所述对所述哈希值与最大int型数据进行逻辑与运算之后,所述装置还包括:结果判断模块205,用于:
[0166] 判断进行逻辑与运算后的结果是否为-2147483648;
[0167] 当进行逻辑与运算后的结果为-2147483648时,将所述结果确定为2147483647;
[0168] 当进行逻辑与运算后的结果不为-2147483648时,将所述结果确定为进行逻辑与运算后的绝对值。
[0169] Java中int型数据占32位的时候,最大可以赋值为:2147483647,用十六进制表示为:0x7fffffff,最小可以赋值为:-2147483648,用十六进制表示为:0x8fffffff。即Java的int型数据的范围在-2147483648-2147483647。应当理解的是:0x7fffffff中7的二进制形式最高位为0,如果对2147483647+1,则输出的就是-2147483648,0x8fffffff中8的二进制形式最高位是符号位。
[0170] 由于Java中int型数据的最大值为2147483647,而-2147483648的绝对值是2147483648,比最大值2147483647大1,因而对-2147483648直接取绝对值时得到的数据超过系统的最大值2147483647的范围了,系统会报错。为了避免进行逻辑与运算后系统出错,对每一个哈希值与最大int型数据进行逻辑与运算之后得到的结果,除了将结果为-
2147483648修订为2147483647外,其他的结果都为绝对值。
[0171] 求余运算模块206,用于对进行逻辑与运算后的结果与所述set数组的长度进行求余运算得到key值。
[0172] 其中,所述set数组的长度为所述set数组中索引的个数。例如,set数组中索引的个数为36,则set数组的长度为36。
[0173] Java中使用%作为求余运算(取模运算)的运算符,进行求余运算后的结果的符号总是与被除数的符号保持一致。因而,对进行逻辑与运算后的结果再与所述set数组的长度进行求余运算后得到的key值正好对应set数组的索引。
[0174] 关于Java的求余运算为现有技术,本发明在此不再详细阐述。
[0175] 示例性的,假设set数组的长度为36,set数组的索引则为0,1,……,35。对进行逻辑与运算后的结果再与所述set数组的长度进行求余运算后得到的key值,在0-35之间,因此,运算得到的key值一定可以与set数组的某一个索引相同,如此,即可确定所述key值对应的数据应当对应于哪一个set数组的索引,即应当存储于哪一个存储节点中。保证了相同的数据一定会对应相同的key,避免数据重复缓存。
[0176] 索引匹配模块207,用于从所述set数组中匹配出与所述key值相同的目标索引。
[0177] 本实施例中,在计算得到每个数据对应的key值之后,由于key值一定可以与set数组的某一个索引相同,因此,将set数组的索引中与key值相同的索引作为目标索引,便于后续匹配出与所述目标索引对应的目标存储节点,并将所述数据存储在所述目标存储节点中。
[0178] 示例性的,假如第一数据对应的key值为6,则set数组的索引中索引S6为所述第一数据的目标索引,与所述目标索引S6对应的存储节点M3为目标存储节点;又如第二数据对应的key值为0,则set数组的索引中索引S0为所述第二数据的目标索引,与所述目标索引S0对应的存储节点M1为目标存储节点。
[0179] 数据存储模块208,用于将所述key值对应的数据存储在与所述目标索引对应的存储节点中。
[0180] 本实施例中,确定了目标索引,即可根据set数组与存储节点的关联关系确定出与目标索引对应的目标存储节点,并将所述key值对应的数据存储在所述目标存储节点中。
[0181] 如上述示例中的,将第一数据存储在存储节点M3中,将第二数据存储在存储节点M1中。
[0182] 在一个优选的实施例中,所述装置还可以包括:
[0183] 索引获取模块209,用于当接收到所述数据的读取指令时,获取所述set数组的所有索引;及获取所述Redis集群中与每个索引对应的存储节点;
[0184] 数据读取模块210,用于按照所述索引的顺序依次读取与每个索引对应的存储节点中的数据;连接所读取的数据并显示。
[0185] 示例性的,假设Redis集群的存储节点分别为M1、M2、M3、M4、M5及M6,set数组长度为12,索引分别为S0、S1、S2、S3、S4、S5、S6、S7、S8、S9、S10、S11。其中,当接收到所述数据的读取指令时,获取所述set数组的所有索引,然后从所述Redis集群中获取与索引S0对应的存储节点M1,与索引S1对应的存储节点M3,与索引S2对应的存储节点M4,与索引S3对应的存储节点M2,与索引S4对应的存储节点M6,与索引S5对应的存储节点M5,与索引S6对应的存储节点M3,与索引S7对应的存储节点M1,与索引S8对应的存储节点M6,与索引S9对应的存储节点M4,与索引S10对应的存储节点M2,与索引S11对应的存储节点M5,按照索引的顺序0-11,分别读取存储节点M1、M3、M4、M2、M6、M5、M3、M1、M6、M4、M2、M5中的数据,最后将读取到的数据连接起来作为最终的结果进行显示。
[0186] 具体的,每次读取某一个存储节点中数据时,按照从上到下的数据依次进行读取。优选地,每读取出该存储节点中的数据后,将所述存储节点中的数据进行标记,下一次读取该存储节点时,直接将指针定位至所述标记的下一行,即可读取到所需要的数据。
[0187] 综上所述,本发明所述的基于Redis集群的数据均匀缓存装置,通过初始化set数组,将set数组的索引与Redis集群中的存储节点建立关联关系,对于要缓存的数据,则计算每个数据的哈希值,对每一个哈希值与最大int型数据进行逻辑与运算再与set数据的长度进行求余运算得到key值正好对应set数组的索引,如此便能够匹配出与每个key值相同的所述set数组的目标索引,进而确定与目标索引对应的目标存储节点,最后将所述key值对应的数据存储在所述目标存储节点中。在保证缓存数据不会重复的基础上,还保证了大数据量在Redis集群上的均匀分布。此外,以数据的key(键)为对象计算哈希值,能够将具有相同key的数据存储在同一个存储节点中,具有不同key的数据存储在不同的存储节点中;而结合Redis集群的规模和存储节点的性能综合考虑初始化set数组的长度,不仅使得Redis集群数据分布均匀,还不会影响数据写入和读取的速度。
[0188] 实施例三
[0189] 参阅图3所示,为本发明实施例三提供的终端的结构示意图。在本发明较佳实施例中,所述终端3包括存储器31、至少一个处理器32、至少一条通信总线33及收发器34。
[0190] 本领域技术人员应该了解,图3示出的终端的结构并不构成本发明实施例的限定,既可以是总线型结构,也可以是星形结构,所述终端3还可以包括比图示更多或更少的其他硬件或者软件,或者不同的部件布置。
[0191] 在一些实施例中,所述终端3是一种能够按照事先设定或存储的指令,自动进行数值计算和/或信息处理的设备,其硬件包括但不限于微处理器、专用集成电路、可编程阵列、数字处理器及嵌入式设备等。所述终端3还可包括客户设备,所述客户设备包括但不限于任何一种可与客户通过键盘鼠标、遥控器、触摸板或声控设备等方式进行人机交互电子产品,例如,个人计算机、平板电脑、智能手机、数码相机等。
[0192] 需要说明的是,所述终端3仅为举例,其他现有的或今后可能出现的电子产品如可适应于本发明,也应包含在本发明的保护范围以内,并以引用方式包含于此。
[0193] 在一些实施例中,所述存储器31用于存储程序代码和各种数据,例如安装在所述终端3中的装置,并在终端3的运行过程中实现高速、自动地完成程序或数据的存取。所述存储器31包括只读存储器(Read-Only Memory,ROM)、可编程只读存储器(Programmable Read-Only Memory,PROM)、可擦除可编程只读存储器(Erasable Programmable Read-Only Memory,EPROM)、一次可编程只读存储器(One-time Programmable Read-Only Memory,OTPROM)、电子擦除式可复写只读存储器(Electrically-Erasable Programmable Read-Only Memory,EEPROM)、只读光盘(Compact Disc Read-Only Memory,CD-ROM)或其他光盘存储器、磁盘存储器、磁带存储器、或者能够用于携带或存储数据的计算机可读的任何其他介质。
[0194] 在一些实施例中,所述至少一个处理器32可以由集成电路组成,例如可以由单个封装的集成电路所组成,也可以是由多个相同功能或不同功能封装的集成电路所组成,包括一个或者多个中央处理器(Central Processing unit,CPU)、微处理器、数字处理芯片、图形处理器及各种控制芯片的组合等。所述至少一个处理器32是所述终端3的控制核心(Control Unit),利用各种接口和线路连接整个终端3的各个部件,通过运行或执行存储在所述存储器31内的程序或者模块,以及调用存储在所述存储器31内的数据,以执行终端3的各种功能和处理数据。
[0195] 在一些实施例中,所述至少一条通信总线33被设置为实现所述存储器31以及所述至少一个处理器32等之间的连接通信。
[0196] 尽管未示出,所述终端3还可以包括给各个部件供电的电源(比如电池),优选的,电源可以通过电源管理装置与所述至少一个处理器32逻辑相连,从而通过电源管理装置实现管理充电、放电、以及功耗管理等功能。电源还可以包括一个或一个以上的直流或交流电源、再充电装置、电源故障检测电路、电源转换器或者逆变器、电源状态指示器等任意组件。所述终端3还可以包括多种传感器、蓝牙模块、Wi-Fi模块等,在此不再赘述。
[0197] 应该了解,所述实施例仅为说明之用,在专利申请范围上并不受此结构的限制。
[0198] 上述以软件功能模块的形式实现的集成的单元,可以存储在一个计算机可读取存储介质中。上述软件功能模块存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,终端,或者网络设备等)或处理器(processor)执行本发明各个实施例所述方法的部分。
[0199] 在进一步的实施例中,结合图2,所述至少一个处理器32可执行所述终端3的操作装置以及安装的各类应用程序、程序代码等,例如,上述的各个模块。
[0200] 所述存储器31中存储有程序代码,且所述至少一个处理器32可调用所述存储器31中存储的程序代码以执行相关的功能。例如,图2中所述的各个模块是存储在所述存储器31中的程序代码,并由所述至少一个处理器32所执行,从而实现所述各个模块的功能。
[0201] 在本发明的一个实施例中,所述存储器31存储多个指令,所述多个指令被所述至少一个处理器32所执行以实现本发明所述的方法中的全部或者部分步骤。
[0202] 具体地,所述至少一个处理器32对上述指令的具体实现方法可参考图1对应实施例中相关步骤的描述,在此不赘述。
[0203] 在本发明所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式。
[0204] 所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,作为模块显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。
[0205] 另外,在本发明各个实施例中的各功能模块可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用硬件加软件功能模块的形式实现。
[0206] 对于本领域技术人员而言,显然本发明不限于上述示范性实施例的细节,而且在不背离本发明的精神或基本特征的情况下,能够以其他的具体形式实现本发明。因此,无论从哪一点来看,均应将实施例看作是示范性的,而且是非限制性的,本发明的范围由所附权利要求而不是上述说明限定,因此旨在将落在权利要求的等同要件的含义和范围内的所有变化涵括在本发明内。不应将权利要求中的任何附图标记视为限制所涉及的权利要求。此外,显然“包括”一词不排除其他单元或,单数不排除复数。装置权利要求中陈述的多个单元或装置也可以由一个单元或装置通过软件或者硬件来实现。第一,第二等词语用来表示名称,而并不表示任何特定的顺序。
[0207] 最后应说明的是,以上实施例仅用以说明本发明的技术方案而非限制,尽管参照较佳实施例对本发明进行了详细说明,本领域的普通技术人员应当理解,可以对本发明的技术方案进行修改或等同替换,而不脱离本发明技术方案的精神和范围。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈