本发明涉及信息存储技术,具体涉及一种基于远程字典服务器的数据存储方法及系统。
背景技术:
随着社会进步及科技的发展,互联网技术也得到飞速的发展,尤其是进入互联网+时代后,互联网企业在伴随其业务飞速发展的同时,用户需求也越来越复杂且多变,进而会产生巨量的数据信息,而采用传统的存储方案对巨量数据信息的存储又无法满足网络应用平台及用户体验。
远程字典服务器(REDIS,Remote DIctionary Server)是一个键值(key-value)存储系统,支持存储字符串(string)、链表(list)、集合(set)、有序集合(zset-sortedset)和哈希(hash)等value类型。同时这些数据类型都支持推进/弹出(push/pop)、添加/移除(add/remove)及取交集并集和差集等更丰富的原子性操作指令。为了保证效率,REDIS数据都是缓存在内存中,并且REDIS会周期性的把更新的数据写入磁盘、或者把修改操作指令写入追加的记录文件,从而能够实现主盘和从盘(master-slave)同步。
由于现有的REDIS缓存技术对键值采用一致性哈希算法,将数据平均存储到各个缓存服务器中,然后在键值所在的缓存服务器进行数据访问。而采用这样的数据存储方法,会存在以下缺点:
1、在密集数据访问的应用上,REDIS缓存技术传输时延严重,影响用户感知。比如:一个操作接口需要查询REDIS缓存1000次,且每次传输时延为1毫秒(millisecond),则所述操作接口的操作时延将增加1秒(second)。
2、在高并发数据访问的情形下,REDIS缓存技术的丢包概率较大。
技术实现要素:
为解决现有存在的技术问题,本发明实施例期望提供一种基于远程字典服务器的数据存储方法及系统,能够提高数据传输速度,同时能够避免数据包丢失。
本发明实施例的技术方案是这样实现的:
根据本发明实施例的一方面,提供一种基于远程字典服务器的数据存储方法,所述方法包括:
获取第一对象REDIS或第二对象REDIS缓存的实体对象和参考对象,其中,所述第一对象REDIS位于第一数据中心,所述第二对象REDIS位于第二数据中心;
确定所述实体对象的版本号低于所述参考对象的版本号时,获取第一版本号REDIS分配的新版本号,并根据所述新版本号获取第一数据库重新加载的新实体对象,其中,所述第一版本号REDIS和所述第一数据库位于所述第一数据中心;
同步更新所述第一对象REDIS和所述第二对象REDIS缓存的实体对象为所述新实体对象。
上述方案中,所述获取第一对象REDIS或第二对象REDIS缓存的实体对象和参考对象,包括:
通过REDIS的JAVA业务模块内容中心的类Jedis Wrapper向本站点内第一对象REDIS或第二对象REDIS发送对象获取请求;
接收所述第一对象REDIS或所述第二对象REDIS根据所述对象获取请求发送的实体对象和参考对象。
上述方案中,所述获取第一版本号REDIS分配的新版本号,包括:
向所述第一版本号REDIS发送新版本号获取请求;
接收所述第一版本号REDIS根据新版本号获取请求分配的新版本号,所述新版本号高于所述参考对象的版本号。
上述方案中,所述根据所述新版本号获取第一数据库重新加载的新实体对象,包括:
向所述第一数据库发送对象加载请求,所述对象加载请求中携带有所述新版本号;
接收所述第一数据库根据所述对象加载请求重新加载的新实体对象。
上述方案中,所述同步更新所述第一对象REDIS和所述第二对象REDIS缓存的实体对象为所述新实体对象,包括:
通过所述Jedis Wrapper同步更新所述第一对象REDIS和所述第二对象REDIS缓存的实体对象为所述新实体对象。
上述方案中,在所述获取第一版本号REDIS分配的新版本号之后,所述方法还包括:
将所述新版本号同步更新到第二版本号REDIS,所述第二版本号REDIS位于所述第二数据中心。
上述方案中,在所述根据所述新版本号获取第一数据库重新加载的新实体对象之后,所述方法还包括:
将所述新实体对象同步更新到第二数据库,所述第二数据库位于所述第二数据中心。
根据本发明实施例的另一方面,提供一种基于远程字典服务器的数据存储系统,所述系统包括:位于第一数据中心的第一内容服务器、第一对象REDIS、第一版本号REDIS、第一数据库,以及位于第二数据中心的第二内容服务器和第二对象REDIS;其中,
所述第一对象REDIS或所述第二对象REDIS,用于缓存实体对象和参考对象;
所述第一版本号REDIS,用于分配新版本号;
所述第一内容服务器或所述第二内容服务器,用于获取第一对象REDIS或所述第二对象REDIS缓存的实体对象和参考对象;确定所述实体对象的版本号低于所述参考对象的版本号时,获取所述第一版本号REDIS分配的新版本号,并根据所述新版本号获取所述第一数据库重新加载的新实体对象;同步更新所述第一对象REDIS和所述第二对象REDIS缓存的实体对象为所述新实体对象。
上述方案中,所述第一内容服务器或所述第二内容服务器,具体用于通过Jedis Wrapper向本站点内第一对象REDIS或第二对象REDIS发送对象获取请求,接收所述第一对象REDIS或第二对象REDIS根据所述对象获取请求发送的实体对象和参考对象。
上述方案中,所述第一内容服务器或所述第二内容服务器,具体还用于向所述第一版本号REDIS发送新版本号获取请求,接收所述第一版本号REDIS根据所述新版本号获取请求分配的新版本号,所述新版本号高于所述参考对象的版本号。
上述方案中,所述第一内容服务器或所述第二内容服务器,具体还用于向所述第一数据库发送对象加载请求,所述对象加载请求中携带有所述新版本号;接收所述第一数据库根据所述对象加载请求重新加载的新实体对象。
上述方案中,所述第一内容服务器或所述第二内容服务器,具体用于通过Jedis Wrapper同步更新所述第一对象REDIS和所述第二对象REDIS缓存的实体对象为所述新实体对象。
上述方案中,所述系统还包括第二版本号REDIS;
所述第一内容服务器或所述第二内容服务器,具体还用于将所述新版本号同步更新到第二版本号REDIS,所述第二版本号REDIS位于所述第二数据中心。
上述方案中,所述系统还包括第二数据库;
所述第一内容服务器或所述第二内容服务器,具体还用于将所述新实体对象同步更新到第二数据库,所述第二数据库位于所述第二数据中心。
本发明实施例提供一种基于远程字典服务器的数据存储方法及系统,通过获取第一对象REDIS或第二对象REDIS缓存的实体对象和参考对象,其中,所述第一对象REDIS位于第一数据中心,所述第二对象REDIS位于第二数据中心;确定所述实体对象的版本号低于所述参考对象的版本号时,获取第一版本号REDIS分配的新版本号,并根据所述新版本号获取第一数据库重新加载的新实体对象,其中,所述第一版本号REDIS和所述第一数据库位于所述第一数据中心;同步更新所述第一对象REDIS和所述第二对象REDIS缓存的实体对象为所述新实体对象。如此,在执行读缓存操作时,只读取本站点内的REDIS服务器,而在执行写缓存操作时,则采用双写的方法,同步更新双数据中心的REDIS服务器,使得双数据中心的REDIS服务器在相同的键值里保持存储的数据相同。这样,能够提高数据传输速度同时能够避免数据包丢失。
附图说明
图1为本发明实施例一种基于远程字典服务器的数据存储方法的流程示意图;
图2为本发明实施例中REDIS执行缓存读取的流程示意图;
图3为本发明实施例一种基于远程字典服务器的数据存储系统的结构组成示意图。
具体实施方式
下面结合附图对本发明的具体实施方式进行详细说明。应当理解的是,此处所描述的具体实施方式仅用于说明和解释本发明,并不用于限制本发明。
图1为一种基于远程字典服务器的数据存储方法的流程示意图;如图1所示,该方法包括:
步骤101,获取第一对象REDIS或第二对象REDIS缓存的实体对象和参考对象,其中,所述第一对象REDIS位于第一数据中心,所述第二对象REDIS位于第二数据中心;
本发明实施例的方法主要应用在双数据中心,所述双数据中心包括第一数据中心和第二数据中心,其中,所述第一对象REDIS位于所述第一数据中心,所述第二对象REDIS位于所述第二数据中心。
在本发明实施例中,所述第一对象REDIS和所述第二对象REDIS可以是单台REDIS服务器,也可以是多台REDIS服务器组成的REDIS服务器集群。
具体地,所述第一数据中心的第一内容服务器通过REDIS的JAVA业务模块内容中心的类(Jedis Wrapper)向本站点内第一对象REDIS发送对象获取请求,所述第一对象REDIS接收到所述对象获取请求后,根据所述对象获取请求向所述第一内容服务器发送实体对象和参考对象。或者,所述第二数据中心的第二内容服务器通过Jedis Wrapper向本站点内第二对象REDIS发送对象获取请求,所述第二对象REDIS接收到所述对象获取请求后,根据所述对象获取请求向所述第二内容服务器发送实体对象和参考对象。
这里,所述实体对像和参考对象都是实体类的一个实例。具体地,实体是用于传递数据的一种数据载体,在三层架构(3-tier architecture)中会分一个实体层,而数据库中的每一张表叫做实体集,在程序中为了消除数据库的关系模型,使之面向对象,会对数据库中的表各写一个实体,而实体对像和参考对象就是实体类的一个实例。
步骤102,确定所述实体对象的版本号低于所述参考对象的版本号时,获取第一版本号REDIS分配的新版本号,并根据所述新版本号获取第一数据库重新加载的新实体对象,其中,所述第一版本号REDIS和所述第一数据库位于所述第一数据中心;
这里,所述第一数据中心或所述第二数据中心获取到本站点内第一对象REDIS或第二对象REDIS缓存的实体对象和参考对象后,确定所述实体对象和所述参考对象的版本号,并将所述实体对象的版本号与所述参考对象的版本号进行比对,得到比对结果,根据所述比对结果确定所述实体对象是否处于有效的缓存状态。
具体地,当根据所述比对结果确定所述实体对象的版本号低于所述参考对象的版本号时,确定所述实体对象的缓存状态为失效状态,则向所述第一数据中心的第一版本号REDIS发送新版本号获取请求,所述第一版本号REDIS根据所述新版本号获取请求,向所述第一数据中心或所述第二数据中心发送新版本号。
这里,所述新版本号高于所述参考对象的版本号;所述第一数据中心或所述第二数据中心获取到所述新版本号后,将所述新版本号同步更新到第二数据中心的第二版本号REDIS,并向第一数据中心的第一数据库发送对象加载请求,其中,所述对象加载请求中携带有所述新版本号。所述第一数据库接收到所述对象加载请求后,根据所述对象加载请求重新加载实体对象,并将重新加载的新实体对象发送给所述第一数据中心或所述第二数据中心,所述第一数据中心或所述第二数据中心接收到所述新实体对象后,将所述新实体对象同步更新到所述第二数据中心的第二数据库。这里,采用在异地部署一个一模一样的第二版本号REDIS和第二数据库实现冷备容灾方案,可以在所述第一版本号REDIS和第一数据库所处的地理位置发生自然灾害,导致当前数据库发生灾难时,所述第二版本号REDIS和所述第二数据库可以立马顶替工作,保证业务不间断运行。
在本发明实施例中,所述第一对象REDIS、所述第二对象REDIS、所述第一版本号REDIS和所述第二版本号REDIS可以分别是由一台REDIS服务器组成,也可以分别是由多台REDIS服务器组成的版本号REDIS服务器集群。
步骤103,同步更新所述第一对象REDIS和所述第二对象REDIS缓存的实体对象为所述新实体对象。
这里,为了保证第一对象REDIS和所述第二对象REDIS在相同的key里存入的内容相同,所述第一数据中心或所述第二数据中心接收到所述第一数据库重新加载的新实体对象后,通过所述Jedis Wrapper同步更新所述第一对象REDIS和所述第二对象REDIS缓存的实体对象为所述新实体对象。
图2为本发明实施例中REDIS执行缓存读取的流程示意图;如图2所示,以第二数据中心为例进行详细说明,具体流程包括:
步骤201,第二数据中心的第二内容服务器向本站点内的缓存中心发送读取缓存实体对象的请求;
步骤202,所述缓存中心接收所述读取缓存实体对象的请求,并向本站点内的Jedis Wrapper发送所述读取缓存实体对象的请求;
步骤203,所述Jedis Wrapper接收所述读取缓存实体对象的请求,并将所述读取缓存实体对象的请求路由至本站点的第二对象REDIS;
步骤204,所述第二对象REDIS接收所述读取缓存实体对象的请求,并根据所述读取缓存实体对象的请求,向所述Jedis Wrapper发送所述读取缓存实体对象的请求所针对的实体对象和参考对象;
步骤205,所述Jedis Wrapper接收所述实体对象和参考对象,并将所述实体对象和参考对象发送给所述缓存中心;
步骤206,所述缓存中心接收所述实体对象和参考对象,并比较所述实体对象和参考对象的版本号;
这里,缓存中心每请求读取一个缓存的实体对象,都会将调取出的所述实体对象与参考对象的版本号进行比较,根据比较结果确定所述实体对象的缓存状态是否处于有效状态。具体地,当所述实体对象的版本号高于所述参考对象的版本号时,表示所述实体对象的缓存状态为有效状态;当所述实体对象的版本号低于所述参考对象的版本号时,表示所述实体对象的缓存状态为失效状态。
步骤207,缓存中心确定所述实体对象的版本号低于所述参考对象的版本号时,向第一数据中心的第一版本号REDIS发送新版本号获取请求;
步骤208,第一版本号REDIS接收所述新版本号获取请求,并根据所述新版本号获取请求向所述缓存中心分配新版本号;
这里,所述新版本号高于所述参考对象的版本号。
步骤209,缓存中心向本站点内的第二数据库发送对象加载请求,并将新版本号向第一数据中心的第一数据库发送;
这里,所述对象加载请求中携带所述新版本号。
步骤210,第一数据库向缓存中心发送重新加载的新实体对象;
步骤211,缓存中心根据所述新实体对象更新缓存,并触发所述JedisWrapper进行双写数据的操作;
这里,所述双写数据的操作是指,将所述新实体对象同步更新到所述第一数据中心的第一对象REDIS和第二数据中心的第二对象REDIS。
步骤212,Jedis Wrapper根据缓存中心的触发操作,将第二对象REDIS缓存的实体对象更新为所述新实体对象;
步骤213,第二对象REDIS向所述Jedis Wrapper发送更新结果;
步骤214,Jedis Wrapper接收第二对象REDIS发送的所述更新结果;
步骤215,Jedis Wrapper根据所述更新结果,向所述缓存中心发送新加载的实体对象;
步骤216,缓存中心接收所述新加载的实体对象,并向所述内容服务器发送新实体对象;
步骤217,Jedis Wrapper根据缓存中心的触发操作,将第一数据中心中的第一对象REDIS缓存的实体对象更新为所述新实体对象;
步骤218,第一对象REDIS向Jedis Wrapper发送更新结果。
在本发明实施例中,第一数据中心执行缓存读取的方法与第二数据中心执行缓存读取的方法大致相同,其不同之处在于,所述第一数据中心对获取到的实体对象和参考对象进行比较之后,确定实体对象的版本号低于参考对象的版本号时,也是向第一数据中心的第一版本号REDIS发送新版本号获取请求,并接收所述第一版本号REDIS根据所述新版本号获取请求发送的新版本号,所述新版本号高于参考对象的版本号。
本发明实施例与现有技术相比,通过在执行读缓存操作时,只读取本站点内的REDIS服务器,而在执行写缓存操作时,则采用双写的方法,同步写入双数据中心的REDIS服务器,使得双数据中心的REDIS服务器在相同的key里保持存储的数据相同。如此,能够提高数据传输速度同时能够避免数据包丢失。
图3为本发明实施例基于远程字典服务器的数据存储系统的结构示意图,如图3所示,所述系统包括:位于第一数据中心300的第一内容服务器301、第一对象REDIS 302、第一版本号REDIS 303、第一数据库304,以及位于第二数据中心400的第二内容服务器401和第二对象REDIS 402;其中,
所述第一对象REDIS 302或所述第二对象REDIS 402,用于缓存实体对象和参考对象;
所述第一版本号REDIS 303,用于分配新版本号;
所述第一内容服务器301或所述第二内容服务器401,用于获取所述第一对象REDIS 302或所述第二对象REDIS 402缓存的实体对象和参考对象;确定所述实体对象的版本号低于所述参考对象的版本号时,获取所述第一版本号REDIS 303分配的新版本号,并根据所述新版本号获取所述第一数据库304重新加载的新实体对象;同步更新所述第一对象REDIS 302和所述第二对象REDIS 402缓存的实体对象为所述新实体对象。
本发明实施例中,所述第一对象REDIS 302和所述第二对象REDIS 402可以是单台REDIS服务器,也可以是由多台REDIS服务器组成的REDIS服务器集群。
具体地,所述第一内容服务器301通过Jedis Wrapper向本站点内第一对象REDIS 302发送对象获取请求,所述第一对象REDIS 302接收到所述对象获取请求后,根据所述对象获取请求向所述第一内容服务器301发送实体对象和参考对象。或者,所述第二内容服务器401通过Jedis Wrapper向本站点内第二对象REDIS 402发送对象获取请求,所述第二对象REDIS 402接收到所述对象获取请求后,根据所述对象获取请求向所述第二内容服务器401发送实体对象和参考对象。这里,所述实体对像和参考对象都是实体类的一个实例。
所述第一内容服务器301或所述第二内容服务器401获取到本站点内第一对象REDIS 302或第二对象REDIS 402缓存的实体对象和参考对象后,确定所述实体对象和所述参考对象的版本号,并将所述实体对象的版本号与所述参考对象的版本号进行比对,得到比对结果,根据所述比对结果确定所述实体对象的版本号低于所述参考对象的版本号时,向所述第一版本号REDIS 303发送新版本号获取请求,所述第一版本号REDIS 303根据所述新版本号获取请求,向所述第一内容服务器301或所述第二内容服务器401发送新版本号。这里,所述新版本号高于所述参考对象的版本号。
在本发明实施例中,所述第二数据中心400还包括第二版本号REDIS 403和第二数据库404,所述第一内容服务器301或所述第二内容服务器401获取到所述新版本号后,将所述新版本号同步更新到所述第二版本号REDIS 403,并向所述第一数据库304发送对象加载请求,其中,所述对象加载请求中携带有所述新版本号。所述第一数据库304接收到所述对象加载请求后,根据所述对象加载请求重新加载实体对象,并将重新加载的新实体对象发送给所述第一内容服务器301或所述第二内容服务器401,所述第一内容服务器301或所述第二内容服务器401接收到所述新实体对象后,将所述新实体对象同步更新到所述第二数据库404。这里,采用在异地部署一个一模一样的第二版本号REDIS403和第二数据库404实现冷备容灾方案,可以在所述第一版本号REDIS 303和第一数据库304所处的地理位置发生自然灾害,导致当前数据库发生灾难时,所述第二版本号REDIS 403和所述第二数据库404可以立马顶替工作,保证业务不间断运行。
在本发明实施例中,为了保证第一对象REDIS 302和所述第二对象REDIS402在相同的键值里存入的内容相同,所述第一内容服务器301或所述第二内容服务器401接收到所述第一数据库304重新加载的新实体对象后,通过所述Jedis Wrapper同步更新所述第一对象REDIS 302和所述第二对象REDIS 402缓存的实体对象为所述新实体对象。具体地REDIS执行缓存读取的流程参照方法实施例中的图2描述。
在本发明实施例中,通过在执行读缓存操作时,只读取本站点内的REDIS服务器,而在执行写缓存操作时,则采用双写的方法,同步更新双数据中心的REDIS服务器,使得双数据中心的REDIS服务器在相同的key里保持存储的数据相同。如此,能够提高数据传输速度同时能够避免数据包丢失。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用硬件实施例、软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器和光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。