分区的概念

  分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。

  如果只使用一个redis实例时,其中保存了服务器中全部的缓存数据,这样会有很大风险,如果单台redis服务宕机了将会影响到整个服务。解决的方法就是我们可以采用分片/分区的技术,将原来一台服务器维护的整个缓存,现在换为由多台服务器共同维护内存空间。

分片的实现

说明与分析:

  关于redis的安装参照上一篇,默认安装好了redis.

  思路:采用在一台主机上实现分片的方式,所以只需要在该主机上配置启动三台redis的实例即可。因为redis默认使用的端口号为6379,所以这里我们分别使用6379、6380以及6381三个端口来实现。

  

配置:

  1. 进入到redis的安装目录下,创建一个shard文件夹,然后将redis的配置文件"redis.conf"复制一份,取名为"redis-6379.conf"(作为6379这台实例的配置文件)。然后将该文件移动到shard文件夹下,再将"redis-6379.conf"复制两份,一个叫"redis-6380.conf"(作为6380这台实例的配置文件),一个叫"redis-6381.conf"(作为6381这台实例的配置文件)。

  

  2. 修改6379这台实例的配置文件,因为端口6379默认就是redis的端口,所以只需要指定该实例的持久化片区(文件)即可。

  

  3. 修改6380实例的配置文件。

  • 修改该实例占用的端口为6380

  

  • 修改pid

  

  • 修改dump文件名

  

  4. 修改6381实例的配置文件。

  • 修改该实例占用的端口为6381

  

  • 修改pid

  

  • 修改dump文件名

  

启动与测试:

  1. 启动3台redis实例

  

  2. 测试

  redis分区有两种方式,对既定的key有不同的方式来选择这个key存放到哪个实例中,也就是说有不同的系统来映射某个key到某个Redis的服务。

  • 最简单的分区方式为范围分区,就是映射一定范围的对象到特定的Redis实例。比如,ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1,以此类推。
  • 另外一种方式是hash一致算法实现分区,对key值进行hash一致性计算后得到结果,最终将数据保存到某一台redis实例中,具体的hash一致性算法可以自行百度一下。

  说明:测试采用junit写的测试方法,方法中定义了一个redis分片的连接池,分别添加用于测试的三个节点实例,然后向redis中增加10个记录并使用Redis Desktop Manager这个工具查看添加结果。

@Test
public void test02(){
//定义redis的配置
PoolConfig poolconfig = new PoolConfig();
poolconfig.setMaxTotal(1000); //表示redis的最大连接数——最大1000个线程
poolconfig.setMinIdle(5); //表示最小空闲数量
//定义redis的多个节点机器
List<JedisShardInfo> list = new ArrayList<>();
//为集合添加参数
list.add(new JedisShardInfo("192.168.161.139", 6379));
list.add(new JedisShardInfo("192.168.161.139", 6380));
list.add(new JedisShardInfo("192.168.161.139", 6381));
//定义redis分片连接池
ShardedJedisPool jedisPool = new ShardedJedisPool(poolconfig, list);
//获取连接操作redis
ShardedJedis shardedJedis = jedisPool.getResource();
//向redis中添加20个记录查看分片结果
for(int i = 0; i < 10; i++){
//增加的记录格式为 key=NUM_i value=i
shardedJedis.set("NUM_"+i, ""+i);
}
}

  测试结果:

  

  

  

  说明:测试结果发现10个记录中有1个分到了6379区,3个分到了6380区,另外6个分到了6381区,因为是采用记录的key值来进行hash一致性算法来确定记录的存放区域,所以即使重新分区都不会改变记录的存放地址,所以仍然可以根据key值来获取到对应的value值。

分区的不足:

  1. 分区是多台redis共同作用的,如果其中一台出现了宕机现象,则整个分片都将不能使用,虽然是在一定程度上缓减了内存的压力,但是没有实现高可用。
  2. 涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。
  3. 涉及多个key的redis事务不能使用。
  4. 当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件。

  高可用的解决方案:可以采用哨兵机制实现主从复制从而实现高可用。

