前言:大家都知道redis单台的默认内存大小一般是10M.如果现在需要我们将1G的数据保存到内存中。这该如何做到呢?比如我们就用单台redis,但是一味的扩大单台redis内存则直接影响执行的效率,会有一种得不偿失的感觉。于是呢,我们就得采用分片策略实现数据保存,通过多台redis共同为用户提供内存得支持,实现内存扩容,提高执行效率!!
1.Redis分片机制
1.1 Redis分片搭建准备
1.1.1端口号的划分
首先准备3台redis 分别为6379/7380/6381(6379为默认)
1.1.2准备分片目录
在redis的根目录中创建分片目录结构--shards
1.2.3 准备3个Redis的配置文件
复制原有的redis.conf ,之后复制到shards/6379.conf ,6380.conf ,6381.conf
1.切换持久化方式--将yes改为no
2.复制配置文件
[root@localhost redis]# cp redis.conf shards/6379.conf
[root@localhost redis]# cp redis.conf shards/6380.conf
[root@localhost redis]# cp redis.conf shards/6381.conf
3.修改Redis端口号
快速定位port位置 -- 在esc情况下输入:/port
1.2.4启动3台Redis
redis-server 6379.conf & redis-server 6380.conf & redis-server 6381.conf &
检查Redis服务,是否正确
ps -ef |grep redis
1.3Spring整合Redis分片入门案例
需要添加redis依赖,之后再行测试
<!--spring整合redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
public class TestRedis {
@Test
public void testShards() {
List<JedisShardInfo> shards = new ArrayList<>();
shards.add(new JedisShardInfo("192.168.126.166",6379));
shards.add(new JedisShardInfo("192.168.126.166",6380));
shards.add(new JedisShardInfo("192.168.126.166",6381));
ShardedJedis jedis = new ShardedJedis(shards);
jedis.set("shards", "测试redis分片机制!!!");
System.out.println(jedis.get("shards"));
}
}
1.4一致性HASH算法
1.4.1 redis分片储存问题
问题:用户通过shardsJedis对象管理了3台redis,但是用户在进行赋值操作时,跳转其中一台服务器进行set操作.问题原理是什么
思路: 1.随机存取? 执行效率较低.
2.hash方式进行存取.
1.4.2一致性hash算法介绍
一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 [1] 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 [2] 。
目的: 解决分布式缓存的存储性问题
作用: 解决了如果添加/减少节点,则原来的数据尽可能保持不变.将变化降到最低.
1.4.3一致性HASH原理介绍
常识:
- hash取值的个数 32位2进制数. 2^32取值区间.
- 如果key相同,则hash的结果必然相同.
- hash运算的时间复杂度为n 无论计算的数据量多少,运行的速度几乎相同.
1.利用一致性hash算法解决了数据存储问题.
2.如果节点的数量发生变化.则可以实现动态的数据迁移.
1.5 一致性hash算法特性
1.5.1均衡性
说明:当利用hash一致性算法进行计算时,如果出现了负载不均的现象则开启虚拟节点实现数据的动态平衡.
1.5.2单调性
单调性是指在新增或者删减节点时,不影响系统正常运行 。
当节点新增/减少时,数据可以实现自动的迁移。
1.5.3分散性
分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据。
在分布式系统中,将数据分散保存到多个节点中,如果将来出现问题.则只影响局部。
俗语:鸡蛋不要放到一个篮子里。
1.6Spring整合Redis分片
1.6.1编辑properties文件
说明:编辑jt-common中的redis.properties配置文件,引入分片设计。
#标识IP地址和端口号信息 IP:PORT
redis.nodes=192.168.126.166:6379,192.168.126.166:6380,192.168.126.166:6381
1.6.2编辑RedisConfig配置类
//引入redis分片
@Value("${redis.nodes}")
private String nodes; //node,node,node
//将ShardedJedis对象交给Spring容器管理
@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);
}
1.6.3切换AOP对象注入
将原有的jedis对象,切换为redis分片对象.之后访问测试
开始访问操作,操作成功就妥妥的了