Redis分片(分区)

分区的概念

  分区是分割数据到多个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文件,并且从多个实例和主机备份持久化文件。

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

原文地址:https://www.cnblogs.com/shiw27/p/8360485.html

时间: 2024-08-27 23:41:55

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

Redis 分片实现 Redis Shard [www]

Redis 分片实现                                             Redis Shard https://www.oschina.net/p/redis-shard 分布式SQL引擎                                             Lealone https://www.oschina.net/p/lealone ChartSQL 详细介绍 https://www.oschina.net/p/chartsql F

redis分片技术

需求: 如果将全部数据都保存到一台redis中,那么如果该服务器损坏,则影响全部的服务: 使用单台redis内存设定一般不要超过1G,但是有些业务数据量很大,如果不修改内存,则数据无法存储: 方案: 采用redis分片技术: 优点: 1.使用redis分片可以实现内存数据的动态扩容: 2.使用分片,每台redis节点中尽可能保存1/n的数据量,防止数据的丢失: 3.对于用户而言,整个redis的分片就是一个服务:n台服务器作为一个整体的服务器共同为用户服务: 1. 分片搭建: 1.1复制配置文件

Nginx Redis redis分片 redis哨兵 redis集群 等 常用命令

Nginx  Redis  redis分片  redis哨兵  redis集群 等 常用命令 1.1.1 Nginx命令 前提:nginx的命令执行,必须在nginx的根目录中完成 命令: 1.启动nginx     start nginx 2.重启nginx     nginx -s reload 3.关闭nginx     nginx -s stop Linux命令 1.1.2 cd命令集 ifconfig  检查IP地址 cd命令是linux中最基本的命令语句,必须熟练掌握 cd / 返回

redis分片

本文是在window环境下测试 什么是分片 当数据量大的时候,把数据分散存入多个数据库中,减少单节点的连接压力,实现海量数据存储 那么当多个请求来取数据时,如何知道数据在哪个redis呢,redis有自己的算法,下图是负载均衡的理解 步骤: 第一步:分配端口号,启动redis服务 master1: 6500     master: 6501 第二步:测试     jar:   代码: /** * 测试,多个主节点,分片 */ @Test public void test02(){ //Gener

redis分片存储集群的搭建

环境说明: twemproxy 192.168.0.112:22122 centos6.5 redis 192.168.0.113:6379 centos6.5 redis 192.168.0.113:6380 centos6.5 twemproxy安装: [[email protected] src]# tar -zxf nutcracker-0.4.0.tar.gz  [[email protected] src]# cd nutcracker-0.4.0 [[email protected

codis实现redis分片和在线扩展

Codis是一个开源的分布式redis解决方案,由以下四个组件组成: codis-proxy:后端redis的代理,本事实现了redis协议. codis-config:是codis的管理配置工具,用于增删redis server.操作数据迁移. zookeeper:用来存放数据路由表和codis-proxy节点的元信息,codis-config发起的命令都会通过 zookeeper同步到各个存活的codis-proxy. codis-server:codis项目维护的一个 redis 分支,

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

写在最前,最近一直在研究redis的使用,包括redis应用场景.性能优化.可行性.这是看到redis官网中一个链接,主要是讲解redis数据分区的,既然是官方推荐的,那我就翻译一下,与大家共享. Partitioning: how to split data among multiple Redis instances. 分区:如何把数据存储在多个实例中. Partitioning is the process of splitting your data into multiple Redi

Redis 学习(三)redis服务器集群、客户端分片

下面是来自知乎大神的一段说明,个人觉得非常清晰,就收藏了. 为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在这种情况下,如何正确架构Redis呢? 首先,无论我们是使用自己的物理主机,还是使用云服务主机,内存资源往往是有限制的,scale up不是一个好办法,我们需要scale out横向可伸缩扩展,这需要由多台主机协同提供服务,即分布式多个Re

从Redis分区的优缺点来看适合的应用场景

正文 Redis Partitioning即Redis分区,简单的说就是将数据分布到不同的redis实例中,因此对于每个redis实例所存储的内容仅仅是所有内容的一个子集.分区(Partitioning)不仅仅是Redis中的概念,几乎是所有数据存储系统都会涉及到的概念,这篇文章将会在理解分区基本概念的基础之上进一步了解Redis对分区的支持. 一.我们为什么要分区 我们为什么要分区?分区的动机是什么?通常来说,Redis分区的好处大致有如下两个方面: 性能的提升,单机Redis的网络I/O能力