redis性能优化
秒速:单台redis内存容量是有限的.但是如果有海量的数据要求实现缓存存储,则应该使用多个Redis节点.
Redis分片机制定义:
Redis分片机制配置
配置规划
配置描述:准备3台redis服务器,端口号分别为6379/6380/6381
1.准备3个配置文件
2.分别修改端口号:
3.启动redis服务器
4.检查redis启动状态
5.案例测试
6.根据redis节点个数.拼接字符串
7.编辑RedisConfig配置类
@Configuration //标识我是一个配置类 一般与@Bean注解联用
@PropertySource("classpath:/properties/redis.properties")
public class RedisConfig {
@Value("${redis.nodes}")
private String nodes; //node,node,node
@Bean
public ShardedJedis shardedJedis(){
List<JedisShardInfo> shards = new ArrayList<>();
String[] nodeArray = nodes.split(",");
for( String node :nodeArray){ //node=host:port
String host = node.split(":")[0];
int port = Integer.parseInt(node.split(":")[1]);
JedisShardInfo info = new JedisShardInfo(host,port);
shards.add(info);
}
return new ShardedJedis(shards);
}
}
8.修改CacheAOP中的注入
Redis分片机制说明
一致性hash算法
一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表中存在的动态伸缩等问题。
一致性Hash原理说明
常识补充:
(1)对相同的数据hash得到的结果相同.
(2)常见hash值8位16进制数2^32种可能性.
平衡性说明
平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题 .
如果发现数据分布不均匀,则采用虚拟节点的方式,实现数据的平衡. 如果一次平衡不能达到目标则多次生成虚拟节点.但是数据平衡没有办法做到绝对的平均.
单调性说明
单调性是指在新增或者删减节点时,不影响系统正常运行.
如果新增或者删除节点,则尽可能不要改变原有的数据结构.
分散性
分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据.
简述:鸡蛋不要放到一个篮子里.
Redis哨兵机制
Redis分片机制问题
如果redis分片中有一个节点宕机,则可能会影响整个服务的运行.redis分片没有实现高可用.
Redis主从结构搭建
1.复制配置文件
2.准备3台redis
3.主从搭建
检查主从结构状态
主从结构说明:主和从都知道当前的主从的状态,并且只有主机可以写操作,从机只能读操作.
Redis哨兵机制工作原理
(1)当哨兵启动时,首先会监听主机,从主机中获取当前所有的节点的状态,同时哨兵开启心跳检测机制.
(2)当主机发生宕机的现象时,由于哨兵有PING-PONG机制发现主机宕机,则哨兵开始进行选举.
(3)当选举成功之后,新的主机当选之后,其他的节点当新主机的从.
编辑哨兵配置文件
(1)关闭保护模式
(2)开启后台运行
(3)编辑监控配置
(4)修改选举时间
启动哨兵服务
命令:redis-sentinel sentinel.conf
高可用检查:
1)先关闭主机 等待10秒检查是否进行选举.
2)启动6379.检查是否当选新主机的从.
哨兵测试API
/**
* 测试哨兵
*/
@Test
public void testSentinel(){
Set<String> set = new HashSet<>();
set.add("192.168.126.129:26379");
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(1000);
poolConfig.setMaxIdle(40);
poolConfig.setMinIdle(10);
JedisSentinelPool sentinelPool =
new JedisSentinelPool("mymaster",set,poolConfig);
Jedis jedis = sentinelPool.getResource();
jedis.set("sentinel", "哨兵机制测试");
System.out.println(jedis.get("sentinel"));
jedis.close();
}
SpringBoot整合哨兵机制
编辑pro配置文件
编辑配置类
编辑CacheAOP
关于分片/哨兵总结
(1)Redis分片主要的作用实现内存的扩容,缺点是没有实现高可用的效果.
(2)Redis哨兵主要的作用实现了redis节点高可用.缺点是没有实现内存扩容.
Redis哨兵机制实质就是引入第三方的监控,但是需要保证第三方的高可用.就必须引入更多的资源.
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。