1、搭建Redis5.0集群,要求三主三从
- 安装C语言需要的GCC环境
# 安装gcc-c++
yum install -y gcc-c++
# 安装wget
yum install -y wget
-
下载Redis5.0,并解压Redis源码压缩包
cd /opt/software # 创建集群安装目录/usr/redis-cluster/7001 mkdir -p /usr/redis-cluster/7001 # 下载Redis 5.0 wget http://download.redis.io/releases/redis-5.0.5.tar.gz # 解压缩 tar -zxvf redis-5.0.5.tar.gz .
-
编译Redis源码
cd /opt/software/redis-5.0.5/src # 编译 make install PREFIX=/usr/redis-cluster/7001 # 拷贝redis.conf文件到7001下 cp /opt/software/redis-5.0.5/redis.conf /usr/redis-cluster/7001/bin
-
编辑redis.conf文件,修改配置
# 关闭仅本机访问 # bind 127.0.0.1 # 设置端口 port 7001 # 开启集群支持 cluster-enabled yes # 关闭保护模式 protecte-mode no # 打开守护进程 daemonize yes
-
复制7001,创建70027006实例,并修改端口号对应为70027006
cd /usr/redis-cluster/ cp -r 7001 7002 cp -r 7001 7003 cp -r 7001 7004 cp -r 7001 7005 cp -r 7001 7006
-
创建启动集群脚本startup.sh,启动所有的实例
vi /usr/redis-cluster/startup.sh
cd 7001/bin ./redis-server redis.conf cd .. cd .. cd 7002/bin ./redis-server redis.conf cd .. cd .. cd 7003/bin ./redis-server redis.conf cd .. cd .. cd 7004/bin ./redis-server redis.conf cd .. cd .. cd 7005/bin ./redis-server redis.conf cd .. cd .. cd 7006/bin ./redis-server redis.conf cd .. cd ..
-
给脚本赋权
chmod u+x startup.sh
-
启动所有实例
sh startup.sh
-
创建Redis集群(创建时Redis里不要有数据)
./redis-cli --cluster create 192.168.62.121:7001 192.168.62.121:7002 192.168.62.121:7003 192.168.62.121:7004 192.168.62.121:7005 192.168.62.121:7006 --cluster-replicas 1
-
集群验证
./redis-cli -h 127.0.0.1 -p 7001 -c # 查看集群信息 cluster info # 查看集群节点信息 cluster nodes
2、添加一主一从(Master4和Slaver4)
-
创建7007节点
mkdir /usr/redis-cluster/7007 cd /opt/software/redis-5.0.5/src/ make install PREFIX=/usr/redis-cluster/7007 cp /opt/software/redis-5.0.5/redis.conf /usr/redis-cluster/7007/bin/
-
修改redis.conf配置文件
# 关闭仅本机访问 # bind 127.0.0.1 # 设置端口 port 7007 # 开启集群支持 cluster-enabled yes # 关闭保护模式 protecte-mode no # 打开守护进程 daemonize yes
# 提前拷贝一份7008做从节点,修改redis.conf配置文件port 7008 cp -r /usr/redis-cluster/7007 /usr/redis-cluster/7008
-
启动7007节点
cd 7007/bin ./redis-server redis.conf
-
添加7007节点作为新节点
./redis-cli --cluster add-node 192.168.62.121:7007 192.168.62.121:7001
-
给刚添加的7007节点分配slot(连接上原集群其中的一个节点)
./redis-cli --cluster reshard 192.168.62.121:7007
- 输入要分配的slot数量3000
- 输入接收槽(7007)的节点ID
- 输入yes开始移动槽到目标节点id
-
启动7008节点
cd 7008/bin ./redis-server redis.conf
-
添加7008从结点,将7008作为7007的从结点
./redis-cli --cluster add-node 192.168.62.121:7008 192.168.62.121:7007 --cluster-slave --cluster-master-id 7007节点id
-
验证
./redis-cli -p 7001 -c # 查看集群信息 cluster info # 查看集群节点信息 cluster nodes
3、通过JedisCluster向RedisCluster添加数据和取出数据
-
创建maven项目,添加依赖
<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>
-
JedisCluster操作RedisCluster
package com.endless.redis; import org.junit.Test; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.SortingParams; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; /** * @Author jinhao */ public class Cluster { private static JedisCluster jedis; static { // 添加集群的服务节点Set集合 Set<HostAndPort> hostAndPortsSet = new HashSet<HostAndPort>(); // 添加节点 hostAndPortsSet.add(new HostAndPort("192.168.62.121", 7001)); hostAndPortsSet.add(new HostAndPort("192.168.62.121", 7002)); hostAndPortsSet.add(new HostAndPort("192.168.62.121", 7003)); hostAndPortsSet.add(new HostAndPort("192.168.62.121", 7004)); hostAndPortsSet.add(new HostAndPort("192.168.62.121", 7005)); hostAndPortsSet.add(new HostAndPort("192.168.62.121", 7006)); // Jedis连接池配置 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 最大空闲连接数, 默认8个 jedisPoolConfig.setMaxIdle(10); // 最大连接数, 默认8个 jedisPoolConfig.setMaxTotal(50); //最小空闲连接数, 默认0 jedisPoolConfig.setMinIdle(0); // 获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1 jedisPoolConfig.setMaxWaitMillis(2000); // 设置2秒 //对拿到的connection进行validateObject校验 jedisPoolConfig.setTestOnBorrow(true); jedis = new JedisCluster(hostAndPortsSet, jedisPoolConfig); } /** * 测试key:value数据 */ @Test public void testConn() throws InterruptedException { System.out.println("判断某个键是否存在:"+jedis.exists("user:1:name")); System.out.println("新增用户名:"+jedis.set("user:1:name", "endless")); System.out.println("是否存在:"+jedis.exists("user:1:name")); System.out.println("新增密码:"+jedis.set("user:1:password", "123456")); System.out.println("删除密码:"+jedis.del("user:1:password")); System.out.println("判断键密码是否存在:"+jedis.exists("user:1:password")); System.out.println("设置用户名的过期时间为10s:"+jedis.expire("user:1:name", 10)); TimeUnit.SECONDS.sleep(2); // 线程睡眠2秒 System.out.println("查看用户名的剩余生存时间:"+jedis.ttl("user:1:name")); System.out.println("查看用户名的剩余生存时间:"+jedis.ttl("user:1:name")); System.out.println("删除用户名的生存时间:"+jedis.persist("user:1:name")); System.out.println("查看用户名的剩余生存时间:"+jedis.ttl("user:1:name")); System.out.println("查看用户名所存储的值的类型:"+jedis.type("user:1:name")); } }