redis3.0以下版本不支持集群模式,所以需要事先准备好3.0及以上版本 我这里用的是4.0.14版本
一、集群的搭建
- 安装redis4.0版本
- 上传服务器,解压,编译
tar -zxvf redis-4.0.14.tar.gz
make
make install
- 创建集群需要的目录
mkdir -p /root/cluster
cd /root/cluster
mkdir 7000
mkdir 7001
mkdir 7002
mkdir 7003
mkdir 7004
mkdir 7005
- 修改配置文件 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
- 看一下启动状态
7. 安装ruby环境
## 安装ruby
yum install ruby
## 安装rubygems组件
yum install rubygems
## 安装redis与ruby的接口
gem install redis
- 创建集群
## 进入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
二、添加集群节点
- 启动需要添加的节点
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
- 将新节点加入集群中
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
程序,将集群中的某些哈希槽移动到新节点里面,
这个新节点就成为真正的主节点了。
- 对集群中的哈希槽进行移动
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
四、删除集群中的节点
- 如果删除的是主节点,首先要将该节点中的哈希槽转移到其他主节点上,比如我删除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
- 如果节点是从节点的,直接使用下面的命令删除即可。
cd /root/redis-4.0.14/src/
./redis-trib.rb del-node 192.168.136.128:7000 需要删除的节点 ID
五、API的使用
- 引入依赖
<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>
- 自定义配置类
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;
}
}
- 写启动类
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);
}
}
- 写配置文件
# 设置端口号
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
- 测试
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");
}
}