day10
day11
day12
day13
day14
1.Redis分片实现
1.1虚拟机部分应实现
虽然redis可以扩展内存空间的大小.但是如果需要存储海量的数据一味的扩大内存,其实效率不高-------准备多台redis,共同为用户提供缓存服务.在保证效率的前提下,实现了内存的扩容
由3台redis构成 端口号分别为6379/6380/6381, 如果需要准备多台redis则准备多个配置文件即可,注意其中的端口号.
命令:mkdir shards
命令:cd shards
创建命令:cp redis.conf shrads/端口号.conf
进行修改命令:vim 端口号.conf
修改prot和rRDB模式名称保持和文件名一致
启动多台命令: [root@localhost shards]# redis-server 6379.conf & redis-server 6380.conf & redis-server 6381.conf &
检查命令:ps -ef|grep redis
1.2spring整合redis应实现==(JedisShardInfo)==
public class TestRedisShards {
//思考:key=shards 存储到了哪台redis中? 如何存储的?
@Test
public void t(){
ArrayList<JedisShardInfo> shards = new ArrayList<>();
shards.add(new JedisShardInfo("192.168.126.129", 6379));
shards.add(new JedisShardInfo("192.168.126.129", 6380));
shards.add(new JedisShardInfo("192.168.126.129", 6381));
//2.创建分片对象
ShardedJedis shardedJedis = new ShardedJedis(shards);
shardedJedis.set("shards", "准备分片操作!!!!!");
System.out.println(shardedJedis.get("shards"));
}
}
1.3一致性hash算法介绍
在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系
hash取值区间: 8位16进制数 共有 232种可能性!!!-------十六进制可以换算为4位个2进制数------4*8=32,二进制只有两种(24)8=232次方
1.3.1一致性hash特性
一致性哈希算法是在哈希算法基础上提出的,在动态变化的分布式环境中,哈希算法应该满足的几个条件:平衡性、单调性和分散性 [4] 。
①平衡性(均衡性)是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题 [4] 。 利用虚拟节点实现数据平衡 (平衡数据不能做到绝对平均,只能是相对的)
②单调性是指在新增或者删减节点时,不影响系统正常运行 . 可以实现动态的数据迁移.
③分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据 [4]
鸡蛋不要放到一个篮子里。
1.4spring boot整合redis应实现
redis.properties配置文件编写好分片redis的地址和端口
#分片配置文件
redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381
在redisconfig中通过注解动态获取不同的内容存入数组中方便使用==(split(" : "))==
@Configuration //标识我是配置类
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {
@Value("${redis.nodes}")
private String redisNodes; //node,node,node
/*整合分片实现Redis内存扩容*/
@Bean
public ShardedJedis shardedJedis(){
String[] nodes = redisNodes.split(","); //节点数组
//动态获取Redis节点信息.
ArrayList<JedisShardInfo> list = new ArrayList<>();
for (String node : nodes){
String host = node.split(":")[0];
int port = Integer.parseInt(node.split(":")[1]);
list.add(new JedisShardInfo(host,port));
}
return new ShardedJedis(list);
}
}
在之后就是使用在cacheaop中改单片redis为分片redis
//1.定义切入点表达式
//引入redis缓存配置
@Autowired(required = false)
//private Jedis jedis;//单片redis注入
private ShardedJedis jedis;//分片redis注入,性能跟高内存更大
2.redis哨兵机制应实现
2.1redis分片机制存在的问题
说明:Redis分片机制可以实现内存数据的扩容.但是如果Redis服务器发生了宕机的现象,则会影响整个分片使用.
问题:Redis分片机制没有实现高可用. 当主机宕机之后.由从机自动的实现故障迁移.用户访问不受任何影响.
2.2redis主从的搭建redis-shards-sentinel
[准备哨兵工作目录]
要实现redis高可用需要先实现主从搭建(6379当做主机,6380,6381当做丛机),默认情况下都是主机8sentinel
===========关闭分片的Redis配置==============
查看状态命令: ps -ef|grep redis
kill命令: kill -9 ****
===========准备redis分片的配置==============
配置命令: redis]# cp -r shards sentinel
===========删除持久化文件=================
命令:sentinel]# rm -f *.rdb
===========准备3台redis服务器即可=================
启动redis服务器命令:sentinel]# redis-server ****.conf
查看状态命令: sentinel]# ps -ef|grep redis
==如何进入redis服务器==
命令:sentinel]# redis-cli -p **prot**
查看状态命令:127.0.0.1:****> info replication
配置成丛机命令:
[root@localhost sentinel]# redis-cli -p **丛机prot**
127.0.0.1:丛机prot> SLAVEOF 192.168.126.129 **主机prot**
2.3Redis实现哨兵机制(配合笔记补齐)
原理
1.首先启动Redis哨兵.由哨兵监控整个Redis主从状态. 主要监控M主机. 同时获取其从机的信息.
2.哨兵利用心跳检测机制(PING-PONG)的方式监控主机是否宕机.
如果连续3次主机没有响应.则哨兵判断主机宕机之后开始进行选举.
3.根据从主机中获取的从机信息.之后利用 选举机制算法.挑选新的主机.
4.之后将剩余的redis修改为当前主机的的从.并且修改配置文件.
复制命令:redis]# cp sentinel.conf sentinel
编辑命令:sentinel]# vim sentinel.conf
{
17: protected-mode no //关闭保护模式
21: port 26379 //默认端口号
26: daemonize yes //开启后台启动
84: sentinel monitor mymaster 192.169.126.129 6379 1 //监控注解IP端口,选举票数
}
启动哨兵命令: sentinel]# redis-sentinel sentinel.conf
查看:ps -ef|grep redis
3.搭建redis集群
(满足海量数据的存储要求(扩容),同时可以实现redis高可用,并且还不会依赖第三方.)