日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java之Redis分片机制

發(fā)布時(shí)間:2023/12/31 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java之Redis分片机制 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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/6381

1.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

[root@localhost shards]# redis-server 6379.conf [root@localhost shards]# redis-server 6380.conf [root@localhost shards]# redis-server 6381.conf

啟動效果:

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原理

常識:

  • 一般的hash由8位16進(jìn)制數(shù)組成的. 共有2^32種可能性!!!
  • hash算法對相同的數(shù)據(jù)進(jìn)行hash運(yùn)算時(shí) 結(jié)果必然相同.
  • 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:6381

    1.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ā)生了異常則直接影響用戶使用.

    想法: 能否有一種機(jī)制既可用滿足海量數(shù)據(jù)的存儲要求(擴(kuò)容),同時(shí)可以實(shí)現(xiàn)redis高可用,并且還不會依賴第三方.

    總結(jié)

    以上是生活随笔為你收集整理的Java之Redis分片机制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。