【二】redis集群环境的搭建和API的使用

redis3.0以下版本不支持集群模式,所以需要事先准备好3.0及以上版本 我这里用的是4.0.14版本

一、集群的搭建

  1. 安装redis4.0版本

下载地址: http://download.redis.io/releases/redis-4.0.14.tar.gz

  1. 上传服务器,解压,编译
tar -zxvf redis-4.0.14.tar.gz
make
make install
  1. 创建集群需要的目录
mkdir -p /root/cluster
cd /root/cluster
mkdir 7000
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
  1. 修改配置文件 redis.conf
cp /root/redis-4.0.14/redis.conf /root/cluster
vi redis.conf
##修改配置文件中的下面选项
port 7000
daemonize yes
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

修 改 完 redis.conf 配置文件中的这些配置项之后把这个配置文件分别拷贝到7000 /7001 /7002 /7003 /7004 /7005 目录下面

cp /root/cluster/redis.conf /root/cluster/7000
cp /root/cluster/redis.conf /root/cluster/7001
cp /root/cluster/redis.conf /root/cluster/7002
cp /root/cluster/redis.conf /root/cluster/7003
cp /root/cluster/redis.conf /root/cluster/7004
cp /root/cluster/redis.conf /root/cluster/7005

注意:拷贝完成之后要修改 7001/7002/7003/7004/7005 目录下面 redis.conf 文件中的 port参数分别改为对应的文件夹的名称
   5. 分别启动这 6 个 redis 实例

cd /root/cluster/7000
redis-server redis.conf
cd /root/cluster/7001
redis-server redis.conf
cd /root/cluster/7002
redis-server redis.conf
cd /root/cluster/7003
redis-server redis.conf
cd /root/cluster/7004
redis-server redis.conf
cd /root/cluster/7005
redis-server redis.conf
  1. 看一下启动状态

在这里插入图片描述
   7. 安装ruby环境

## 安装ruby
yum install ruby

## 安装rubygems组件
yum install rubygems

## 安装redis与ruby的接口
gem install redis
  1. 创建集群
## 进入src目录
cd /root/redis-4.0.14/src

## 执行创建集群的命令
./redis-trib.rb create --replicas 1 192.168.1.160:7000 192.168.1.160:7001 192.168.1.160:7002 
192.168.1.160:7003 192.168.1.160:7004 192.168.1.160:7005

在这里插入图片描述
输入yes 配置完成
在这里插入图片描述
如上图所示 就是搭建成功了!

进入集群环境 redis-cli -c -p 7000

二、添加集群节点

  1. 启动需要添加的节点
cd /root/cluster/
mkdir 7006
cp /root/cluster/redis.conf /root/cluster/7006/
cd /root/cluster/7006/
vi redis.conf   ## 修改 redis.conf 中的 port 参数的值为 7006
redis-server redis.conf
  1. 将新节点加入集群中
cd /root/redis-4.0.14/src

./redis-trib.rb add-node 192.168.1.160:7006 192.168.1.160:7000

在这里插入图片描述
   3. 查看刚才新增的节点

redis-cli -c -p 7000 cluster nodes

在这里插入图片描述

增加了新的节点之后,这个新的节点可以成为主节点或者是从节点
把这个节点变成主节点,使用 redis-trib程序,将集群中的某些哈希槽移动到新节点里面,
这个新节点就成为真正的主节点了。

  1. 对集群中的哈希槽进行移动
cd /root/redis-4.0.14/src

./redis-trib.rb reshard 192.168.136.128:7000

系统会提示我们要移动多少哈希槽,这里移动 1000 个

在这里插入图片描述

提示你想要将哈希槽转出到哪个节点上, 这里输入你要添加哈希槽的节点id
我添加的是这个端口号为7003的
然后又会让你选择
你可以选择all(从其他所有主节点上转出)
可以自定义输入主节点id可以输入多个 按回车键分割 自定义完毕后输入done

在这里插入图片描述

然后选择yes就完事了

在这里插入图片描述

   5. 查看集群中各节点的状态

redis-cli -c -p 7000 cluster nodes

可以看到各个节点的级别和哈希槽区间

在这里插入图片描述

三、将某个节点变成从节点

前 面 我 们 已 经 把 这 个 新 节 点 添 加 到 集 群 中 了 , 现 在 我 们 要 让 新 节 点 成 为
192.168.136.128:7001 的从节点,只需要执行下面的命令就可以了,命令后面的节点 ID 就是
192.168.136.128:7001 的节点 ID

## 将7006端口的节点作为7001的从节点
redis-cli -c -p 7006 cluster replicate e97c1da7930ec5210f846585d78711b608a8fbbd

## 输入这条命令,如果如下图所示就是成功了
redis-cli -p 7000 cluster nodes | grep slave | grep e97c1da7930ec5210f846585d78711b608a8fbbd

在这里插入图片描述

