redis搭建集群

redis集群,顾名思义的就是由多台redis服务器,作为一个整体,为系统进行服务,redis集群是一个无中心化的一种服务模式,在redis集群中,由多组主从模式的简单集群共同组件成一个大的redis集群,集群中共同维护16384个slot(插槽),相对比而言,redis集群比主从复制,哨兵模式增加了写的能力,容错性能更强。下边开始搭建
1、准备配置文件redis6379.conf、redis6380.conf、redis6381.conf、redis6389.conf、redis6390.conf、redis6391.conf,此种配置文件在搭建集群的时候,会分为三组主从模式的简单集群,前三台为主机(master),后三个分别为从机(slave)。配置内容如下:

# 引入公共的配置部分
include ./redis.conf
#设置pid文件位置
pidfile ./redis_6379.pid
# 设置端口号
port 6379
# 设置rdb文件名称
dbfilename "dump6379.rdb"
# 以下是集群配置相关餐宿
# 开启集群模式
cluster-enabled yes
# 设置节点集群配置信息文件名称
cluster-config-file nodes-6379.conf
# 节点超时时间
cluster-node-timeout 15000

所有配置文件公共部分内容相同,只是需要修改端口和文件名称为指定的配置信息
2、启动各个节点
./redis-server XXX.conf
3、执行命令
进入到安装是编译redis的文件路径的src目录下
*/redis-5.0.9/src,使用redis-cli执行
注意:在高版本中,已经继承了ruby环境,如果低版本的,需要自己安装ruby环境
在这里插入图片描述

./redis-cli --cluster create --cluster-replicas 1 -a lixl123 192.168.1.35:6379 192.168.1.35:6380 192.168.1.35:6381 192.168.1.35:6389 192.168.1.35:6390 192.168.1.35:6391

命令中的 1 代表使用简单模式创建集群
-a 代表密码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
创建成功!
连接集群时候,有些变化,再次切换到安装路径下
./redis-cli -c -p + 主节点端口号(集群中任意一个都可以)
使用命令cluster nodes可以查看集群信息

java使用redisTemplate连接redis集群也有所调整,默认redisTemplate是用了lettuce连接redis,这里使用jedis连接

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>spring-boot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.4.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <!-- 排除lettuce -->
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 引入jedis相关的包 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置文件信息

server:
  port: 8981
spring:
  cache:
    redis:
      time-to-live: 10000
  redis:
    timeout: 5000
    database: 0
    password: lixl123
    cluster:
      nodes:
        - 192.168.1.35:6379
        - 192.168.1.35:6380
        - 192.168.1.35:6381
        - 192.168.1.35:6389
        - 192.168.1.35:6390
        - 192.168.1.35:6391
      max-redirects: 3
    jedis:
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 8
        min-idle: 0

配置类信息


    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);
        // 使用Jackson2JsonRedisSerialize 替换默认的jdkSerializeable序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }

测试方法


import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class TestRedisController {

    @Autowired
    RedisTemplate redisTemplate;

    @RequestMapping("/setRedis2")
    public String setRedis2(@RequestParam(value = "key",required = false)String key,@RequestParam(value = "value",required = false)String value){
        if (StringUtils.hasText(key)&&StringUtils.hasText(value)){
            redisTemplate.opsForValue().set(key,value);
        } else {
            redisTemplate.opsForValue().set("name","lixl123");
        }

        return "true";
    }

    @RequestMapping("/getRedis2")
    public String getRedis2(@RequestParam(value = "key",required = false)String key){
        String result = "";
        if (StringUtils.hasText(key)){
            result = (String)redisTemplate.opsForValue().get(key);
        } else {
            result = (String)redisTemplate.opsForValue().get("name");
        }

        return result;
    }
}

调用结果
在这里插入图片描述
在这里插入图片描述
tips:
cluster nodes 查看集群信息

cluster keyslot k1 #计算key的插槽值

cluster countkeysinslot + 插槽值 # 查看插槽内值的个数,只能查看自己服务器维护的插槽

cluster getkeysinslot + 插槽值 #返回插槽内的所有key

cluster-require-full-coverage: yes
当某个插槽的全部节点都宕机的情况下,整个集群将全部不能提供服务
如果该值设置为no,则宕机的插槽不能访问(读/写),其他插槽不受影响

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值