实现 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.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<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