Redis分片機(jī)制
作者:小飛
來源:SegmentFault 思否
為什么需要分片機(jī)制
如果需要存儲(chǔ)海量的內(nèi)存數(shù)據(jù),如果只使用一臺(tái)redis,則無法保證redis工作的效率。大量時(shí)間都浪費(fèi)到了尋址中,所以需要一種機(jī)制能夠滿足該要求。
采用分片機(jī)制實(shí)現(xiàn):

Redis分片搭建
搭建注意事項(xiàng)
Redis服務(wù)的啟動(dòng)需要依賴于redis.conf的配置文件,如果需要準(zhǔn)備多臺(tái)redis則需要多個(gè)redis.conf的配置。
準(zhǔn)備端口號(hào):
1.6379
2.6380
3.6381
分片實(shí)現(xiàn)

修改端口號(hào):將各自的端口號(hào)進(jìn)行修改
1.進(jìn)入各自的redis.conf文件中
2.修改各自的端口號(hào)

啟動(dòng)redis服務(wù)器

校驗(yàn)服務(wù)器是否正常運(yùn)行

關(guān)于分片的注意事項(xiàng)
1.問題描述:
當(dāng)啟動(dòng)多臺(tái)redis服務(wù)器之后,多臺(tái)redis暫時(shí)沒有必然的聯(lián)系,各自都是獨(dú)立的實(shí)體,可以數(shù)據(jù)的存儲(chǔ)。
如圖所示:
2.如果將分片通過程序的方式進(jìn)行操作,要把3太redis當(dāng)做一個(gè)整體,所以與上述的操作完全不同,不會(huì)出現(xiàn)一個(gè)key同時(shí)保存到多個(gè)redis的現(xiàn)象。
分片入門案例
/*** 測(cè)試Redis分片機(jī)制* 思考: shards 如何確定應(yīng)該存儲(chǔ)到哪臺(tái)redis中呢???*/@Testpublic void testShards(){Listshards = 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));//準(zhǔn)備分片對(duì)象ShardedJedis shardedJedis = new ShardedJedis(shards);shardedJedis.set("shards","redis分片測(cè)試");System.out.println(shardedJedis.get("shards"));}
一致性hash算法
一般的hash是8為16禁止數(shù)。0---9 A--F 組合總共為2^32。
如果對(duì)相同的數(shù)據(jù)進(jìn)行hash運(yùn)算,結(jié)果必然相同。
一個(gè)數(shù)據(jù)1M和數(shù)據(jù)1G的hash運(yùn)算的速度一致。
一致性hash算法介紹
一致性哈希算法在1997年由麻省理工學(xué)院提出,是一種特殊的哈希算法,目的是解決分布式緩存的問題。[1] 在移除或者添加一個(gè)服務(wù)器時(shí),能夠盡可能小地改變已存在的服務(wù)請(qǐng)求與處理請(qǐng)求服務(wù)器之間的映射關(guān)系。一致性哈希解決了簡(jiǎn)單哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的動(dòng)態(tài)伸縮等問題。

特性
平衡性
概念:平衡性是指hash的結(jié)果應(yīng)該平均分配到各個(gè)節(jié)點(diǎn),這樣從算法上解決了負(fù)載均衡問題。(大致平均)
問題描述: 由于節(jié)點(diǎn)都是通過hash方式進(jìn)行算計(jì).所以可能出現(xiàn)如圖中的現(xiàn)象.,導(dǎo)致負(fù)載嚴(yán)重不平衡。

解決方法:引入虛擬節(jié)點(diǎn)

單調(diào)性
特點(diǎn):?jiǎn)握{(diào)性是指在新增或者刪減節(jié)點(diǎn)時(shí),不影響系統(tǒng)正常運(yùn)行。

分散性
分散性是指數(shù)據(jù)應(yīng)該分散地存放在分布式集群中的各個(gè)節(jié)點(diǎn)(節(jié)點(diǎn)自己可以有備份),不必每個(gè)節(jié)點(diǎn)都存儲(chǔ)所有的數(shù)據(jù) 。
SpringBoot整合Redis分片
編輯配置文件
# 配置redis單臺(tái)服務(wù)器redis.host=192.168.126.129redis.port=6379# 配置redis分片機(jī)制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分片機(jī)制@Beanpublic ShardedJedis shardedJedis(){nodes = nodes.trim(); //去除兩邊多余的空格Listshards = new ArrayList<>(); String[] nodeArray = nodes.split(",");for (String strNode : nodeArray){ //strNode = host:portString host = strNode.split(":")[0];int port = Integer.parseInt(strNode.split(":")[1]);JedisShardInfo info = new JedisShardInfo(host, port);shards.add(info);}return new ShardedJedis(shards);}}
修改AOP注入項(xiàng)


