前言:你們都知道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分片對象.以後訪問測試
開始訪問操做,操做成功就妥妥的了