前言:你们都知道redis单台的默认内存大小通常是10M.若是如今须要咱们将1G的数据保存到内存中。这该如何作到呢?好比咱们就用单台redis,可是一味的扩大单台redis内存则直接影响执行的效率,会有一种得不偿失的感受。因而呢,咱们就得采用分片策略实现数据保存,经过多台redis共同为用户提供内存得支持,实现内存扩容,提升执行效率!!java
首先准备3台redis 分别为6379/7380/6381(6379为默认)node
在redis的根目录中建立分片目录结构--shardsredis
复制原有的redis.conf ,以后复制到shards/6379.conf ,6380.conf ,6381.conf算法
[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
快速定位port位置 -- 在esc状况下输入:/port
spring
redis-server 6379.conf & redis-server 6380.conf & redis-server 6381.conf &
检查Redis服务,是否正确缓存
ps -ef |grep 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")); } }
问题:用户经过shardsJedis对象管理了3台redis,可是用户在进行赋值操做时,跳转其中一台服务器进行set操做.问题原理是什么
思路: 1.随机存取? 执行效率较低.
2.hash方式进行存取.分布式
一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 [1] 在移除或者添加一个服务器时,可以尽量小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题 [2] 。
目的: 解决分布式缓存的存储性问题
做用: 解决了若是添加/减小节点,则原来的数据尽量保持不变.将变化降到最低.测试
常识:设计
说明:当利用hash一致性算法进行计算时,若是出现了负载不均的现象则开启虚拟节点实现数据的动态平衡.
单调性是指在新增或者删减节点时,不影响系统正常运行 。
当节点新增/减小时,数据能够实现自动的迁移。
分散性是指数据应该分散地存放在分布式集群中的各个节点(节点本身能够有备份),没必要每一个节点都存储全部的数据。
在分布式系统中,将数据分散保存到多个节点中,若是未来出现问题.则只影响局部。
俗语:鸡蛋不要放到一个篮子里。
说明:编辑jt-common中的redis.properties配置文件,引入分片设计。
#标识IP地址和端口号信息 IP:PORT redis.nodes=192.168.126.166:6379,192.168.126.166:6380,192.168.126.166:6381
//引入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); }
将原有的jedis对象,切换为redis分片对象.以后访问测试
开始访问操做,操做成功就妥妥的了