实现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); } }