Redis分片(分区)的更多相关文章

  1. Redis Cluster 分区实现原理

    Redis Cluster本身提供了自动将数据分散到Redis Cluster不同节点的能力,分区实现的关键点问题包括:如何将数据自动地打散到不同的节点,使得不同节点的存储数据相对均匀:如何保证客户端 ...

  2. redis分片和哨兵

    1 Redis的使用 1.1 Redis入门案例 1.1.1 什么样的数据使用缓存 说明:使用缓存其实为了减少用户查询数据库的时间.如果数据频繁的变更.不适用缓存.缓存中的数据应该保存修改频率不高的数 ...

  3. Redis 分片实现 Redis Shard [www]

    Redis 分片实现                                             Redis Shard https://www.oschina.net/p/redis-s ...

  4. redis分片集群安装部署

    redis分片集群安装与部署 分片集群的优势 高可用.且方便扩展. 数据分片,多节点提供服务,提高性能,数据提供冗余备份. 分片集群部署 只需更改配置文件 部署架构:6个节点,3主3从.数据集分为3片 ...

  5. redis分片

    本文是在window环境下测试 什么是分片 当数据量大的时候,把数据分散存入多个数据库中,减少单节点的连接压力,实现海量数据存储 那么当多个请求来取数据时,如何知道数据在哪个redis呢,redis有 ...

  6. Redis分片机制

    文章原创于公众号:程序猿周先森.本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号. 前两篇文章对Redis主从复制和主从切换的知识点进行了介绍,但是也很明显的有一点小弊端: 需要定时进行主从复制 ...

  7. redis该如何分区-译文(原创)

    写在最前,最近一直在研究redis的使用,包括redis应用场景.性能优化.可行性.这是看到redis官网中一个链接,主要是讲解redis数据分区的,既然是官方推荐的,那我就翻译一下,与大家共享. P ...

  8. redis + 主从 + 持久化 + 分片 + 集群 + spring集成

    Redis是一个基于内存的数据库,其不仅读写速度快,每秒可以执行大约110000的写操作,81000的读取操作,而且其支持存储字符串,哈希结构,链表,集合丰富的数据类型.所以得到很多开发者的青睐.加之 ...

  9. 【转载】Redis多实例及分区

    主要看的这篇文章 http://mt.sohu.com/20160523/n451048025.shtml edis Partitioning即Redis分区,简单的说就是将数据分布到不同的redis ...

随机推荐

  1. C#中读写自定义的web 配置文件

    开发程序的过程中,有时候我们需要自己编写一个config文件,比如取名App.config, 然后写一些配置信息在里面.然后我们需要编写C#代码来对这个配置文件进行读写 比如:App.Config & ...

  2. 1.浅谈XXE漏洞攻击与防御

    XML基础 在介绍XXE漏洞前,先学习温顾一下XML的基础知识.XML被设计为传输和存储数据,其焦点是数据的内容,其把数据从HTML分离,是独立于软件和硬件的信息传输工具. XML是一种用于标记电子文 ...

  3. 将前台传回的HttpServletRequest转换成HashMap

    import java.util.HashMap;import java.util.Map;import java.util.Map.Entry;import java.util.Set; impor ...

  4. 【mysql远程连库】

    mysql连接远程库: 服务器端: 1.登陆服务器端,进入命令行,windows cmd; 2.设置用户.密码让指定的IP访问:MySQL -u root -p 或安装的快捷方式进入:MySQL Co ...

  5. MCP|ZCM|Investigating Lactococcus lactis MG1363 response to phage p2 infection at the proteome level(研究乳酸乳球菌MG1363在噬菌体p2感染后的蛋白质组水平变化)

    一.概述: 噬菌体是特异性感染并最终杀死其细菌宿主的病毒.他们在所有生态系统中发挥着关键的生态作用.尽管经过了几十年的研究,噬菌体与细菌宿主之间的相互作用仍然知之甚少.本研究使用无标记定量蛋白质组学来 ...

  6. puppet的一个Bug

    前篇文章写了使用puppet管理500多台服务器,当然只是一部分,最主要的还是puppet脚本的编写,这个我会在以后的文章中一点一点写出来. 今天要写的是puppet的一个bug,版本是puppet ...

  7. CF987B High School: Become Human 数学

    题意翻译 题目大意 输入一个 xxx ,一个 yyy ,求是 xyx^yxy 大还是 yxy^xyx 大. (1≤x,y≤109)(1≤x,y≤10^9)(1≤x,y≤109) 输入输出格式 输入格式 ...

  8. PAT天梯赛L3-005 垃圾箱分布

    题目链接:点击打开链接 大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住.所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的 ...

  9. 自动化测试 - Appium + Python史上最全最简环境搭建步骤

    一,为什么是Appium借一张图: 1.1 Appium优点 l  开源 l  跨架构:NativeApp.Hybird App.Web App l  跨设备:Android.iOS.Firefox ...

  10. windows cmd 透明化

    1 . 属性 -- 颜色 --不透明度 2 . 快捷键 : Ctrl+Shift+加号/减号 3. cmd 下快速查找文件 : dir a.txt /S