一、作业要求
RedisCluster的安装、部署、扩容和Java客户端调用,如下图:
(1)搭建Redis5.0集群,要求三主三从,记录下安装步骤
(2)能够添加一主一从(Master4和Slaver4),记录下安装步骤
(3)能够通过JedisCluster向RedisCluster添加数据和取出数据
二、完成步骤
1. 搭建 Redis5.0 集群,要求三主三从
1.1 准备集群环境
安装 Redis 需要安装 C 语言需要的 GCC 环境,同时下载 Redis 的安装包需要用到 wget 命令
# 安装gcc-c++yum install -y gcc-c++# 安装wgetyum install -y wget
1.2 下载并解压安装包
cd /opt/lagou/software# 创建集群安装目录/usr/redis-cluster/7001mkdir -p /usr/redis-cluster/7001# 下载Redis 5.0wget http://download.redis.io/releases/redis-5.0.5.tar.gz# 解压缩tar -zxvf redis-5.0.5.tar.gz -C ../servers
1.3 编译 Redis 源码
cd /opt/lagou/servers/redis-5.0.5/src/# 编译make install PREFIX=/usr/redis-cluster/7001# 拷贝 redis.conf 文件到7001下cp /opt/lagou/software/redis-5.0.5/redis.conf /usr/redis-cluster/7001/bin
1.4 修改配置文件
cd /usr/redis-cluster/7001/bin# 修改配置文件vim redis.conf
# bind 127.0.0.1# 设置端口port 7001# 开启集群支持cluster-enabled yes# 关闭保护模式protecte-mode no# 打开守护进程daemonize yes
1.5 由 7001 复制生成其他实例
cd /usr/redis-cluster/cp -r 7001 7002cp -r 7001 7003cp -r 7001 7004cp -r 7001 7005cp -r 7001 7006
复制完毕后需要修改每个节点的配置文件,把各自的端口号修改即可
1.6 创建一键启动所有节点脚本
cd /usr/redis-clustervim start-all.sh
#!/bin/bashredisDir=/usr/redis-clusterfor i in 7001 7002 7003 7004 7005 7006docd $redisDir/$i/bin/&&./redis-server redis.confdone
# 创建完成后,更改脚本权限chmod 755 /usr/redis-cluster/start-all.sh# 启动/usr/redis-cluster/start-all.sh
1.7 创建 Redis 集群
cd /usr/redis-cluster/7001/bin./redis-cli --cluster create 192.168.31.121:7001 192.168.31.121:7002 192.168.31.121:7003 192.168.31.121:7004 192.168.31.121:7005 192.168.31.121:7006 --cluster-replicas 1
1.8 验证集群是否搭建成功

2.能够添加一主一从(Master4和Slaver4)
2.1 创建一个新节点
# 创建新节点所在的文件夹mkdir /usr/redis-cluster/7007# 到安装好的 redis 目录下cd /opt/lagou/servers/redis-5.0.5/src/# 编译make install PREFIX=/usr/redis-cluster/7007# 复制 redis.conf 到创建好的新节点目录cp /opt/lagou/servers/redis-5.0.5/redis.conf /usr/redis-cluster/7007/bin/
2.2 修改配置文件
复制过来之前改好的也行,复制过来以后只改端口即可
vim /usr/redis-cluster/7007/bin/redis.conf
# bind 127.0.0.1# 设置端口port 7007# 开启集群支持cluster-enabled yes# 关闭保护模式protecte-mode no# 打开守护进程daemonize yes
2.3 复制从节点并修改配置文件
cd /usr/redis-clustercp -r 7007/ 7008/
vim 7008/bin/redis.conf#修改端口即可
2.4 添加主节点
# 启动 7007 节点cd 7007/bin./redis-server redis.conf

cd 7007/bin./redis-cli --cluster add-node 192.168.31.121:7007 192.168.31.121:7001

给刚添加的 7007 节点分配 slot,连接上集群(连接集群中任意一个可用结点都行),执行 reshard
./redis-cli --cluster reshard 192.168.31.121:7007
2.5 添加从节点
# 启动 7008 节点cd /usr/redis-cluster/7008/bin./redis-cli redis.conf

./redis-cli --cluster add-node 192.168.31.121:7008 192.168.31.121:7007 --cluster-slave --cluster-master-id b8223ddc655581f762db2b2413db31558df2a3d5


添加成功
3.通过 JedisCluster 向 RedisCluster 添加数据和取出数据
<dependencies><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.9.0</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies>
/*** FileName: Cluster* Author: zhaozhuang* Date: 2021/4/6 下午10:52* Description:*/package com.zz.redis;import org.junit.Test;import redis.clients.jedis.HostAndPort;import redis.clients.jedis.JedisCluster;import redis.clients.jedis.JedisPoolConfig;import java.util.HashSet;import java.util.Set;import java.util.concurrent.TimeUnit;public class Cluster {private static JedisCluster jedis;static {// 添加集群的服务节点Set集合Set<HostAndPort> hostAndPortsSet = new HashSet<HostAndPort>();// 添加节点hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7001));hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7002));hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7003));hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7004));hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7005));hostAndPortsSet.add(new HostAndPort("192.168.31.121", 7006));// Jedis连接池配置JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();// 最大空闲连接数, 默认8个jedisPoolConfig.setMaxIdle(10);// 最大连接数, 默认8个jedisPoolConfig.setMaxTotal(50);//最小空闲连接数, 默认0jedisPoolConfig.setMinIdle(0);// 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1jedisPoolConfig.setMaxWaitMillis(2000); // 设置2秒//对拿到的connection进行validateObject校验jedisPoolConfig.setTestOnBorrow(true);jedis = new JedisCluster(hostAndPortsSet, jedisPoolConfig);}/*** 测试key:value数据*/@Testpublic void testKey() throws InterruptedException {System.out.println("判断某个键是否存在:"+jedis.exists("username"));System.out.println("新增<'username','wukong'>的键值对:"+jedis.set("username", "timo"));System.out.println("是否存在:"+jedis.exists("username"));System.out.println("新增<'password','password'>的键值对:"+jedis.set("password", "123456"));System.out.println("删除键password:"+jedis.del("password"));System.out.println("判断键password是否存在:"+jedis.exists("password"));System.out.println("设置键username的过期时间为10s:"+jedis.expire("username", 10));TimeUnit.SECONDS.sleep(2); // 线程睡眠2秒System.out.println("查看键username的剩余生存时间:"+jedis.ttl("username"));System.out.println("查看键username的剩余生存时间:"+jedis.ttl("username"));System.out.println("移除键username的生存时间:"+jedis.persist("username"));System.out.println("查看键username的剩余生存时间:"+jedis.ttl("username"));System.out.println("查看键username所存储的值的类型:"+jedis.type("username"));}}

