`

4.Redis分布式连接和主从复制

阅读更多

一.Redis的分布式

Redis本身不支持分布式,通过Jedis客户端可以实现使用Redis分布式。

package com.gqshao.redis.connection;


import com.google.common.collect.Lists;
import com.gqshao.redis.utils.JedisUtils;
import org.junit.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.*;

import java.util.Arrays;
import java.util.List;


/**
 * Jedis 独有的分布式
 * 根据List<JedisShardInfo>中Redis顺序和key,指定固定的Redis
 * 扩容时使用 Pre-Sharding
 */
public class ShardedJedisTest {

    protected static Logger logger = LoggerFactory.getLogger(ShardedJedisTest.class);

    private static ShardedJedisPool pool = null;
    protected ShardedJedis jedis = null;


    @BeforeClass
    public static void createPool() {
        JedisPoolConfig poolConfig = JedisUtils.getMyDefaultJedisPoolConfig();
//        List<JedisShardInfo> shards = Arrays.asList(new JedisShardInfo("192.168.3.98", 6379)
//                , new JedisShardInfo("192.168.3.98", 6380));
        List<JedisShardInfo> shards = Lists.newArrayList();
        JedisShardInfo info1 = new JedisShardInfo("192.168.3.98", 6379);
        JedisShardInfo info2 = new JedisShardInfo("192.168.3.98", 6380);
        // 添加的顺序有意义
        shards.add(info1);
        shards.add(info2);
        pool = new ShardedJedisPool(poolConfig, shards);
    }

    @Before
    public void getResource() {
        jedis = pool.getResource();
    }

    @After
    public void destroyJedis() {
        pool.returnResource(jedis);
    }

    @AfterClass
    public static void destroyPool() {
        pool.destroy();
    }

    /**
     * 不同的key分配根据List<JedisShardInfo>中的顺序,分配不同的Redis连接
     */
    @Test
    public void testSet() {
        for (int i = 0; i < 20; i++) {
            try {
                logger.info(i + " - " + jedis.getShard("" + i).getClient().getHost()
                        + " : " + jedis.getShard(i + "").getClient().getPort());
                logger.info(jedis.set("" + i, "true"));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 修改List<JedisShardInfo>中的顺序,无法得到结果,确定该顺序是有意义的
     */
    @Test
    public void testGet() {
        for (int i = 0; i < 20; i++) {
            try {
                logger.info(i + " - " + jedis.getShard(i + "").getClient().getHost()
                        + ":" + jedis.getShard(i + "").getClient().getPort() + " ? " + jedis.get("" + i));

            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

 

二.Redis主从复制

redis的主重复制有两种方式,第一种是写在.conf配置文件中,第二种是通过命令slaveof ip port 或 slaveof no one

slaveof no one 之后,当前Redis节点提升为Master但之前数据不会丢失,所以通过程序动态的设置主从复制可以解决Redis单点故障的问题

package com.gqshao.redis.connection;


import com.gqshao.redis.utils.JedisUtils;
import org.junit.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;


/**
 * slaveof 和 slaveofNoOne方法可以在运行中动态设置服务器为Master或Slave
 */
public class SlaveofTest {

    protected static Logger logger = LoggerFactory.getLogger(SlaveofTest.class);

    private static JedisPool pool1 = null;
    protected Jedis jedis1 = null;

    private static JedisPool pool2 = null;
    protected Jedis jedis2 = null;


    @BeforeClass
    public static void init() {
        JedisPoolConfig poolConfig = JedisUtils.getMyDefaultJedisPoolConfig();
        // timeout设置为0,解决JedisConnectionException
        pool1 = new JedisPool(poolConfig, "192.168.3.98", 6379, 0);
        pool2 = new JedisPool(poolConfig, "192.168.3.98", 6380, 0);
        logger.info("----------------------create resource----------------------");
    }

    @AfterClass
    public static void destroy() {
        pool1.destroy();
        pool2.destroy();
    }

    @Before
    public void initJedis() {
        jedis1 = pool1.getResource();
        jedis2 = pool2.getResource();
    }

    @After
    public void destroyJedis() {
        pool1.returnResource(jedis1);
        pool2.returnResource(jedis2);
    }

    /**
     * 测试主从复制 注意设置Slave之后需要时间复制数据
     */
    @Test
    public void test() {
        // 设置 Redis2为Redis1的slave
        logger.info("jedis1 slaveof no one");
        jedis1.slaveofNoOne();
        logger.info("jedis2 slaveof 192.168.3.98 6379");
        jedis2.slaveof("192.168.3.98", 6379);

        try {
            jedis2.set("key", "value");
        } catch (Exception e) {
            logger.warn("由于设置的原因slave为read only");
        }

        // 主从复制 Redis1中保存数据Redis2中可以读取
        logger.info("jedis1.set mykey1 myvalue1 : " + jedis1.set("mykey1", "myvalue1"));
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        logger.info("jedis2.get mykey1: " + jedis2.get("mykey1"));

        // 单点问题解决思路(思路启用Redis2为Master,Redis1为SlaveOf Redis1)
        // 提升Redis2为Master,读取刚才的数据,重启Redis1,将Redis2设置为Redis1的Master
        jedis2.slaveofNoOne();
        // 测试值仍然存在
        logger.info("jedis2.get again : " + jedis2.get("mykey1"));
        // Redis2中存入数据
        logger.info("jedis2.set mykey2 myvalue2 : "+jedis2.set("mykey2", "myvalue2"));
        // Redis1设置为Redis2的slave
        jedis1.slaveof("192.168.3.98", 6380);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        // 测试jedis1中读取数据
        logger.info("jedis1.get mykey2 : " + jedis1.get("mykey2"));

        logger.info("jedis1 slaveof no one");
        jedis1.slaveofNoOne();
        jedis1.del("mykey1", "mykey2");
        jedis2.del("mykey1", "mykey2");
    }

}

 

 

 

 

0
1
分享到:
评论

相关推荐

    redis5和6版本的安装包.rar

    4. Redis集群和主从复制: - Redis集群提供数据的高可用性和水平扩展,通过`redis-trib.rb`工具配置。 - 主从复制让数据备份,提高可用性,主节点写入,从节点同步。 5. Redis命令行工具: - `redis-cli`是官方...

    Redis 详细教程(基于 Redis 6.2.x 版本)

    - 配置复制和主从切换:确保高可用性,避免单点故障。 - 监控和调优:定期监控 Redis 性能,调整配置参数以应对负载变化。 6. Redis 在实际应用中的场景 - 缓存:加速网页渲染,减少数据库压力。 - 消息队列:...

    redis教案.docx

    此外,Redis 还支持集群模式(Cluster)、哨兵模式(Sentinel)和主从复制,以实现高可用性和数据冗余。哨兵模式可以监控 Redis 实例的状态,自动进行故障转移。集群模式则允许将数据分散在多个节点上,提高读写性能...

    C# winform中使用Redis

    5. **持久化和主从复制** Redis支持RDB(快照)和AOF(追加日志)两种持久化方式,以及主从复制以实现高可用性。在C#应用中,通常由Redis服务器自身配置和管理这些特性。 6. **连接池管理** StackExchange.Redis...

    redis笔计(第二版)

    Redis 以 BSD 许可证开源,提供多种数据结构,如字符串、列表、集合、有序集合和哈希表,且支持数据持久化和主从备份。 1.1 Redis 优势 - 性能:Redis 具有极高的读写速度,大约110000次/s的读取和81000次/s的写入...

    redis百万并发访问数据库测试

    8. **Redis的复制和主从模式**:通过主从复制,可以创建多个Redis实例作为从节点,分散读取压力,提高服务的可用性和并发处理能力。主从模式下,写操作在主节点执行,从节点同步数据并处理只读请求。 9. **Redis ...

    Redis三主三从集群(Cluster)搭建

    Redis Cluster 是 Redis 提供的一种分布式数据库解决方案,它采用了无中心架构,每个节点都保存部分数据和整个集群的状态,并与其他所有节点保持连接,确保数据的实时性和一致性。 官方推荐的最小配置是使用六个...

    ruby+ruvygems+redis.gem.rar

    Redis-4.0.2是Redis的稳定版本,提供了丰富的数据结构支持,如字符串、哈希、列表、集合和有序集合,以及发布/订阅、事务、持久化和主从复制等功能。 4. **搭建Redis集群**: Redis集群是Redis的一种分布式实现,...

    分布式session 解决方案

    通过这种方式,Session数据将被自动存储和检索自Redis,避免了网络调用的性能影响,同时也支持Redis的集群和主从配置。 在实际应用中,选择哪种分布式Session方案取决于具体的需求和资源限制。对于高并发、大规模的...

    Redis全量复制与部分复制示例详解

    Redis的主从复制是分布式系统中常见的数据同步方式,它将数据的一份副本存放在不同的节点上,确保数据的安全性和高可用性。全量复制和部分复制是Redis中两种不同的复制策略,它们各自适用于不同的场景。 全量复制...

    redis使用和集成

    它的优势在于速度快、数据结构丰富、支持持久化和主从复制。本文将详细介绍 Redis 的使用、集成以及其核心特性。 ### 一、NoSQL 与 Redis NoSQL 数据库是相对于传统的 SQL 关系型数据库而言的,它不采用固定的表...

    热redis面试题汇总

    Redis提供丰富的数据结构,支持持久化和主从复制,拥有事务功能;而Memcached主要是简单的键值存储,无持久化和复制功能,但其性能更高。 6. **Redis如何实现主从复制?** Redis主从复制是异步的,从节点通过发送...

    redis缓存实例,及安装文件

    此外,Redis还提供了事务(Transaction)、发布/订阅(Pub/Sub)模式、持久化(Persistence)和主从复制(Replication)等高级特性。 在开发实例中,你可以找到如何在应用程序中集成Redis的示例。这通常包括以下...

    redis安装包运行环境

    它支持多种数据结构,如字符串、哈希、列表、集合、有序集合,还提供了发布/订阅、事务、持久化、备份和主从复制等特性。由于其在内存中存储数据,因此读写速度极快,特别适合于需要高并发读写操作的应用场景。 ...

    Spring Data Redis Demo

    7. **Redis的持久化和主从复制** Redis提供了多种持久化选项,如RDB快照和AOF日志,确保数据安全。同时,主从复制功能可实现数据的高可用性。 8. **Redis事务** 尽管Redis本身不支持复杂的ACID事务,但Spring ...

    Redis基本使用.rar

    Redis的数据持久化和主从复制功能使其在生产环境中广泛应用。 2. **安装与启动** Redis的安装过程通常包括下载源码、编译和启动服务。在Linux环境下,可以通过编译安装并使用`redis-server`命令启动服务。Windows...

    在windows下一键搭建Redis集群

    5. **主从同步**:在Redis集群中,数据复制是自动进行的,由主节点负责写操作,从节点负责读操作。当一个主节点的数据发生变化时,它会将变更广播给其他节点,实现数据的一致性。在故障恢复时,从节点可以晋升为主...

    源码redis2.6中文注释版

    `replication.c`包含了复制和主从同步的逻辑。 五、事务 Redis支持简单的事务,通过`MULTI`、`EXEC`命令组合实现。`transaction.c`是事务处理的主要实现。 六、lua脚本支持 Redis 2.6开始支持内嵌的lua脚本执行,...

    chexagon/redis-session-manager

    3. **Redis**:内存数据结构存储系统,支持字符串、哈希、列表、集合和有序集合等多种数据类型,提供丰富的操作命令,并且支持持久化和主从复制。 4. **Session共享**:在分布式环境中,session共享是解决用户会话在...

Global site tag (gtag.js) - Google Analytics