Redis的分片(Sharding或者Partitioning)技术是指将数据分散到多个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;

例如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实例;

参考:

http://redis.io/topics/partitioning

Redis的分片、预分片技术总结相关推荐

  1. redis分片_Redis分片

    redis分片 本文是我们学院课程的一部分,标题为Redis NoSQL键值存储 . 这是Redis的速成课程. 您将学习如何安装Redis和启动服务器. 此外,您还会在Redis命令行上乱七八糟. ...

  2. 技术干货 | 人大金仓KFS精准过滤和分片并行入库技术解析

    "技术干货"是人大金仓推出的系列主题内容.本期展示的是人大金仓KFS V2.0通过精准过滤和基于表的分片并行入库特性来提升数据的入库效率,打破传统数据同步性能瓶颈,为用户提供极致高 ...

  3. 在线文件/文档预览/分页分片预览 之开源kkfileview(word转pdf,pdf截取,pdf转图片,Aspose jobConverter , OpenOffice ,libreoffice )

    前提说明 浏览器不能直接浏览word文件,但可以浏览pdf文件!!! 可以后台把word,excel 转成成pdf.然后给前端预览: 业界常用的开源工具有:Aspose jobConverter ,  ...

  4. Redis分布式缓存集群技术

    Redis分布式缓存集群技术(也支持持久化),是关系型数据库的互补产品 特点:追求高性能\高并发,对数据一致性要求比数据库要差一些. # 1. Redis在集群架构中的角色及工作流程     1)内存 ...

  5. 自然语言处理中的预训练技术发展史

    公众号关注 "视学算法" 设为 "星标",重磅干货,第一时间送达! 本文作者:张俊林 https://zhuanlan.zhihu.com/p/49271699 ...

  6. 高速串行总线设计基础(八)揭秘SERDES高速面纱之CML电平标准与预加重技术

    文章目录 前言 物理信号 预加重 差分传输线 参考资料 前言 对于数字工程师来说,我们可能关注的仅仅是本文中的差分信号电平标准以及预加重技术,CML电平标准是Transceiver技术的首选,在Xil ...

  7. 【计算机网络】网络层 : IP 数据报分片 ( 数据分片机制 | 分片示例 | 三种数据长度单位 )

    文章目录 一.最大传送单元 MTU 二.分片机制 ( 标识.标志.片偏移 ) 三.分片机制 示例 四.IP 数据报首部中的相关数据长度单位 一.最大传送单元 MTU 最大传送单元 MTU : MTU ...

  8. 【预训练模型】一文串起从NLP到CV 预训练技术和范式演进

    主题是深度学习中的预训练技术发展,基本思路是顺着CV和NLP双线的预训练技术发展演进.看他们怎么影响和交织. 序言 会大致的看一下,在2013年,在CNN时代的word2vec,在2020年,Bert ...

  9. 一文串起从NLP到CV 预训练技术和范式演进

    本文首发于微信公众号:包包算法笔记.包大人班车原创内容分享. 主题是深度学习中的预训练技术发展,基本思路是顺着CV和NLP双线的预训练技术发展演进.看他们怎么影响和交织. 序言 会大致的看一下,在20 ...

最新文章

  1. tidb mysql 协议_TiDB源码阅读(二) TiDB中的MySQL协议
  2. View及ViewGroup的事件分发及传递(一)
  3. C语言ATD1SC,2020-10-13_ATD(模数转换)模块介绍
  4. CodeForces - 1141D Colored Boots(暴力+水题)
  5. 数字图像处理系统组成 及研究内容
  6. python顺序结构实验报告_Python 数据结构 之 串 的顺序存储结构
  7. Java EE业务处理流程与XML的引入
  8. lombok的相关注解使用
  9. java swing 窗口事件_Javaswing多类窗口怎么写按钮事件呢?
  10. centos7当中的systemd及systemctl(节选)
  11. centos6+nagios3.3.1+nrpe2.12
  12. Centos6.5不支持ip nets命令
  13. vs python opencv配置_OPENCV入门教程二:opencv+VS2015开发环境配置
  14. saltstack的探索-利用脚本增加用户
  15. 小米8 微信支付 java_小米微信WAP支付SDK接入指南
  16. jsDoc的使用文档
  17. ajaxFileUpload上传文件
  18. Vim的ZZ、ZQ和Ctrl-Z,提高浏览效率
  19. rⅰd的意思_自动挡车型上的P、R、N、D、S、L是什么意思?你懂吗?
  20. UIPATH 浏览器在新标签页中执行操作

热门文章

  1. python实现微信小游戏打飞机代码
  2. Activity之间的简单跳转
  3. CSS练习_云层效果
  4. 线程的生命周期 和 线程的通讯
  5. IO流——字节流的使用
  6. mysql innodb_file_per_table=1_mysql-5.7 innodb_file_per_table 详解
  7. mysql 无法创建视图_mysql无法创建视图怎么办
  8. 顶岗实习周记java方向_会计学院顺利召开2021届毕业生顶岗实习动员大会
  9. oracle hibernate 主键,oracle hibernate 主键自增
  10. chrome浏览器开发者模式header请求参数“Request Payload“找不到的问题