Redis集群

实现Redis集群

为什么需要搭建集群

rediis分片特点:
1.可以实现Redis内存数据的扩容。
2.redis分片本身没有高可用效果,如果宕机将直接影响用户的使用。
redis哨兵特点:
1.redis哨兵可以实现redis节点的高可用,但是哨兵本身没有实现高可用机制
2.redis哨兵有主从的结构,实现了内存数据的备份,但是没有实现内存扩容的效果。
升级:
需要redis内容扩展,同时需要redis高可用性,所以应该使用Redis集群。

Redis集群Hash槽的简述

Redis 集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽.集群的每个节点负责一部分hash槽。这种结构很容易添加或者删除节点,并且无论是添加删除或者修改某一个节点,都不会造成集群不可用的状态。
使用哈希槽的好处就在于可以方便的添加或移除节点。
当需要增加节点时,只需要把其他节点的某些哈希槽挪到新节点就可以了;
当需要移除节点时,只需要把移除节点上的哈希槽挪到其他节点就行了;
在这一点上,我们以后新增或移除节点的时候不用先停掉所有的 redis 服务。

关于Redis集群搭建问题

1.关闭所有的redis服务器
sh stop.sh
2.删除多余的文件
image.png
3.重启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

Redis入门案例

@Test
    public void testCluster(){
        Set nodes = new HashSet<>();
        nodes.add(new HostAndPort("192.168.126.129", 7000));
        nodes.add(new HostAndPort("192.168.126.129", 7001));
        nodes.add(new HostAndPort("192.168.126.129", 7002));
        nodes.add(new HostAndPort("192.168.126.129", 7003));
        nodes.add(new HostAndPort("192.168.126.129", 7004));
        nodes.add(new HostAndPort("192.168.126.129", 7005));
        JedisCluster jedisCluster = new JedisCluster(nodes);
        jedisCluster.set("cluster", "集群的测试!!!!");
        System.out.println(jedisCluster.get("cluster"));

    }

关于Redis中的脑裂现象

说明:当集群进行选举时,如果连续3次都出现了平票的结果,则可能出现脑裂的现象。
出现脑裂现象的概率为1/8=12.5%
预防:增加主节点的数量可以有效的降低脑裂现象的发生。
问题1.Redis集群中最多能存储16384个数据?
错误的,分区只负责数据的划分,数据的存储由内存决定。
问题2:Redis集群中最多由多少台主机?~~~~
16384台主机。一台主机占用一个槽道。

SpringBoot整合Redis集群

编辑pro配置文件

# 配置redis单台服务器
redis.host=192.168.126.129
redis.port=6379

# 配置redis分片机制
redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381

# 配置哨兵节点
redis.sentinel=192.168.126.129:26379

# 配置redis集群
redis.clusters=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

编辑RedisConfig配置类

@Configuration
@PropertySource("classpath:/properties/redis.properties")
public class JedisConfig {

    @Value("${redis.clusters}")
    private String clusters;

    @Bean
    public JedisCluster jedisCluster(){
        Set nodes = new HashSet<>();
        String[] nodesArray = clusters.split(",");
        for (String node : nodesArray){
            String host = node.split(":")[0];
            int port = Integer.parseInt(node.split(":")[1]);
            HostAndPort hostAndPort = new HostAndPort(host,port);
            nodes.add(hostAndPort);
        }
        return new JedisCluster(nodes);
    }
  }

编辑CacheAOP

image.png

你可能感兴趣的