实现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.删除多余的文件

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<HostAndPort> 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.129redis.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<HostAndPort> 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