Redis的分片機制包含對一致性HASH算法的運用

前言:大家都知道redis單臺的默認內(nèi)存大小一般是10M.如果現(xiàn)在需要我們將1G的數(shù)據(jù)保存到內(nèi)存中。這該如何做到呢?比如我們就用單臺redis,但是一味的擴大單臺redis內(nèi)存則直接影響執(zhí)行的效率,會有一種得不償失的感覺。于是呢,我們就得采用分片策略實現(xiàn)數(shù)據(jù)保存,通過多臺redis共同為用戶提供內(nèi)存得支持,實現(xiàn)內(nèi)存擴容,提高執(zhí)行效率!!
我所使用的Linux系統(tǒng)是dsCentOS-empty


1.Redis分片機制

1.1 Redis分片搭建準備

1.1.1端口號的劃分

首先準備3臺redis 分別為6379/7380/6381(6379為默認)

1.1.2準備分片目錄

在redis的根目錄中創(chuàng)建分片目錄結構--shards

16.png

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分片入門案例

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.隨機存取? 執(zhí)行效率較低.
??????????2.hash方式進行存取.

1.4.2一致性hash算法介紹

?????一致性哈希算法在1997年由麻省理工學院提出,是一種特殊的哈希算法,目的是解決分布式緩存的問題。 [1] 在移除或者添加一個服務器時,能夠盡可能小地改變已存在的服務請求與處理請求服務器之間的映射關系。一致性哈希解決了簡單哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的動態(tài)伸縮等問題 [2] 。
?????目的: 解決分布式緩存的存儲性問題
?????作用: 解決了如果添加/減少節(jié)點,則原來的數(shù)據(jù)盡可能保持不變.將變化降到最低.

1.4.3一致性HASH原理介紹

常識:

  1. hash取值的個數(shù) 32位2進制數(shù). 2^32取值區(qū)間.
  2. 如果key相同,則hash的結果必然相同.
  3. hash運算的時間復雜度為n 無論計算的數(shù)據(jù)量多少,運行的速度幾乎相同.
1.利用一致性hash算法解決了數(shù)據(jù)存儲問題.

在這里插入圖片描述

在這里插入圖片描述

2.如果節(jié)點的數(shù)量發(fā)生變化.則可以實現(xiàn)動態(tài)的數(shù)據(jù)遷移.
在這里插入圖片描述

1.5 一致性hash算法特性

1.5.1均衡性

說明:當利用hash一致性算法進行計算時,如果出現(xiàn)了負載不均的現(xiàn)象則開啟虛擬節(jié)點實現(xiàn)數(shù)據(jù)的動態(tài)平衡.

在這里插入圖片描述

1.5.2單調(diào)性

單調(diào)性是指在新增或者刪減節(jié)點時,不影響系統(tǒng)正常運行 。

當節(jié)點新增/減少時,數(shù)據(jù)可以實現(xiàn)自動的遷移。

在這里插入圖片描述

1.5.3分散性

分散性是指數(shù)據(jù)應該分散地存放在分布式集群中的各個節(jié)點(節(jié)點自己可以有備份),不必每個節(jié)點都存儲所有的數(shù)據(jù)。

在分布式系統(tǒng)中,將數(shù)據(jù)分散保存到多個節(jié)點中,如果將來出現(xiàn)問題.則只影響局部。

俗語:雞蛋不要放到一個籃子里。

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分片對象.之后訪問測試

在這里插入圖片描述

開始訪問操作,操作成功就妥妥的了

在這里插入圖片描述

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容