为什么须要分片机制
如果须要存储海量的内存数据,如果只应用一台 redis,则无奈保障 redis 工作的效率。大量工夫都节约到了寻址中,所以须要一种机制可能满足该要求。
采纳分片机制实现:
Redis 分片搭建
搭建注意事项
Redis 服务的启动须要依赖于 redis.conf 的配置文件,如果须要筹备多台 redis 则须要多个 redis.conf 的配置。
筹备端口号:
1.6379
2.6380
3.6381
分片实现
批改端口号:将各自的端口号进行批改
1. 进入各自的 redis.conf 文件中
2. 批改各自的端口号
启动 redis 服务器
校验服务器是否失常运行
对于分片的注意事项
1. 问题形容:
当启动多台 redis 服务器之后,多台 redis 临时没有必然的分割,各自都是独立的实体,能够数据的存储。
如图所示:
2. 如果将分片通过程序的形式进行操作,要把 3 太 redis 当做一个整体,所以与上述的操作齐全不同,不会呈现一个 key 同时保留到多个 redis 的景象。
分片入门案例
/**
* 测试 Redis 分片机制
* 思考: shards 如何确定应该存储到哪台 redis 中呢???
*/
@Test
public void testShards(){List<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));
// 筹备分片对象
ShardedJedis shardedJedis = new ShardedJedis(shards);
shardedJedis.set("shards","redis 分片测试");
System.out.println(shardedJedis.get("shards"));
}
一致性 hash 算法
个别的 hash 是 8 为 16 禁止数。0—9 A–F 组合总共为 2^32。
如果对雷同的数据进行 hash 运算,后果必然雷同。
一个数据 1M 和数据 1G 的 hash 运算的速度统一。
一致性 hash 算法介绍
一致性哈希算法在 1997 年由麻省理工学院提出,是一种非凡的哈希算法,目标是解决分布式缓存的问题。[1] 在移除或者增加一个服务器时,可能尽可能小地扭转已存在的服务申请与解决申请服务器之间的映射关系。一致性哈希解决了简略哈希算法在分布式哈希表(Distributed Hash Table,DHT) 中存在的动静伸缩等问题。
个性
平衡性
概念: 平衡性是指 hash 的后果应该平均分配到各个节点,这样从算法上解决了负载平衡问题。(大抵均匀)
问题形容: 因为节点都是通过 hash 形式进行合计. 所以可能呈现如图中的景象., 导致负载重大不均衡。
解决办法:引入虚构节点
枯燥性
特点:枯燥性是指在新增或者删减节点时,不影响零碎失常运行。
分散性
分散性是指数据应该扩散地寄存在分布式集群中的各个节点(节点本人能够有备份),不用每个节点都存储所有的数据。
SpringBoot 整合 Redis 分片
编辑配置文件
# 配置 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
编辑配置类
@Configuration
@PropertySource("classpath:/properties/redis.properties")
public class JedisConfig {@Value("${redis.nodes}")
private String nodes; //node,node,node.....
// 配置 redis 分片机制
@Bean
public ShardedJedis shardedJedis(){nodes = nodes.trim(); // 去除两边多余的空格
List<JedisShardInfo> shards = new ArrayList<>();
String[] nodeArray = nodes.split(",");
for (String strNode : nodeArray){ //strNode = host:port
String host = strNode.split(":")[0];
int port = Integer.parseInt(strNode.split(":")[1]);
JedisShardInfo info = new JedisShardInfo(host, port);
shards.add(info);
}
return new ShardedJedis(shards);
}
}
批改 AOP 注入项