前言:大家都知道redis單臺的默認內存大小一般是10M.如果現在需要我們將1G的數據保存到內存中。這該如何做到呢?比如我們就用單臺redis,但是一味的擴大單臺redis內存則直接影響執行的效率,會有一種得不償失的感覺。於是呢,我們就得采用分片策略實現數據保存,通過多臺redis共同爲用戶提供內存得支持,實現內存擴容,提高執行效率!!
我所使用的Linux系統是dsCentOS-empty
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分片對象.之後訪問測試
開始訪問操作,操作成功就妥妥的了