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