1. 程式人生 > >負載均衡指Hash取模演算法

負載均衡指Hash取模演算法

負載均衡的實現過程中有多種方式,隨機,輪詢,hash等,本處主要講解基於java的hash演算法,具體實現程式碼如下:

第一步建立以ip為健值得hashmap存放物件

public class IpMap
{
    // 待路由的Ip列表,Key代表Ip,Value代表該Ip的權重
    public static HashMap<String, Integer> serverWeightMap = 
            new HashMap<String, Integer>();
    
    static
    {
        serverWeightMap.put("192.168.1.100", 1);
        serverWeightMap.put("192.168.1.101", 1);
        // 權重為4
        serverWeightMap.put("192.168.1.102", 4);
        serverWeightMap.put("192.168.1.103", 1);
        serverWeightMap.put("192.168.1.104", 1);
        // 權重為3
        serverWeightMap.put("192.168.1.105", 3);
        serverWeightMap.put("192.168.1.106", 1);
        // 權重為2
        serverWeightMap.put("192.168.1.107", 2);
        serverWeightMap.put("192.168.1.108", 1);
        serverWeightMap.put("192.168.1.110", 1);
        serverWeightMap.put("192.168.1.109", 1);
    }
}

第二步採用hash的演算法取模進行測試

public class Hash
{
    public static String getServer()
    {
        // 重建一個Map,避免伺服器的上下線導致的併發問題
        Map<String, Integer> serverMap = 
                new HashMap<String, Integer>();
        serverMap.putAll(IpMap.serverWeightMap);
        
        // 取得Ip地址List
        Set<String> keySet = serverMap.keySet();
        System.out.println(keySet);
        ArrayList<String> keyList = new ArrayList<String>();
        keyList.addAll(keySet);
        
        // 在Web應用中可通過HttpServlet的getRemoteIp方法獲取
        String remoteIp = "127.0.0.1";
        String newIP = "192.168.1.109";
        int hashCode = remoteIp.hashCode();
        int hashCode1 = newIP.hashCode();
        System.out.println(hashCode+","+hashCode1);
        int serverListSize = keyList.size();
        int serverPos = hashCode % serverListSize;
        int serverPos1 = hashCode1 % serverListSize;
        System.out.println(serverPos+","+serverPos1);
        if(hashCode1 < 0){
        serverPos1 = Math.abs(serverPos1);
        }
        System.out.println(keyList.get(serverPos1));
        
        return keyList.get(serverPos);
    }
    
