发明内容
目前,Redis集群方案中的服务端分片方式中(Redis3.0版本采用此方式集群),Redis集群将所有Key映射到16384个Slot中,集群中每个Redis服务器负责一部分,业务程序通过集成的客户端进行操作。即客户端可以向任一服务器发出请求,如果所需数据不在该服务器中,则该服务器引导客户端自动定向去对应服务读写数据。但是,此方案目前还不支持在客户端使用。
本发明的目的在于提供一种基于Redis集群的存储系统,可基于Redis3.0版本集群的基础上,通过提供应用程序快速接入操作接口,来解决大数据下缓存容量限制的问题,且具有开发代价低、运维高效等优势。
本发明所解决的技术问题可以采用以下技术方案来实现:
本申请提供了一种基于Redis集群的缓存系统,可包括:
分布式集群服务器,包括集群服务器和若干扩展服务器,且所述集群服务器负责持有集群信息数据及保存集群状态信息,并映射主键至相应的所述扩展服务器;
客户端(如Jedis客户端等),与所述分布式集群服务器双向通信连接,以用于提供访问所述分布式集群服务器的应用程序操作端口(ApplicationProgramInterface,简称API);
分支扩展支持集群模块,连接至所述客户端,以对所述应用程序操作端口进行扩展;以及
缓存抽象模块(如Springcache注解模块等),连接至所述客户端连接;
其中,应用程序通过所述客户端提供的所述应用程序操作端口访问所述分布式集群服务器时,所述缓存抽象模块提供缓存注解功能。
作为一个优选的实施例,上述的基于Redis集群的存储系统中:
所述分布式集群服务器采用异步复制方式进行数据存储。
作为一个优选的实施例,上述的基于Redis集群的存储系统中:
所述若干扩展服务器包括至少一主机服务器;以及
在所述分布式集群服务器可用时,所述客户端能够访问每个所述主机服务器或所述主机服务器对应的至少一个从服务器。
作为一个优选的实施例,上述的基于Redis集群的存储系统中:
所述集群服务器发现失效服务器时,自动升级该失效服务器的从服务器为主服务器。
作为一个优选的实施例,上述的基于Redis集群的存储系统中:
所述客户端为Jedis客户端。
作为一个优选的实施例,上述的基于Redis集群的存储系统中,所述分支扩展支持集群模块包括:
SpringData单元,提供各种数据访问技术的编程接口。
作为一个优选的实施例,上述的基于Redis集群的存储系统中,所述数据访问技术包括:
关系型数据库、非关系型数据库、map-reduce框架以及基于云的数据存储服务。
作为一个优选的实施例,上述的基于Redis集群的存储系统中,所述分支扩展支持集群模块还包括:
SpringDataRedis单元,用于提供Redis存储驱动管理。
作为一个优选的实施例,上述的基于Redis集群的存储系统中,所述分支扩展支持集群模块还包括:
扩展单元,分别与所述SpringData单元和所述驱动信息SpringDataRedis单元连接,以通过所述编程接口和所述SpringDataRedis单元提供的驱动信息对所述应用程序操作端口进行扩展。
作为一个优选的实施例,上述的基于Redis集群的存储系统中,所述缓存注解功能包括:
CacheEvict功能,以从Cache中删除特定的Key;
Cacheable功能,用于触发Cache操作;
Caching功能,以组合多个Cache操作应用到一个方法上;
CacheConfig功能,以在各个类中共享同一个Cache设置。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本发明保护的范围。
需要说明的是,在不冲突的情况下,本发明中的实施例及实施例中的特征可以相互组合。
下面结合附图和具体实施例对本发明作进一步说明,但不作为本发明的限定。
如图1所示,本申请实施例提供了一种基于Redis集群的存储系统,可基于Redis3.0的基础上,通过提供应用程序快速接入操作接口,来解决大数据下缓存容量限制的问题,该缓存系统可包括分布式集群服务器(如Redis3.0分布式集群)、客户端(如Jedis客户端)、分支扩展支持集群模块(如spring-data-redis-DATAREDIS-315分支扩展)和缓存抽象模块(如SpringCacheAbstraction)等,客户端(如Jedis客户端等)与分布式集群服务器能够实现双向通信连接,可用于提供访问所述分布式集群服务器的应用程序操作端口(ApplicationProgramInterface,简称API),而客户端分支扩展支持集群模块则可对客户端(即连接至客户)提供的应用程序操作端口进行扩展,而缓存抽象模块(如Springcache注解模块等)则可通过该客户端向利用客户端提供的应用程序操作端口访问分布式集群服务器的应用程序通过提供缓存注解功能,即可在以Jedis客户端为基础,通过扩展spring-data-redis-DATAREDIS-315分支,使得本实施例中的缓存系统支持集群,并同时无缝融合SpringCache方法级别的注解。
下面就针对本申请实施例中各个技术要点进行详细说明:
针对Redis3.0分布式集群(即分布式集群服务器):
首先,Redis集群作为Redis的一个分布式实现,使得Redis3.0分布式集群具有较高的性能并且能够水平扩容至1000台服务器(或节点),即其最多能够扩容1000台扩展服务器,且没有中间代理消耗性能,并可使用异步复制方式进行数据存储,而写数据又较为安全,故具有高可用性;另外,主节点(即主服务器)都可达或者主节点对应的从节点(即从服务器)至少有一个可达,则表明Redis集群可用。
其次,Redis集群服务器(即集群服务器)负责持有集群信息数据,并保存集群状态信息,以映射合适的主键到相应的服务器。同时,Redis集群服务器也能够自动察觉其它服务器(即扩展服务器)是否失效,一旦发现失效服务器,就会自动升级该失效服务器的从服务器为主服务器。
优选的,Redis3.0分布式集群的服务器之间均可通过集群总线相连接,并可通过gossip协议来传播信息,同时可利用ping来确认其它服务器是否存活。
针对Jedis客户端(即客户端):
Jedis客户端与上述的Redis3.0分布式集群双向通信连接,以用于向方位该Redis3.0分布式集群的应用程序提供API,如提供可采用非常轻量级且足够健壮的RedisJava客户端,使得Jedis设计非常易于使用;另外,Jedis也是完全兼容Redis2.8.x以及3.0.x版本功能。
针对spring-data-redis-DATAREDIS-315分支扩展(即分支扩展支持集群模块):
pring-data-redis-DATAREDIS-315分支扩展可对Jedis客户端提供的API进行扩展,且该pring-data-redis-DATAREDIS-315分支扩展可包括SpringData(即SpringData单元)、SpringDataRedis(即SpringDataRedis单元)和spring-data-redis-DATAREDIS-315分支(即扩展单元),且SpringData和SpringDataRedis均连接至spring-data-redis-DATAREDIS-315分支,具体的:
1、SpringData能够提供各种数据访问技术的编程接口,即在项目构建Spring应用时,可使得访问数据更方便,如采用关系型数据库、非关系型数据库、map-reduce框架以及基于云的数据存储服务等技术进行上述的访问数据操作。
2、SpringDataRedis则可提供Redis存储的驱动管理,如可具有如下功能:
1)封装多个连接客户端的Redis驱动的抽象,包括Jedis、JRedis、Lettuce、以及SRP驱动等。
2)翻译Redis驱动的异常,且Spring数据访问异常时继承Redis驱动的异常;
3)RedisTemplate能够提供一个执行各种各样的Redis操作的高度抽象,以及异常翻译、序列化等;
4)可发布订阅支持,诸如消息监听容器为消息驱动的对象等;
5)可实现JDK、String、JSON及SpringObject/XML序列化功能;
6)JDK集合的Redis实现。
7)原子计数器支持类;
8)Spring3.1CacheAbstraction功能;
9)排序和管道功能。
3、spring-data-redis-DATAREDIS-315分支则可作为spring-data-redis集群分支,可通过增加必要的核心功能来实现支持集群,并能够规避集群中不可用的Redis命令,例如multi/pipelining操作;如该spring-data-redis-DATAREDIS-315可通过SpringData提供的各种数据访问技术的编程接口和SpringDataRedis提供的驱动信息对Jedis客户端提供的应用程序操作端口进行扩展。
另外,鉴于持续集成测试及单元测试功能出现缺陷,会导致部分功能不可用,甚至报异常,可采用以下方式来避免上述缺陷:
1)将配置文件集成至集群中,并调试可用;
2)将RedisTemplate中的API进行了分类,如可分为跑命令在任意一个节点上和跑命令在所有节点上,或者分为集群不支持命令或者等;
3)集群新增命令来使得API实现;
4)API调试通过并完成相应的单元测试;
5)无缝融合方法注解功能(SpringCacheAbstraction),即可解耦应用系统方法级别的接入;
6)将存储键前缀调整至应用|模块|Key级别的方式,方便隔离不同应用之间的存储;
7)默认实现键值序列化功能,且简单可用;
8)将固定的配置文件抽象到jar包级别,使得接入更方便。
4、针对SpringCacheAbstraction(即缓存抽象模块):
该SpringCacheAbstraction可包括SpringCache单元和SpringCacheAbstraction单元,而SpringCache单元则像Spring对事务的支持一样,以Cache抽象允许使用各种Cache解决方案并且能够对编码具有最小的影响;SpringCacheAbstraction单元则提供多类注解,以能够实现对应用程序无侵入式的Cache增强。
优选的,SpringCacheAbstraction单元提供的注解可包括:
1)CachePut,可更新Cache而不需要影响方法的执行;
2)CacheEvict,可从Cache中删除特定的Key;
3)Cacheable,用以触发Cache操作;
4)Caching,能够组合多个Cache操作应用到一个方法上;
5)CacheConfig,可在各个类中共享同一个Cache设置。
下面基于实际应用效果进行详细说明:
表1-1
表2-1
表2-2
表3-1
表3-2
表3-3
上述的表1-1为本申请实施例中Redis-3.0.4version高可用性测试结果,参见表1-1可知,从可用性角度看,Redis3.0.4在数据不大的情况下,slave切换时间较短;当数据比较大时,slave需要从磁盘读取数据至内存,导致不能及时处理请求的情况发生,即具有高可用性。
上述的表2-1为Redis-3.0.4version负载测试结果,而表2-2则为Redis-2.6.14version负载测试结果,参见表2-1、表2-2可知,从负载方面看,VU数据集群明显高于非集群;而2.6.14在虚拟用户大于20的时候已经各种报错,并且集群吞吐量TPS也明显高于单机版,但响应时间稍慢。
上述的表3-1为insert测试结果,表3-2为Query测试结果,表3-3为Delete测试结果,综合表3-1至3-3可知,当前redis集群支持的最大并发数为60,当并发数大于60时候,TPS下降,且出现报错信息(例如:Error:System.err:java.net.SocketException:Nobufferspaceavailable(maximumconnectionsreached?):),而单机版只支持20的并发数。
综上所述,本申请实施例中的一种基于Redis集群的存储系统,可基于Redis3.0版本的基础上,通过使用集群方式来缓冲传统数据库压力,使得缓存容量方面从原来的1*100%提高到N*70%,进而可成功的支撑单条业务线缓存容量压力,同时也提升了系统的吞吐量;另外,在宕掉少于半数缓存服务器的情况下,还依然能保证缓存服务器的可用性;同时,也大大降低了开发成本,提升了运维效率。
以上所述仅为本发明较佳的实施例,并非因此限制本发明的实施方式及保护范围,对于本领域技术人员而言,应当能够意识到凡运用本发明说明书及图示内容所做出的等同替换和显而易见的变化所得到的方案,均应当包含在本发明的保护范围内。