Redis的分片(Sharding或者Partitioning)技术是指将数据分散到多个Redis实例中的方法,分片以后,每一个redis拥有一部分原数据集的子集。在数据量很是大时,这种技术可以将数据量分散到若干主机的redis实例上,进而减轻单台redis实例的压力。分片技术可以以更易扩展的方式使用多台计算机的存储能力(这里主要指内存的存储能力)和计算能力:redis
(1)从存储能力的角度,分片技术经过使用多台计算机的内存来承担更大量的数据,若是没有分片技术,那么redis的存储能力将受限于单台主机的内存大小。算法
(2) 从计算能力的角度,分片技术经过将计算任务分散到多核或者多台主机中,可以充分利用多核、多台主机的计算能力。服务器
下面将以举例的方式说明分片技术及其存在的优点:分布式
示例1:未采用分片技术,有1000万条用户信息数据,以键值对:UsrID:UsrInfo的形式存储在一个redis实例中,此时全部的用户信息都会存储在一个redis实例中,对这1000万条数据的全部插、查、删、该操做压力都会集中在这个redis所在的主机上;此时所要考虑的问题不只有存储和操做对该主机的压力,还有该主机失效时将致使全部操做都没法进行的问题。以下图1所示:代理
图1 单redis实例进程
示例2:采用分片技术;有1000万条用户信息数据,以键值对:UsrID:UsrInfo的形式存储于redis中,此时有4台主机,每台主机运行一个Redis实例:主机A (Redis1)、主机B(Redis2)、主机C(Redis3)、主机D(Redis4),分片时算法为:事务
redis_index = 用户的ID % 4 + 1;ip
例如ID为10000654则可获得到redis_index的值:10000654 % 4 + 1 = 1,即用户10000654的信息将被放到Redis1上,全部对用户1000654的操做也将被分片到Redis1上;假如用户ID以顺序方式出现,这1000万条用户信息将被平均分配到这四台主机的各Redis实例上,以下图2所示:内存
图2 采用分片算法路由
采用分片以后,数据将被分散到4个redis实例中,对数据的操做也被分散到每一个redis实例中,此时单台主机的压力将大大减轻。
分片的部署,即实例2中分片算法被放在哪里?是在分片时须要首先考虑的问题,分片部署方式通常分为如下三种:
(1)在客户端作分片;这种方式在客户端肯定要链接的redis实例,而后直接访问相应的redis实例;
(2)在代理中作分片;这种方式中,客户端并不直接访问redis实例,它也不知道本身要访问的具体是哪一个redis实例,而是由代理转发请求和结果;其工做过程为:客户端先将请求发送给代理,代理经过分片算法肯定要访问的是哪一个redis实例,而后将请求发送给相应的redis实例,redis实例将结果返回给代理,代理最后将结果返回给客户端。
(3)在redis服务器端作分片;这种方式被称为“查询路由”,在这种方式中客户端随机选择一个redis实例发送请求,若是所请求的内容再也不当前redis实例中它会负责将请求转交给正确的redis实例,也有的实现中,redis实例不会转发请求,而是将正确redis的信息发给客户端,由客户端再去向正确的redis实例发送请求。
上面主要描述了分片的优势,固然分片的存在也有缺陷,例如:
(1) 一般没法支持涉及多键的操做;在redis中有不少一次操做多个key的操做,例如求集合交集的SINTER操做,该操做将涉及到多个键,而这多个键有可能被分片到不一样的redis实例中,此时就没法执行这种操做。
(2)Redis的事务操做中涉及多个键时也不能用;
(3)分片将致使数据处理更加复杂;例如在分片过程当中,随着redis实例的增长,数据备份等操做都将会变得更加复杂。
(4)Redis目前不支持动态分片操做,扩容和缩容操做都会比较复杂,尤为分片操做部署在客户端时,须要从新配置和启动客户端。在使用过程当中缩容用的很少,扩容能够采用后面介绍的预分片策略来缓解此问题。
预分片技术
在正常运营环境中,通常所存储的数据会逐渐增长,可能今天只要10个redis实例就能应付,可是到了一年之后就须要50个redis实例才能支撑,所以,redis的扩容是常常用到的功能,在redis的分布式部署中,有预分片技术是很是好用的方法之一;
预分片技术是指在开始时就启动足够多的redis实例(例如32或64个,估计一下够之后扩展用就好了),等到后续须要扩容的时候,只须要将其中一部分的redis实例转移到新增长的机子上便可,在redis实例迁移过程当中使用redis的复制功能能够最大限度的下降redis的停工时间甚至能够作到没有停工时间。因为redis实例是轻量级的进程,并且占用内存较少,这里指单纯的空的redis实例,一个空的redis实例大约占用1M的内存;所以,这种方式即不会占用太多系统开销,又便于实现;
Redis的预分片技术能够按照如下步骤进行实例迁移操做:
(1)在新机子上启动新的redis实例;
(2)将新redis实例做为slave将原redis实例做为master,将数据从原redis实例迁移到新redis实例上;
(3)中止客户端(分片操做在客户端上时)或代理服务器(分片操做在代理上)
(4)更新客户端或者代理服务器中的配置信息,去掉被迁移的原redis实例的ip和端口等信息,加上新启动redis实例的IP地址和端口;
(5)向新启动的redis发送SLAVEOF NOONE命令,终止新redis实例对原redis实例的从属关系;
(6)重启客户端程序或者代理程序,此时它们将会使用新的redis实例;
(7)关掉被迁移走数据的原redis实例;