Redis分片机制
文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。
前两篇文章对Redis主从复制和主从切换的知识点进行了介绍,但是也很明显的有一点小弊端:
需要定时进行主从复制会影响Redis性能。
主节点宕机后,从所有从节点选择进行主从切换。主从切换的过程中非服务不可用。
引入分片概念--分片机制的作用
而本篇文章主要谈谈Redis的分片机制,如果没有分片机制,Redis就被局限于单机所支持的内存容量。Redis的分片机制允许数据拆分存放在不同的Redis实例上,每个Redis实例只包含所有键的子集。可以减轻单台Redis的压力,提升Redis扩展能力和计算能力。如果我们只使用一个Redis实例,当Redis宕机将会直接停止服务,所以我们可以采取分片机制,将原本一台Redis实例维护的数据,改为由多个Redis实例共同维护这部分数据。
分片方案
(1)范围分片
分片需要将不同key映射到不同Redis实例上存储,所以key的映射规则需要制定一个算法,最简单的一个分片方案应该是范围分片。范围分片理解起来很简单,比如我们存储用户基本信息,我们制定一个算法将用户user_id从0到1000映射到实例A,user_id从1000到2000映射到实例B,以此类推。这个方案很轻松可以使用,但是引发了一个问题:我们需要维护user_id范围和映射实例之间的关系。而正是这个问题导致范围分片虽然简单,但是效率比其他分片方案低效许多,所以Redis中一般不会使用范围分片作为分片方案。
(2)哈希分片
比如我们目前有四个Redis实例,我们需要存储一个key。我们可以通过哈希函数crc32()将key名转换成一个长整型数字,然后对长整型数字对4取余,就可以得到映射的实例。但是这种分配方案一样存在弊端:当我们需要增加或移除Redis实例时,就会造成大量key无法被命中。所以这时候出现了一种哈希分片的高级形式--一致性哈希。一致性哈希有三大特性:
key哈希结果尽可能分配到不同Redis实例。
当实例增加或移除,需要保护已映射的内容不会重新被分配到新实例上。
对key的哈希应尽量避免重复。
但是在Redis中没有使用一致性哈希这个概念,而是引入了哈希槽。在Redis集群中共有16384个哈希槽,然后每个key通过哈希函数crc16()将key名转化成一个长整型数字再对16384取余,最终决定这个key存储的哈希槽。而每个Redis实例负责维护一部分哈希槽,所有实例共同维护所有的哈希槽。使用哈希槽最显而易见的特点就是Redis实例的增加或者移除很方便,而不需要暂停所有Redis实例服务。
分片实现
上一篇谈到主从切换的哨兵模式已经提到,哨兵模式可以实现高可用以及读写分离,但是缺点在于所有Redis实例存储的数据全部一致,所以Redis支持cluster模式,可以简单将cluster理解为Redis集群管理的一个插件,通过它可以实现Redis的分布式存储。
数据分片方式一般有三种:客户端分片、代理分片和服务器分片。
客户端分片
定义:客户端自己计算key需要映射到哪一个Redis实例。
优点:客户端分片最明显的好处在于降低了集群的复杂度,而服务器之间没有任何关联性,数据分片由客户端来负责实现。
缺点:客户端实现分片则客户端需要知道当前集群下不同Redis实例的信息,当新增Redis实例时需要支持动态分片,多数Redis需要重启才能实现该功能。
代理分片
定义:客户端将请求发送到代理,代理通过计算得到需要映射的集群实例信息,然后将客户端的请求转发到对应的集群实例上,然后返回响应给客户端。
优点:降低了客户端的复杂度,客户端不用关心后端Redis实例的状态信息。
缺点:多了一个中间分发环节,所以对性能有些取的损失。
服务器分片
定义:客户端可以和集群中任意Redis实例通信,当客户端访问某个实例时,服务器进行计算key应该映射到哪个具体的Redis实例中存储,如果映射的实例不是当前实例,则该实例主动引导客户端去对应实例对key进行操作。这其实是一个重定向的过程。这个过程不是从当前Redis实例转发到对应的Redis实例,而是客户端收到服务器通知具体映射的Redis实例重定向到映射的实例中。当前还不能完全适用于生产环境。
优点:支持高可用,任意实例都有主从,主挂了从会自动接管。
缺点:需要客户端语言实现服务器集群协议,但是目前大多数语言都有其客户端实现版本。
预分片
从上面可以清楚地看出,分片机制增加或移除实例是非常麻烦的一件事,所以我们可以考虑一开始就开启32个节点实例,当我们可以新增Redis服务器时,我们可以将一半的节点移动到新的Redis服务器。这样我们只需要在新服务器启动一个空节点,然后移动数据,配置新节点为源节点的从节点,然后更新被移动节点的ip信息,然后向新服务器发送slaveof命令关闭主从配置,最后关闭旧服务器不需要使用的实例并且重新启动客户端。这样我们就可以在几乎不需要停机时间时完成数据的移动。
分片机制的缺点
分片是由多台Redis实例共同运转,所以如果其中一个Redis实例宕机,则整个分片都将无法使用,所以分片机制无法实现高可用。
如果有不同的key映射到不同的Redis实例,这时候不能对这两个key做交集或者使用事务。
使用分片机制因为涉及多实例,数据处理比较复杂。
分片中对于实例的添加或删除会很复杂,不过可以使用预分片技术进行改善。
欢迎关注公众号:程序猿周先森。
本文由博客一文多发平台 OpenWrite 发布!
Redis分片机制的更多相关文章
- Redis Cluster数据分片机制
复制粘贴自: https://www.e-learn.cn/content/redis/2344485, 点击链接访问原文 仅供个人学习参考之用, 如有侵权, 请联系删除! 高级开发不得不懂的Redi ...
- redis分片和哨兵
1 Redis的使用 1.1 Redis入门案例 1.1.1 什么样的数据使用缓存 说明:使用缓存其实为了减少用户查询数据库的时间.如果数据频繁的变更.不适用缓存.缓存中的数据应该保存修改频率不高的数 ...
- Redis扩展机制
Redis扩展机制扫盲 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Redis的Avalibility解决方案有很多,比如Twemproxy,Codis, 一.Twempro ...
- 美团针对Redis Rehash机制的探索和实践
背景 Squirrel(松鼠)是美团技术团队基于Redis Cluster打造的缓存系统.经过不断的迭代研发,目前已形成一整套自动化运维体系,涵盖一键运维集群.细粒度的监控.支持自动扩缩容以及热点Ke ...
- Redis分片(分区)
分区的概念 分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集. 如果只使用一个redis实例时,其中保存了服务器中全部的缓存数据,这样会有很大风险,如果单台redis服 ...
- Redis Sentinel机制与用法说明【转】
本文来自:https://segmentfault.com/a/1190000002680804 概述 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Ma ...
- REDIS 事务机制
基本事务操作: 任何数据库都必须要保证一种原子执行操作:最基本的原子执行操作肯定是需要提供: 举一个例子来说明: 当对某个Key 做一个统计: 可能不同的Client做它那部分的统计,一段时间后,服务 ...
- redis过期机制
Redis会自己回收清理不用的数据吗? 如果能,那如何配置? 如果不能,如何防止数据累加后大量占用存储空间的问题? 之前一直接触Redis不是很深入,最近项目当中遇到一个需求场景,需要清空一些存放在R ...
- redis锁机制介绍与实例
转自:https://m.jb51.net/article/154421.htm 今天小编就为大家分享一篇关于redis锁机制介绍与实例,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要 ...
随机推荐
- lightoj 1060 - nth Permutation(组合数+贪心)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1060 题解:如果是不重复数的这些操作可以用康托展开的逆来求,如果是有重复数字出 ...
- dp递推 数字三角形,dp初学者概念总结
数字三角形(POJ1163) 在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大.路径上的每一步都只能往左下或 右下走.只需要求出这个最大和即可,不必给出 ...
- NOIP2002[提高组] 均分纸牌 题解
题面 题目保证有解即纸牌总数能被人数整除(N|T)每个人持有纸牌a[1]...a[m],我们可以先考虑第一个人 1.若a[1]>T/M,则第一个人需要给第二个人c[1]-T/M张纸牌,即把c[2 ...
- 微信公众号之获取openId
在小伙伴们开发微信公众号.小程序或者是在微信内置浏览器打开的项目时,会遇到的第一个问题就是如何获取openId,今天小编就给大家带来的是如何获取openId. 首先 我们要从微信开发者后台得到ap ...
- lambda表达式排序
lambda表达式排序简洁 1.给一个字符串数组: String[] atp = {"2016-06-28 08:00:00", "2017-12-05 19:17:32 ...
- JDBC处理mysql大数据
大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时是需要用程序把 ...
- thinkphp5.1导出excel文件第三方类库运用
若没安装请到:链接地址 https://www.phpcomposer.com/这里安装 composer 安装过的,cmd切换到项目根目录运行:composer require phpoffice/ ...
- Servlet+jsp用户登录加上验证码
最近公司有个项目被客户拿去进行漏洞扫描,发现用户登录太简单,容易被暴力破解.当然发现的问题很多,什么反射型XSS,存储型XSS,敏感信息泄露等等.但是我们今天不讲这么多,就说说如何修复暴力破解的问题. ...
- Java web 修改默认web部署路径
转载自:https://blog.csdn.net/lcczpp/article/details/79968070 在eclipse上面部署web项目后,它没有将你的项目文件放到tomcat 的目录下 ...
- Docker在IDEA中的使用以及如何部署到服务器
IDEA中实现一键部署到服务器 点击运行自动部署到服务器: 服务器上安装docker 1,添加yum源 # yum install epel-release –y# yum clean all# yu ...