Redis分区
数据是怎样分布在多个Redis实例上的
分区是将你的数据分布在多个Redis实例上,以至于每个实例只包含一部分数据。
为什么分区是有用的呢
Redis分区有两个主要目标:
- 它允许更大的数据库,用许多计算机的内存总和。如果不进行分区,你将会受限于单台计算机的内存。
- 它允许将计算能力扩展到多核和多台计算机,将网络带宽扩展到多台计算机和网络适配器。
假设我们有4个Redis实例(R0, R1, R2, R3),其上有许多代表用户的key,比如user:1, user:2, ... 等等,那么在存储一个key的时候我们有多种方式。
最简单的一种方式是按照范围分区,即根据对象的映射范围将数据分配到指定的Redis实例上。例如,我们规定ID为0~10000的就分到R0,10001~20000到R1,以此类推。这种方式是可以的,但是有一个缺点是需要一张表来维护这个映射关系。这个表需要管理起来,而且每一个key都需要一个这样的表,因此Redis中的范围分区通常是不受欢迎的,因为它比其他分区方法效率低得多。
除了范围分区以外,另一种方法是哈希分区(hash partitioning):
第1步、取key,并应用哈希函数将其转换为一个数。例如,如果key是foobar,哈希函数式crc32,那么crc32(foobar)将输出93024922。
第2步、对这个数字使用模运算(取模)将它转换成0到3直接的数字,这样这个数字就可以映射到我的四个Redis实例之一。例如,93024922 % 4 = 2,因此foobar应该存储到R2实例上。
(PS:首先,对key做哈希运算,得到一个数字,然后对这个数字取模,以决定最终数据应该存放在哪个实例上)
分区的方法还有很多种,通过上面两个示例,你应该可以理解。哈希分区的一种高级形式称为一致性哈希,由几个Redis客户端和代理实现。
不同的分区实现
客户端分区 : 对于一个给定的key,客户端直接选择正确的节点来进行读写。许多Redis客户端都实现了客户端分区。
代理分区 : 客户端发送请求到一个代理,由代理来和Redis通信,代理会根据我们的配置来选择正确的Redis实例。
查询路由 : 你可以将你的查询发送到任何一个Redis实例,实例会将你的查询重定向到正确的服务器。
(PS:对于一个给定的key,分区的工作就是选择一个正确的Redis实例,那么这个选择的过程可以由客户端、代理 或者 Redis实例来做)
分区的不足之处
1、涉及多个key的操作通常是不支持的。对于映射到两个不同的Redis实例的key,你不能往这两个上执行插入操作。
2、涉及多个key的操作不能用Redis事务
3、分区粒度是key,因此不可能将一单个非常巨大的key(比如,一个非常大的sorted set)去切分数据
4、当使用分区的时候,数据处理会更复杂,对于实例你必须处理多个RDB/AOF文件,为了备份数据,需要从多个实例和主机聚合持久文件。
5、增加和删除容量(空间)变得更复杂。例如,Redis集群支持在运行时添加和删除节点的透明数据再平衡,但其他系统如客户端分区和代理不支持此功能。然而,一种叫做预分片的技术在这方面有帮助。
数据存储还是缓存?
当Redis用作数据存储时,给定的key必须总是映射到相同的Redis实例。当作为缓存时,如果给定节点不可用它不是一个大问题。
如果给定key的首选节点不可用,一致哈希实现通常能够切换到其他节点。类似地,如果添加一个新节点,部分新keys将开始存储在新节点上。
- 如果使用Redis作为缓存,使用一致哈希很容易进行伸缩。
- 如果Redis用作存储,则使用固定的keys-to-nodes映射,因此节点的数量必须是固定的,且不能改变。否则,就需要一个能够在节点之间重新平衡key的系统,当前Redis集群是可以做到这一点的。
Redis分区的更多相关文章
- 【原】Redis分区
Redis高级篇 分区 为什么分区? Redis中的分区主要有两个目的: 允许用多台机器的内存存放更大的数据集.如果没有分区,那么你只能存放单台机器内存的最大值的数据集. 允许用多核和多台机器提高计算 ...
- Redis 分区
分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集. 分区的优势 通过利用多台计算机内存的和值,允许我们构造更大的数据库. 通过多核和多台计算机,允许我们扩展计算能力:通 ...
- Redis分区探究
Redis比较好的分区算法是采用Hash分区算法 也就是我们可以将所有的server例如:user1,user2,user3.通过hash函数将key转化为一个数字然后求余找到需要存储的server. ...
- redis该如何分区-译文(原创)
写在最前,最近一直在研究redis的使用,包括redis应用场景.性能优化.可行性.这是看到redis官网中一个链接,主要是讲解redis数据分区的,既然是官方推荐的,那我就翻译一下,与大家共享. P ...
- 【转载】Redis多实例及分区
主要看的这篇文章 http://mt.sohu.com/20160523/n451048025.shtml edis Partitioning即Redis分区,简单的说就是将数据分布到不同的redis ...
- redis基础操作~~数据备份与恢复、数据安全、性能测试、客户端连接、分区
数据备份与恢复 数据备份redis save 命令用于创建当前数据库的备份. redis 127.0.0.1:6379> SAVE OK 该命令将在 redis 安装目录中创建dump.rdb文 ...
- redis哨兵(Sentinel)、虚拟槽分区(cluster)和docker入门
一.Redis-Sentinel(哨兵) 1.介绍 Redis-Sentinel是redis官方推荐的高可用性解决方案,当用redis作master-slave的高可用时,如果master本身宕机,r ...
- Redis 数据备份与恢复,安全,性能测试,客户端连接,管道技术,分区(四)
Redis 数据备份与恢复 Redis SAVE 命令用于创建当前数据库的备份. 语法 redis Save 命令基本语法如下: redis 127.0.0.1:6379> SAVE 实例 re ...
- Redis分片(分区)
分区的概念 分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集. 如果只使用一个redis实例时,其中保存了服务器中全部的缓存数据,这样会有很大风险,如果单台redis服 ...
随机推荐
- 【spring】-- jsr303参数校验器
一.为什么要进行参数校验? 当我们在服务端控制器接受前台数据时,肯定首先要对数据进行参数验证,判断参数是否为空?是否为电话号码?是否为邮箱格式?等等. 这里有个问题要注意: 前端代码一般上会对这些数据 ...
- 光纤网卡与HBA卡区别
1.简介 光纤网卡 ,指的是光纤以太网适配器,简称光纤网卡,学名Fiber Ethernet Adapter.传输输的是以太网通信协议,一般通过光纤线缆与光纤以太网交换机连接.按传输速率可以分为100 ...
- 【省选十连测之一】【线段树】【最小生成树之Kruskal】公路建设
目录 题意 输入格式 输出格式 数据范围 思路 代码 题意 有n个点,m条双向道路,其中第条公路的两个端点是u[i],v[i],费用是c[i]. 现在给出q个询问,每次给定一个L和一个R,要求你只能够 ...
- XIX Open Cup named after E.V. Pankratiev. GP of Poland(AMPPZ-2018)
A. Drone With a Camera 三分套三分. #include<cstdio> #include<cmath> #include<algorithm> ...
- 基于.net的Socket异步编程总结
最近在为公司的分布式服务框架做支持异步调用的开发,这种新特性的上线需要进行各种严格的测试.在并发性能测试时,性能一直非常差,而且非常的不稳定.经过不断的分析调优,发现Socket通信和多线程异步回调存 ...
- vscode1.30.1使用的electron3.0.10中的bug
PS C:\GitHub\vscode2\vscode> scripts\code.bat[13:07:19] Syncronizing built-in extensions...[13:07 ...
- centOS7上编译hadoop-2.7.7
一.阅读编译文档 在hadoop源码包根目录下有个一个BUINDING.txt的文件,文件说明了编译hadoop所需要的一些编译hadoop所需要的一些编译环境相关的东西.不同hadoop版本的要求都 ...
- CSS Sprite雪碧图
为了减少http请求数量,加速网页内容显示,很多网站的导航栏图标.登录框图片等,使用的并不是<image>标签,而是CSS Sprite雪碧图. 两个小例子: 淘宝首页的侧栏图 代码 &l ...
- ARVE: Augmented Reality Applications in Vehicle to Edge Networks
ARVE:车辆到边缘网中的增强现实应用 本文为SIGCOMM 2018 Workshop (Mobile Edge Communications, MECOMM)论文. 笔者翻译了该论文.由于时间仓促 ...
- 深入解析Java反射基础
博客原文:http://www.sczyh30.com/posts/Java/java-reflection-1/ - 这老哥写的特别好 一.回顾:什么是反射? 反射(Reflection)是Java ...