Java之Redis分片机制
1. Redis分片機(jī)制
1.1 分片機(jī)制說明
前提說明: redis可以通過修改內(nèi)存的大小 實(shí)現(xiàn)數(shù)據(jù)的保存.但是內(nèi)存的資源不易設(shè)置的過大,因?yàn)楹芏嗟臅r(shí)間都浪費(fèi)在內(nèi)存的尋址中.
需求: 如果有海量的數(shù)據(jù),需要redis存儲 問:應(yīng)該如何處理?
解決方案: 可以采用Redis分片機(jī)制 實(shí)現(xiàn)內(nèi)存數(shù)據(jù)的擴(kuò)容.
知識點(diǎn): 采用redis分片 只要的目的就是為了實(shí)現(xiàn)內(nèi)存擴(kuò)容.從而解決海量數(shù)據(jù)存儲的問題
1.2 Redis分片搭建步驟
1.2.1 分片節(jié)點(diǎn)說明
說明: 端口號分別為 6379/6380/63811.2.2 關(guān)閉原有的Redis
1.2.3 準(zhǔn)備多個(gè)配置文件
1.創(chuàng)建shards目錄
2.復(fù)制3份配置文件
3.修改各自的端口號
修改端口號:
關(guān)閉AOF模式
修改RDB模式名稱
分別修改6380/6381 改為各自對應(yīng)的端口號.
啟動3臺redis
啟動效果:
1.2.4 Redis分片入門案例
public class TestShards { //改類表示測試redis分片機(jī)制/*** 說明:在Linux中有3臺redis.需要通過程序進(jìn)行動態(tài)鏈接.* 實(shí)現(xiàn)數(shù)據(jù)的存儲.* 思考: 數(shù)據(jù)保存到了哪臺redis中???*/@Testpublic void test01(){List<JedisShardInfo> shards = 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));//分片的APIShardedJedis shardedJedis = new ShardedJedis(shards);shardedJedis.set("王者榮耀", "你好我是小菜雞,坑死你");System.out.println(shardedJedis.get("王者榮耀"));} }1.3 一致性hash算法
1.3.1 一致性hash說明
一致性哈希算法在1997年由麻省理工學(xué)院提出,是一種特殊的哈希算法,目的是解決分布式緩存的問題。 [1] 在移除或者添加一個(gè)服務(wù)器時(shí),能夠盡可能小地改變已存在的服務(wù)請求與處理請求服務(wù)器之間的映射關(guān)系。一致性哈希解決了簡單哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的動態(tài)伸縮等問題 [2] 。
1.3.2 一致性hash原理
常識:
00000000-FFFFFFFF 0-F=(24)8 = 2^32
進(jìn)制:
1).二進(jìn)制 取值 : 0-1 規(guī)則滿2進(jìn)1
2).八進(jìn)制 取值 : 0-7 規(guī)則滿8進(jìn)1 2^3=8 每三位二進(jìn)制數(shù)就是一個(gè)8進(jìn)制數(shù)
3).十六進(jìn)制 取值 : 0-9 A-F 規(guī)則滿16進(jìn)一 2^4=16 每四位二進(jìn)制數(shù)就是一個(gè)16進(jìn)制數(shù)
1.3.2 一致性hash 特性
1.3.2.1平衡性
①平衡性是指hash的結(jié)果應(yīng)該平均分配到各個(gè)節(jié)點(diǎn),這樣從算法上解決了負(fù)載均衡問題
說明:引入虛擬節(jié)點(diǎn) 實(shí)現(xiàn)數(shù)據(jù)的平衡 但是平衡是相對的.不是絕對的.
1.3.2.2 單調(diào)性
②單調(diào)性是指在新增或者刪減節(jié)點(diǎn)時(shí),不影響系統(tǒng)正常運(yùn)行 [4]
1.3.2.2 分散性
③分散性是指數(shù)據(jù)應(yīng)該分散地存放在分布式集群中的各個(gè)節(jié)點(diǎn)(節(jié)點(diǎn)自己可以有備份),不必每個(gè)節(jié)點(diǎn)都存儲所有的數(shù)據(jù) [4] 。
雞蛋不要放到一個(gè)籃子里.
1.4 Spring整合redis分片機(jī)制
1.4.1 準(zhǔn)備Redis.pro文件
# 配置單臺redis #redis.host=192.168.126.129 #redis.port=6379# 配置多臺redis redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:63811.4.2 編輯配置類
@Configuration //標(biāo)識我是配置類 @PropertySource("classpath:/properties/redis.properties") public class RedisConfig {@Value("${redis.nodes}")private String nodes; //node,node,node/*** spring整合redis分片機(jī)制*/@Beanpublic ShardedJedis shardedJedis(){//1.獲取每個(gè)節(jié)點(diǎn)的信息String[] strNodes = nodes.split(",");List<JedisShardInfo> shards = new ArrayList<>();//2.遍歷所有node.為list集合賦值for(String node :strNodes){ //node=ip:portString host = node.split(":")[0];int port = Integer.parseInt(node.split(":")[1]);JedisShardInfo info = new JedisShardInfo(host,port);shards.add(info);}ShardedJedis shardedJedis = new ShardedJedis(shards);return shardedJedis;}/* @Value("${redis.host}")private String host;@Value("${redis.port}")private Integer port;//SpringBoot管理 Spring框架的優(yōu)化的API@Beanpublic Jedis jedis(){return new Jedis(host,port);}*/ }2.Redis哨兵機(jī)制
2.1 redis分片機(jī)制存在的問題
說明:Redis分片機(jī)制可以實(shí)現(xiàn)內(nèi)存數(shù)據(jù)的擴(kuò)容.但是如果Redis服務(wù)器發(fā)生了宕機(jī)的現(xiàn)象,則會影響整個(gè)分片使用.
問題:Redis分片機(jī)制沒有實(shí)現(xiàn)高可用. 當(dāng)主機(jī)宕機(jī)之后.由從機(jī)自動的實(shí)現(xiàn)故障遷移.用戶訪問不受任何影響.
2.2 Redis主從搭建
前提條件: 如果要實(shí)現(xiàn)redis高可用機(jī)制,則必須首先實(shí)現(xiàn)主從搭建.
主從關(guān)系設(shè)定: 6379當(dāng)做主機(jī)-M 6380/6381 從機(jī)-S
2.2.1 準(zhǔn)備哨兵工作目錄
1).關(guān)閉分片的Redis配置.
2).準(zhǔn)備redis哨兵配置 復(fù)制配置文件目錄
3).刪除持久化文件
4).準(zhǔn)備3臺redis服務(wù)器即可
重啟redis
2.2.2 Redis主從配置
1).檢查Redis默認(rèn)條件下的主從關(guān)系
2).實(shí)現(xiàn)主從配置
命令:slave of 主機(jī)IP 主機(jī)端口
3).用戶操作Redis主機(jī),之后檢查從機(jī)是否實(shí)現(xiàn)數(shù)據(jù)同步即可.
數(shù)據(jù)同步正常.
2.2.3 主從配置問題說明
說明:當(dāng)redis服務(wù)器已經(jīng)配置了主從結(jié)構(gòu)之后.如果將服務(wù)器宕機(jī).之后再次重啟.則發(fā)現(xiàn)從服務(wù)器又會變?yōu)橹鳈C(jī)!!!
問題說明: 執(zhí)行了主從掛載命令 該命令一直保存在內(nèi)存中.當(dāng)redis服務(wù)器重啟之后,該命令失效.如果想要一直保持主從的關(guān)系.則必須將主從的結(jié)構(gòu)寫入Redis.conf的配置文件中.
2.3 哨兵機(jī)制原理說明
1.首先啟動Redis哨兵.由哨兵監(jiān)控整個(gè)Redis主從狀態(tài). 主要監(jiān)控M主機(jī). 同時(shí)獲取其從機(jī)的信息.
2.哨兵利用心跳檢測機(jī)制(PING-PONG)的方式監(jiān)控主機(jī)是否宕機(jī). 如果連續(xù)3次主機(jī)沒有響應(yīng).則哨兵判斷主機(jī)宕機(jī).
之后開始進(jìn)行選舉.
3.根據(jù)從主機(jī)中獲取的從機(jī)信息.之后利用 選舉機(jī)制算法.挑選新的主機(jī).
4.之后將剩余的redis修改為當(dāng)前主機(jī)的的從.并且修改配置文件.
2.4 Redis實(shí)現(xiàn)哨兵機(jī)制
2.4.1 復(fù)制Redis哨兵配置文件
2.4.2修改配置文件
命令: 在sentinel目錄下 vim sentinel.conf
2.修改哨兵監(jiān)控配置
3.修改哨兵選舉的時(shí)間
當(dāng)redis主機(jī)宕機(jī)之后,哨兵多久開始選舉.
4.選舉超時(shí)時(shí)間設(shè)定
說明:如果當(dāng)選主機(jī)的服務(wù)器在規(guī)定的時(shí)間之內(nèi),沒有完成切換.則哨兵重新選舉.
2.4.3 啟動哨兵檢查高可用性
命令: redis-sentinel sentinel.conf
測試步驟:
1.將6379主機(jī)宕機(jī).
2.等待10秒之后.檢查從機(jī)是否當(dāng)選主機(jī).
3.重啟6379服務(wù)器.檢查是否為當(dāng)前主機(jī)的從.
重啟服務(wù)之后,檢查是否為從.!
2.5 Spring整合Redis哨兵
2.5.1 入門案例
package com.jt.test; import org.junit.jupiter.api.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisSentinelPool; import java.util.HashSet; import java.util.Set; public class TestSentinel { //主要完成哨兵測試/*** 參數(shù)說明:* masterName: 主機(jī)名稱* sentinels: 哨兵節(jié)點(diǎn)信息.*/@Testpublic void test01(){Set<String> sentinels = new HashSet<>();String node = "192.168.126.129:26379";sentinels.add(node);JedisSentinelPool sentinelPool =new JedisSentinelPool("mymaster", sentinels);Jedis jedis = sentinelPool.getResource(); //獲取資源jedis.set("sentinel", "redis哨兵機(jī)制配置成功!!!!");System.out.println(jedis.get("sentinel"));} }3 搭建Redis集群
3.1 Redis分片/Redis哨兵總結(jié)
說明:
1).分片可以實(shí)現(xiàn)Redis內(nèi)存數(shù)據(jù)的擴(kuò)容.可以存儲海量的內(nèi)存數(shù)據(jù). Redis分片機(jī)制沒有實(shí)現(xiàn)高可用.如果分片中一個(gè)節(jié)點(diǎn)宕機(jī),則直接影響整個(gè)服務(wù)的運(yùn)行.
2).哨兵可以實(shí)現(xiàn)Redis節(jié)點(diǎn)的高可用.但是Redis中的數(shù)據(jù)不能實(shí)現(xiàn)內(nèi)存的擴(kuò)容.
哨兵服務(wù)本身沒有實(shí)現(xiàn)高可用.如果哨兵發(fā)生了異常則直接影響用戶使用.
總結(jié)
以上是生活随笔為你收集整理的Java之Redis分片机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓上比较好的python开发软件-三款
- 下一篇: java美元兑换,(Java实现) 美元