Redis分片机制
共 2473字,需浏览 5分钟
·
2020-11-17 02:52
作者:小飞
来源:SegmentFault 思否
为什么需要分片机制
如果需要存储海量的内存数据,如果只使用一台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
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
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);
}
}