SpringBoot整合Redis集群

Redis集群

为什么需要搭建集群:

通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取。Redis是一个很好的Cache工具。大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿。由于内存大小的限制,使用一台 Redis 实例显然无法满足需求,这时就需要使用多台 Redis作为缓存数据库。但是如何保证数据存储的一致性呢,这时就需要搭建redis集群.采用合理的机制,保证用户的正常的访问需求.
采用redis集群,可以保证数据分散存储,同时保证数据存储的一致性.并且在内部实现高可用的机制.实现了服务故障的自动迁移.

集群搭建计划测试

主从划分:3台主机 3台从机共6台 端口划分7000-7005

集群搭建

1.创建集群文件夹: Mkdir cluster
2.在文件夹中创建多个文件:mkdir 7000 7001 7002 7003 7004 7005

复制配置文件

将redis根目录中的redis.conf文件复制到cluster/7000/ 并以原名保存
cp redis.conf cluster/7000/

编辑配置文件

1.注释本地绑定IP地址
SpringBoot整合Redis集群_第1张图片

2.关闭保护模式
SpringBoot整合Redis集群_第2张图片

3.修改端口号
SpringBoot整合Redis集群_第3张图片

4.启动后台启动
SpringBoot整合Redis集群_第4张图片

5.修改pid文件
SpringBoot整合Redis集群_第5张图片

6.修改持久化文件路径
image.png

7.设定内存优化策略
SpringBoot整合Redis集群_第6张图片

8.关闭AOF模式
SpringBoot整合Redis集群_第7张图片

9.开启集群配置
SpringBoot整合Redis集群_第8张图片

10.开启集群配置文件
SpringBoot整合Redis集群_第9张图片

11.修改集群超时时间
SpringBoot整合Redis集群_第10张图片

复制修改后的配置文件

将7000文件夹下的redis.conf文件分别复制到7001-7005中
image.png

批量修改

分别将7001-7005文件中的7000改为对应的端口号的名称,
修改时注意方向键的使用
SpringBoot整合Redis集群_第11张图片

通过脚本编辑启动/关闭指令
1.创建启动脚本 vim start.sh
SpringBoot整合Redis集群_第12张图片

2.编辑关闭的脚本 vim shutdown.sh
SpringBoot整合Redis集群_第13张图片

3.启动redis节点: sh start.sh
4.检查redis节点启动是否正常: ps -ef | grep redis
SpringBoot整合Redis集群_第14张图片

创建redis集群

指令:redis-cli --cluster create --cluster-replicas 1 192.168.126.129:7000 192.168.126.129:7001 192.168.126.129:7002 192.168.126.129:7003 192.168.126.129:7004 192.168.126.129:7005
SpringBoot整合Redis集群_第15张图片

Redis集群高可用测试

1.关闭redis主机.检查是否自动实现故障迁移.
2.再次启动关闭的主机.检查是否能够实现自动的挂载.
一般情况下 能够实现主从挂载
个别情况:宕机后的节点重启,可能挂载到其他主节点中(7001-7002)正确的.
SpringBoot整合Redis集群_第16张图片

Redis集群原理

Reids集群高可用推选原理

SpringBoot整合Redis集群_第17张图片
原理解析:
Redis的所有节点都会保存当前redis集群中的全部主从状态信息.并且每个节点都能够相互通信.当一个节点发生宕机现象.则集群中的其他节点通过PING-PONG检测机制检查Redis节点是否宕机.当有半数以上的节点认为宕机.则认为主节点宕机.同时由Redis剩余的主节点进入选举机制.投票选举链接宕机的主节点的从机.实现故障迁移.

Redis进群宕机条件

特点:集群中如果主机宕机,那么从机可以继续提供服务,当主机中没有从机时,则向其它主机借用多余的从机.继续提供服务.如果主机宕机时没有从机可用,则集群崩溃.
SpringBoot整合Redis集群_第18张图片

Redis hash槽储存数据原理

RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]%16384)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据.根据主节点的个数,均衡划分区间.
算法:哈希函数: Hash()=CRC16[key]%16384
SpringBoot整合Redis集群_第19张图片

当向redis集群中插入数据时,首先将key进行计算.之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据set到管理该槽的节点中.

SpringBoot整合Redis集群_第20张图片

在IDEA代码中引入

1.编辑pro配置文件

配置redis集群

redis.nodes=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005
2.编辑配置类
@Configuration //标识我是一个配置类 一般与@Bean注解联用
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {

@Value("${redis.nodes}")
private String nodes;   //node,node,node

@Bean
public JedisCluster jedisCluster(){
    Set nodesSet = new HashSet<>();
    String[] nodeArray = nodes.split(",");
    for (String node : nodeArray){  //host:port
        String host = node.split(":")[0];
        int port = Integer.parseInt(node.split(":")[1]);
        HostAndPort hostAndPort = new HostAndPort(host, port);
        nodesSet.add(hostAndPort);
    }
    JedisPoolConfig config = new JedisPoolConfig();
    config.setMaxTotal(1000);
    config.setMaxIdle(60);
    config.setMinIdle(20);
    return new JedisCluster(nodesSet,config);
}
}

3.编辑CacheAOP
SpringBoot整合Redis集群_第21张图片

你可能感兴趣的:(redis)