    public static void main(String args[]){
    getServer();
    System.out.println(getServer());
    }

這種方法比較簡單,原因是在建立hashmap的物件時候,ip地址已經被經hash處理之後有序的排放在map集合裡面,當外部服務ip過來訪問的時候,會對這個ip地址進行一次hash,然後相對map集合的長度進行取模運算,這樣得到的一個取模的值就可以對應map集合裡取到的ip地址,這樣就完成了負載均衡的實踐

相關推薦

負載均衡Hash演算法

在負載均衡的實現過程中有多種方式,隨機,輪詢,hash等,本處主要講解基於java的hash演算法,具體實現程式碼如下: 第一步建立以ip為健值得hashmap存放物件 public class I

memcache通過hash演算法,實現多伺服器存取值

<?php //封裝一個hash演算法類 class Mem{ //儲存memcache的伺服器個數 private $hostCount=''; //多個伺服器 private $host=[]; //構造方法用來給接收值,給屬性賦值 publi

快速冪()演算法

對於普通型別的求a^n,我們的求法是不是a*a*a*a....,這樣乘以n次,時間複雜度為O(n),對於普通n比較小的我們可以接受,然而當n比較大的時候,計算就慢了,所以我們就去尋找更快捷的計算方法! 例如:我們要求2^8,我們通過當為偶數的時候,a^n=(a*a)^(n/

負載均衡,隨機加權重演算法實現

例如輸入資料 [(“a”,3),(“b”,3),(“c”,9),(“d”,1)], 權重分別為3,3,9,1 具體演算法是將3,3,9,1 對映到一維座標中,0-3-6-15-16,取得一個隨機數,範圍是0,16, 看結果落在哪個區間就返回哪個數值 已下以p

負載均衡之加權輪詢演算法

在介紹加權輪詢演算法(WeightedRound-Robin)之前,首先介紹一下輪詢演算法(Round-Robin)。 一:輪詢演算法(Round-Robin) 輪詢演算法是最簡單的一種負載均衡演算法。它的原理是把來自使用者的請求輪流分配給內部的伺服器:從伺服器1開始,直

負載均衡 | VS/NAT模式 | 排程演算法

VS/NAT 在一組伺服器前有一個排程器,它們是通過 Switch/HUB 相連線的。這些伺服器提供相同的網路服 務、相同的內容,即不管請求被髮送到哪一臺伺服器,執 行結果是一樣的。服務的內容可以複製到 每臺伺服器的本地硬碟上,可以通過網路檔案系統(如 NFS)共享,也可以通

轉載ACM 快速冪演算法詳解

快速冪取模的用途:在ACM這類競賽中,可能會遇到指數型的資料取模問題,這個時候如果直接用int或者long long儲存,就 有可能會超出計算機整數的存取範圍,而導致資料出錯。所以我們需要一種方法進行計算。而這種方法就是我們這次要講到 的快速冪取模(簡稱快速冪)。這種演算法在時間和空間上都做了儘可能的優化

nginx實現http負載均衡的幾種排程演算法具體補充

首先知道一點: upstream 支援的狀態引數 在HTTP Upstream模組中,可以通過server指令指定後端伺服器的IP地址和埠,同時還可以設定每個後端伺服器在負載均衡排程中的狀態。

快速冪演算法小結

快速冪取模演算法,是比較常見的演算法。分享給大家供大家參考之用。具體如下: 首先,所謂的快速冪,實際上是快速冪取模的縮寫,簡單的說,就是快速的求一個冪式的模(餘)。在程式設計過程中,經常要去求一些大數對於某個數的餘數,為了得到更快、計算範圍更大的演算法,產生了快速冪取模

快速冪二進位制演算法

       矩陣的快速冪是用來高效地計算矩陣的高次方的。將樸素的o(n)的時間複雜度,降到log(n)。這裡先對原理(主要運用了矩陣乘法的結合律)做下簡單形象的介紹:一般一個矩陣的n次方,我們會通過連乘n-1次來得到它的n次冪。        但做下簡單的改進就能減少連乘

poj 1995 快速冪二進位制演算法

本題大意:求a1的b1次方加a2的b2次方一直加到an的bn次方,用他們冪的和對一個數x取餘,把結果輸出! 矩陣的快速冪是用來高效地計算矩陣的高次方的。將樸素的o(n)的時間複雜度,降到log(n)。 這裡先對原理(主要運用了矩陣乘法的結合律)做下簡單形象的介紹:

快速冪演算法

演算法2:另一種演算法利用了二分的思想,可以達到O(logn)。可以把b按二進位制展開為:b = p(n)*2^n  +  p(n-1)*2^(n-1)  +…+   p(1)*2  +  p(0) 其中p(i) (0<=i<=n)為 0 或 1 這樣 a^b =  a^ (p(n)*2^n 

位運算之——按位與(&)操作——(快速演算法

位運算之——按位與(&)操作——(快速取模演算法)   由於位運算直接對記憶體資料進行操作,不需要轉成十進

簡單易懂的快速冪演算法

本文是上一篇文章《程式設計師必學:快速冪演算法》的續集,上一篇文章詳細地介紹了快速冪演算法,提供了遞迴、非遞迴的2種實現方案 丟擲問題 請設計一個演算法求x的y次冪模z的結果:(x ^ y) % z x、y、z都是整數 z ≠ 0, y ≥ 0 x、y的絕對值可能很大,比如(1234 ^ 4567) %

c# Hash一致演算法實現負載均衡

開篇吹牛。。。。。 不吹了,因為我不擅長演算法,就不胡說八道了。 現在一般的實現負載均衡,主要採用2種方法: 1.輪訓    2.負載均衡演算法 輪訓就不說了,負載均衡現在一般採用HASH一致演算法 不多說了,這個演算法方面我真不擅長,不給大家胡說。介紹2片博文

使用nginx的ngx_upstream_jdomain塊實現k8s容器的負載均衡

提高 max 部署 負載均衡 後來 span spa dir out 使用背景最近一直在準備k8s上線事宜,目前已經在測試環境中全面部署並通過壓力測試環境檢驗。離正式上線基本只剩下時間問題。我們目前測試環境中的容器負載均衡大量使用到了nginx,就是借助了ngx_upstr

nginx的負載均衡塊詳解

結果 memcached ssi 調度算法 服務器 span pan 嘗試 get 反向代理與負載均衡的概念: Nginx僅僅是作為nginx proxy反向代理使用,nginx其實是反向代理,只不過是有負載均衡的功能! 安裝Nginx負載均衡 官網Nginx模

反向代理負載均衡塊詳述

type 負載 images ade ges color 分享圖片 常用功能 分享 1、ngx_http_upstream_module常用功能 2、proxy_set_header常用功能反向代理負載均衡模塊詳述

Nginx中upstream塊實現PHP服務器的負載均衡

包括 輪詢 proc 詳細 關聯 code 並且 模塊 ext Nginx中upstream模塊實現PHP服務器的負載均衡 upstream模塊介紹 Nginx 的負載均衡功能依賴於 ngx_http_upstream_module 模塊,所支持的代理方式包括 proxy_

RocketMQ Consumer 負載均衡演算法學習 -- AllocateMessageQueueAveragelyByCircle

首先, RocketMQ Consumer 的負載均衡指的是把Topic 下的所有MessageQueue 分配到不同的 Consumer 中,所以Message Queue , Consumer 的數量,某個Consumer 的位置 會影響到負載均衡。 這邊介紹下環形平均分配的演算法: