文档章节

redis的集群模式和哨兵模式

狂奔的熊二
 狂奔的熊二
发布于 2018/11/30 10:54
字数 1056
阅读 1175
收藏 10

redis的集群模式和哨兵模式

redis中集群模式

redis集群模式配置支持3.0及以上的版本。目的提高redis的可用性,但是只能保证一定程度的高可用

redis-cluster原理

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:

  • 节点 A 包含 0 到 5500号哈希槽.
  • 节点 B 包含5501 到 11000 号哈希槽.
  • 节点 C 包含11001 到 16384号哈希槽.

这种结构无论添加删除或者改变某个节点的哈希槽的数量都不会造成集群不可用的状态。

因为这种key分布在不同的节点,所以不能使用多keys的操作。(其实也可以变相的实现,但是在高负载的情况下存在风险)。

redis-cluster的主从复制模型

为了实现一定程度的高可用,比如某个节点挂掉的情况下,服务仍然能够正常使用。redis使用了主从复制模型,例如创建三个节点的集群A,B,C,在集群创建的时候或者过段时间为三个节点,添加从节点A1,B1,C1.此时整个集群有三个master节点和三个slave节点。A节点down掉的情况,集群推举A1为主节点继续服务。当然,如果A,A1都挂掉的情况,集群则无法使用。所以这也是为什么集群只能保证一定程度的高可用。

redis集群安装配置

Linux Redis集群安装

redis-cluster在Java中的应用

这里列出spring-boot中的配置方法和spring中的配置方式两种方式,根据自己的情况使用。(亲测可用

环境:

jdk:1.8

spring:

spring-boot:2.0.6

jedis:2.9.0(这个版本支持集群密码的配置,更早的版本不支持)

spring中的配置
Spring-boot中的配置

pom.xmL中引入jedis2.9依赖:

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

application.properties中redis的配置:

# Redis服务器地址
spring.redis.clusterNodes=ip:port,ip1:port1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=XXXX
# 连接超时时间(毫秒)
spring.redis.timeout=3600
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait=-1
# jedis超时
spring.redis.jedis.shutdown-timeout=100
# 连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0

接下来将这些配置读取到Spring 容器中:

/**
 * @Author:chenglitao
 * @Description:
 * @Date:2018/11/7 16:15
 */

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

/**
*@Author:chenglitao
*@Description:
*@Params:redis配置类
*@Date:2018/11/28 16:46
*
*/
@Configuration
public class JedisRedisConfig {
    @Value("${spring.redis.clusterNodes}")
    private String clusterNodes;
    @Value("${spring.redis.password}")
    private String password;
    @Value("${spring.redis.port}")
    private int port;
    @Value("${spring.redis.timeout}")
    private int timeout;
    @Value("${spring.redis.jedis.pool.max-idle}")
    private int maxIdle;
    @Value("${spring.redis.jedis.pool.min-idle}")
    private int minIdle;

    @Value("${spring.redis.jedis.pool.max-wait}")
    private long maxWaitMillis;
 
}

然后配置RedisCluster:

/**
 * @Author:chenglitao
 * @Description:
 * @Date:2018/11/7 16:13
 */


import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

import java.util.HashSet;
import java.util.Set;

/**
*@Author:chenglitao
*@Description:
*@Params: 
*@Date:2018/11/28 16:44
*
*/
@Configuration

public class RedisClusterConfig {
    @Autowired
    private JedisRedisConfig redisProperties;

    @Bean
    public JedisCluster jedisCluster() {
        String[] serverArray = redisProperties.getClusterNodes().split(",");
        //获取服务器数组,逗号分隔
        Set<HostAndPort> nodes = new HashSet<>();

        for (String ipPort : serverArray) {
            String[] ipPortPair = ipPort.split(":");
            nodes.add(new HostAndPort(ipPortPair[0].trim(), 									Integer.valueOf(ipPortPair[1].trim())));
        }

        GenericObjectPoolConfig config = new
                GenericObjectPoolConfig();
        config.setMaxTotal(3);
        return new JedisCluster(nodes, redisProperties.getTimeout(), 1000, 100, 			redisProperties.getPassword(), config);//需要密码连接的创建对象方式,如果没有密码,就使用没有密码的方法,这里有很多重载的构造方法。
    }

}

最后,写test方法测试下就ok了。

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import redis.clients.jedis.JedisCluster;

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoApplicationTests {
    @Autowired
    private JedisCluster jedisCluster;

    @Test
    public void contextLoads() {
        jedisCluster.set("aa", "111");
        String aa = jedisCluster.get("aa");
        System.out.println(aa);
    }
}

当然,在开发中需要封装基础的工具类操作。下面是基本的操作的封装,根据自己的需要修改即可。

© 著作权归作者所有

狂奔的熊二
粉丝 3
博文 24
码字总数 29285
作品 0
成都
程序员
私信 提问
Redis高级特性介绍及实例分析

本文将为大家介绍Redis的一些高级特性以及结合一个具体的实际案例来对Redis进行设计分析。 Redis基础类型回顾 String Redis中最基本,也是最简单的数据类型。注意,VALUE既可以是简单的Strin...

zfz_linux_boy
2017/02/26
0
0
简明实用:Redis 高级特性与案例介绍

本文将为大家介绍Redis的一些高级特性以及结合一个具体的实际案例来对Redis进行设计分析。 Redis基础类型回顾 String Redis中最基本,也是最简单的数据类型。注意,VALUE既可以是简单的Strin...

高效运维
2018/07/18
0
0
springboot redis笔记

1、首先创建一个springboot项目,就不解释了,然后添加一个redis引用 <dependency> </dependency> 2、在配置文件中添加redis的连接配置信息 spring:redis: 数据库索引 3、然后创建一个控制器...

朝如青丝暮成雪
2018/09/10
2.1K
0
Redis哨兵模式及配置详解

前言 在上一篇redis的主从复制中已经实现了redis的主从架构,但是如果redis的主从架构中出现宕机怎么办?如果从redis宕机相对简单一些,那么如果住redis的宕机就会比较麻烦,需要我们手动进行...

刘大磊的博客
2017/12/19
0
0
常用分布式工具组件 distributed-tool V1.4 发布

分布式常用工具组件 distributed-tool V1.4 发布了,之前版本,只支持redis的单点连接,1.4之后,新增支持了哨兵模式部署的redis连接方式。初始化方式: 当然,目前这个工具,暂时还不支持多...

徐安是个好人
2018/09/05
1K
1

没有更多内容

加载失败,请刷新页面

加载更多

聊聊nacos config的deleteConfig

序 本文主要研究一下nacos config的deleteConfig ConfigController nacos-1.1.3/config/src/main/java/com/alibaba/nacos/config/server/controller/ConfigController.java @Controller@Re......

go4it
昨天
5
0
面试:原来Redis的五种数据类型底层结构是这样的

关注我,可以获取最新知识、经典面试题以及微服务技术分享   在Redis中会涉及很多数据结构,比如SDS,双向链表、字典、压缩列表、整数集合等等。Redis会基于这些数据结构自定义一个对象系统...

ccww_
昨天
6
0
java发送html模板的高逼格邮件

最近做了一个监测k8s服务pod水平伸缩发送邮件的功能(当pod的cpu/内存达到指定阈值后会水平扩展出多个pod、或者指定时间内pod数应扩展到指定数量),一开始写了个格式很low的邮件,像下面这样...

码农实战
昨天
10
0
php-fpm配置文件详解/MariaDB密码重置、慢查询日志

来源:https://blog.csdn.net/Powerful_Fy php-fpm主配置文件路径:/usr/local/php-fpm/etc/php-fpm.conf #位于安装php安装目录下的etc/目录中,该文件中最后一行将配置文件指向:include=/...

asnfuy
昨天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部