【Redis】浅谈Redis-集群(Cluster)

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

文章目录

前言

下面我们来看看redis的集群实现。
redis集群即对redis的一种水平扩容主要解决并发写量太大有性能瓶颈单台redis容量限制的问题。
在这里插入图片描述

n>3一个集群至少有3个master新master的选举需要大于半数的集群master节点同意才能选举成功如果只有两个master节点其中一个宕机了达不到选举新master的条件。

1、集群实现

我们以三主三从来实现redis集群对redis.conf进行配置端口选择6379,6380,6381,6389,6390,6391。

1.1 创建cluster目录并将redis.conf复制到该文件夹

 mkdir cluster
cp /usr/local/redis/redis-6.2.1/redis.conf /opt/cluster/

1.2 复制redis.conf并进行配置

cp /opt/cluster/redis.conf /opt/cluster/redis-6379.conf
vim redis-6379.conf


daemonize yes
bind 192.168.23.102
dir /opt/cluster/
port 6379
dbfilename dump_6379.rdb
pidfile /var/run/redis_6379.pid
logfile "./log-6379.log"


# 开启集群设置
cluster-enabled yes
# 设置节点配置文件
cluster-config-file node-6379.conf
# 设置节点失联时间超过该时间(毫秒)集群自动进行主从切换
cluster-node-timeout 15000

其他节点的redis.conf一次进行配置只需要将其中的端口号改成相应端口就可以了。

1.3 启动redis查看启动状态

redis-server /opt/cluster/redis-6379.conf

其他端口的redis按照上述命令启动就OK。
在这里插入图片描述

出现如图则证明正常启动。

1.4 合成集群

进入redis的src目录执行redis-cli --cluster create --cluster-replicas 1 ip:端口合成集群

redis-cli --cluster create --cluster-replicas 1 192.168.23.102:6379 192.168.23.102:6380 192.168.23.102:6381 192.168.23.102:6389 192.168.23.102:6390 192.168.23.102:6391

在这里插入图片描述

回车后执行在执行过程中会让我们确定是否同意这样的分配输入yes即可。等待程序执行完成集群也就创建成功。

1.5 查看集群

进入redis中使用cluster nodes来查看集群信息。

redis-cli -h 192.168.23.102 -p 6379 


cluster nodes

在这里插入图片描述
如图我们可以看到各个redis节点的角色同时在slave节点上附带了对应master的id例如slave6390上附带的master节点的id159b9f1162492aef8cfb3b81c72dd7d2c87ba339而这个id对应的master就是6380。

1.6 集群读写操作

我们使用redis-cli -h 192.168.23.102 -p 6379 进入的redis中使用set name jiashn来写入数据。

我们发现写入数据是redis报错了告诉我们moved到6380。
这是因为在cluster中存在槽slots概念。redis集群将内部划分成16384个slots插槽合并成集合的时候会将每个slots映射到一个master上。例如上面的三个master映射范围如下

Redis主节点插槽slots范围
master16379[0-5460] 0是开始位置表示第一个插槽
master26380[5460-10922]
master36381[10922-16383]
slave1slave2slave3从节点没有插槽slave是用来对master做替补

而每个写入数据的key通过CRC16(key)%16384运算后得到slots的位置然后根据slots与master的映射关系找到对应的redis节点然后将数据写入的对应的master中。
如果需要在集群中读写数据不出现上面的报错问题那么在进入对应端口redis时在redis-cli后加上-c即redis-cli -c -h 192.168.23.102 -p 6379
在这里插入图片描述

从图中我们可以看到读写入数据成功了也提示我们slot的值以及对应master。

注1在同一个slot下不能使用多键值操作例如mset key1 value1 key2 value2

可以通过{}来定义组的概念从而使key中{}内相同的键值放在同一个slot中。例如mset key1{g1} jiashn key2{g1} queena

注2如果一段插槽的master都宕机了redis服务会继续吗
这取决于cluster-requure-full-coverage参数值
yes默认整个集群都无法提供服务
no宕机部分的插槽不能使用其他槽位正常使用

2、SpringBoot整合redis集群

2.1 引入包

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

2.2 设置配置

# 集群节点(host:port)多个之间用逗号隔开
spring.redis.cluster.nodes=192.168.23.102:6379,192.168.23.102:6380,192.168.23.102:6381,192.168.23.102:6389,192.168.23.102:6390,192.168.23.102:6391
# 连接超时时间毫秒
spring.redis.timeout=60000

2.3 使用RedisTemplate工具

@Autowired
private RedisTemplate<String, String> redisTemplate;

// 用下面5个对象来操作对应的类型
this.redisTemplate.opsForValue(); //提供了操作string类型的所有方法
this.redisTemplate.opsForList(); // 提供了操作list类型的所有方法
this.redisTemplate.opsForSet(); //提供了操作set的所有方法
this.redisTemplate.opsForHash(); //提供了操作hash表的所有方法
this.redisTemplate.opsForZSet(); //提供了操作zset的所有方法

总结

上述就是Redis的集群实现可能存在不详细的地方请大家多多指出。同时也希望对大家理解redis有所帮助。

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: redis

“【Redis】浅谈Redis-集群(Cluster)” 的相关文章