四、删除集群中的节点

  1. 如果删除的是主节点,首先要将该节点中的哈希槽转移到其他主节点上,比如我删除7001号节点
cd /root/redis-4.0.14/src

./redis-trib.rb reshard 192.168.1.160:7000

系统会提示我们要移动多少哈希槽,这里移动 3654 个,因为 192.168.136.128:7003 节点有
3654 个哈希槽
然后系统提示我们输入要接收这些哈希槽的节点的 ID,这里使用 192.168.136.128:7003 的
节点 ID
然后要我们选择从那些节点中转出哈希槽,这里一定要输入 192.168.136.128:7003 这个节
点的 ID,最后输入 done 表示输入完毕
最后一步,使用下面的命令把这个节点删除

cd /root/redis-4.0.14/src/

./redis-trib.rb del-node 192.168.136.128:7000 需要删除的节点 ID
  1. 如果节点是从节点的,直接使用下面的命令删除即可。
cd /root/redis-4.0.14/src/
./redis-trib.rb del-node 192.168.136.128:7000 需要删除的节点 ID

五、API的使用

  1. 引入依赖
<properties>
    <!--springboot应用要求jdk最低1.8版本-->
    <java.version>1.8</java.version>
    <druid-version>1.0.16</druid-version>
    <!--声明使用框架的版本号,相当于一个常量-->
    <spring-version>5.2.5.RELEASE</spring-version>
    <mybatis-spring-version>1.3.0</mybatis-spring-version>
    <log4j.version>1.2.17</log4j.version>
    <slf4j.version>1.7.25</slf4j.version>
    <jackson-version>2.9.8</jackson-version>
</properties>
<dependencies>
    <!--引入spring web开发模块依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>

    <!--引入spring-data-redis-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.12</version>
        <scope>provided</scope>
    </dependency>
</dependencies>
  1. 自定义配置类
package com.baizhi.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @Author zxw
 * @Descript
 * @Time 2020/09/10 0:27
 */
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
        // 1.手动创建RedisTemplate
        RedisTemplate<Object,Object> redisTemplate = new RedisTemplate<>();
        // 2.设置redisConnectionFactory
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        // 3.自定义序列化方式 key为String   value为json格式
        // 好处: 提高可读性,方便在redis中查询
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        return redisTemplate;
    }
}
  1. 写启动类
package com.baizhi;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @Author zxw
 * @Descript
 * @Time 2020/09/10 0:38
 */
@SpringBootApplication
public class RedisClusterApplication {
    public static void main(String[] args) {
        SpringApplication.run(RedisClusterApplication.class, args);
    }
}
  1. 写配置文件
# 设置端口号
server:
  port: 8081
# 配置redis的集群地址
spring:
  redis:
    cluster:
      nodes: 192.168.136.128:7000,192.168.136.128:7001,192.168.136.128:7002,192.168.136.128:7003,192.168.136.128:7004,192.168.136.128:7005,192.168.136.128:7006
  1. 测试
package com.baizhi.test;

import com.baizhi.RedisClusterApplication;
import com.baizhi.entity.User;
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.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @Author zxw
 * @Descript
 * @Time 2020/09/10 0:26
 */
@SpringBootTest(classes = RedisClusterApplication.class)
@RunWith(SpringRunner.class)
public class TestRedisCluster {
    @Autowired
    private RedisTemplate redisTemplate;
    /**
     * 第一种API风格: ops风格
     * 用于测试: String类型
     */
    @Test
    public void test000(){
        // 获取操作字符串的API对象
        ValueOperations<Object, Object> ops = redisTemplate.opsForValue();
        ops.set("name","zxw");
        ops.set("heihei",new User("zxw123","123456"));
        
        Object name = ops.get("name");
        Object heihei = ops.get("heihei");
        System.out.println("name = " + name);
        System.out.println("heihei = " + heihei);
    }

    /**
     * 用于测试: set类型
     */
    @Test
    public void test001(){
        SetOperations setOps = redisTemplate.opsForSet();
        setOps.add("film","功夫","龙门客栈");
    }

    /**
     * 用于测试: zset类型
     */
    @Test
    public void test002(){
        ZSetOperations zsetOps = redisTemplate.opsForZSet();
        zsetOps.add("score", "zxw", 100.0);
    }

    /**
     * 用于测试: list类型
     */
    @Test
    public void test003(){
        ListOperations listOps = redisTemplate.opsForList();
        listOps.leftPushAll("names", "xiaoA", "xiaoB", "xiaoC");
    }

    /**
     * 用于测试: hash类型
     */
    @Test
    public void test004(){
        HashOperations hashOps = redisTemplate.opsForHash();
        hashOps.put("user","username","zxw");
    }

    /**
     * 用于测试: set类型
     * 第二种API风格: bound风格(链式调用)
     */
    public void test111(){
        redisTemplate.boundHashOps("bound").put("bound-key","bound-value");
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值