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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java random算法_负载均衡--随机算法(Random)

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java random算法_负载均衡--随机算法(Random) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

隨機算法是指:從服務器列表中,隨機選取一臺服務器進行訪問。由概率論可以得知,隨著客戶端調用服務端的次數增多,其實際效果趨近于平均分配請求到服務端的每一臺服務器,也就是達到輪詢的效果。

一、算法描述

假設有 N 臺服務器 S = {S0, S1, S2, …, Sn},算法可以描述為:

1、通過隨機函數生成 0 到 N 之間的任意整理,將該數字作為索引,從 S 中獲取對應的服務器;

假定我們現在有如下四臺服務器:

服務器地址權重192.168.1.11

192.168.1.22

192.168.1.33

192.168.1.44

初始化服務列表后, serverList 如下:

服務器地址序號192.168.1.11

192.168.1.22

192.168.1.23

192.168.1.34

隨機算法與服務器權重沒有關系,每個服務器會被隨機訪問到。當調用次數足夠多時,每臺服務器被訪問的概率近似是相等的,隨機算法的效果就越趨近于輪詢算法。

二、java代碼實現

package com.test.mvp.schedulealgothrim;

import com.google.common.collect.SortedMultiset;

import com.google.common.collect.TreeMultiset;

import org.apache.commons.collections4.CollectionUtils;

import java.io.Serializable;

import java.util.ArrayList;

import java.util.Map;

import java.util.Random;

import java.util.Set;

import java.util.TreeMap;

class Server implements Serializable {

private static final long serialVersionUID = 7246747589293111189L;

private String server;

private Integer weight;

private String description;

public Server(String server, String description, Integer weight) {

this.server = server;

this.description = description;

this.weight = weight;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

public String getServer() {

return server;

}

public void setServer(String server) {

this.server = server;

}

public Integer getWeight() {

return weight;

}

public void setWeight(Integer weight) {

this.weight = weight;

}

}

class ServerManager {

public static Map serverMap = new TreeMap<>();

static {

serverMap.put("192.168.1.1", new Server("192.168.1.1", "第1臺server", 1));

serverMap.put("192.168.1.2", new Server("192.168.1.2", "第2臺server", 2));

serverMap.put("192.168.1.3", new Server("192.168.1.3", "第3臺server", 3));

serverMap.put("192.168.1.4", new Server("192.168.1.4", "第4臺server", 4));

}

}

class RandomBalance {

private static final Random RANDOM = new Random();

private static ArrayList middleServerList;

public static String getServer() {

if (CollectionUtils.isEmpty(middleServerList)) {

Set serverSet = ServerManager.serverMap.keySet();

middleServerList = new ArrayList<>(serverSet);

}

return middleServerList.get(RANDOM.nextInt(middleServerList.size()));

}

}

public class RandomScheduleTest {

public static void main(String[] args) {

SortedMultiset serverSet = TreeMultiset.create();

for (int i = 0; i < 100; i++) {

String server = RandomBalance.getServer();

Server curServer = ServerManager.serverMap.get(server);

System.out.println(server + ", " + curServer.getDescription());

serverSet.add(server, 1);

}

ServerManager.serverMap.forEach((key, value)->{

System.out.println(key + ", count:" + serverSet.count(key));

});

}

}

運算結果如下所示:

192.168.1.4, 第4臺server

192.168.1.3, 第3臺server

192.168.1.1, 第1臺server

192.168.1.1, 第1臺server

192.168.1.2, 第2臺server

192.168.1.2, 第2臺server

192.168.1.3, 第3臺server

192.168.1.1, 第1臺server

192.168.1.2, 第2臺server

192.168.1.4, 第4臺server

192.168.1.4, 第4臺server

192.168.1.1, 第1臺server

192.168.1.4, 第4臺server

192.168.1.3, 第3臺server

192.168.1.4, 第4臺server

192.168.1.4, 第4臺server

192.168.1.4, 第4臺server

192.168.1.4, 第4臺server

192.168.1.3, 第3臺server

192.168.1.4, 第4臺server

192.168.1.4, 第4臺server

192.168.1.4, 第4臺server

192.168.1.3, 第3臺server

192.168.1.3, 第3臺server

192.168.1.3, 第3臺server

192.168.1.1, 第1臺server

192.168.1.2, 第2臺server

192.168.1.2, 第2臺server

192.168.1.1, 第1臺server

192.168.1.4, 第4臺server

192.168.1.2, 第2臺server

192.168.1.4, 第4臺server

192.168.1.2, 第2臺server

192.168.1.1, 第1臺server

192.168.1.4, 第4臺server

192.168.1.4, 第4臺server

192.168.1.1, 第1臺server

192.168.1.2, 第2臺server

192.168.1.2, 第2臺server

192.168.1.3, 第3臺server

192.168.1.1, 第1臺server

192.168.1.1, 第1臺server

192.168.1.1, 第1臺server

192.168.1.4, 第4臺server

192.168.1.2, 第2臺server

192.168.1.4, 第4臺server

192.168.1.2, 第2臺server

192.168.1.2, 第2臺server

192.168.1.1, 第1臺server

192.168.1.3, 第3臺server

192.168.1.3, 第3臺server

192.168.1.3, 第3臺server

192.168.1.2, 第2臺server

192.168.1.3, 第3臺server

192.168.1.4, 第4臺server

192.168.1.3, 第3臺server

192.168.1.1, 第1臺server

192.168.1.1, 第1臺server

192.168.1.3, 第3臺server

192.168.1.4, 第4臺server

192.168.1.3, 第3臺server

192.168.1.3, 第3臺server

192.168.1.1, 第1臺server

192.168.1.3, 第3臺server

192.168.1.1, 第1臺server

192.168.1.4, 第4臺server

192.168.1.1, 第1臺server

192.168.1.4, 第4臺server

192.168.1.3, 第3臺server

192.168.1.1, 第1臺server

192.168.1.2, 第2臺server

192.168.1.2, 第2臺server

192.168.1.4, 第4臺server

192.168.1.1, 第1臺server

192.168.1.3, 第3臺server

192.168.1.3, 第3臺server

192.168.1.2, 第2臺server

192.168.1.3, 第3臺server

192.168.1.4, 第4臺server

192.168.1.2, 第2臺server

192.168.1.1, 第1臺server

192.168.1.3, 第3臺server

192.168.1.2, 第2臺server

192.168.1.1, 第1臺server

192.168.1.3, 第3臺server

192.168.1.4, 第4臺server

192.168.1.1, 第1臺server

192.168.1.1, 第1臺server

192.168.1.3, 第3臺server

192.168.1.1, 第1臺server

192.168.1.4, 第4臺server

192.168.1.3, 第3臺server

192.168.1.4, 第4臺server

192.168.1.2, 第2臺server

192.168.1.1, 第1臺server

192.168.1.2, 第2臺server

192.168.1.4, 第4臺server

192.168.1.4, 第4臺server

192.168.1.1, 第1臺server

192.168.1.3, 第3臺server

192.168.1.1, count:26

192.168.1.2, count:20

192.168.1.3, count:26

192.168.1.4, count:28

說明:

1、首先,使用 Random 對象隨機生成 [0, serverList.size()) 的整數;然后,通過索引獲取到服務器。

2、在多線程的情況下,若線程A修改 ServerManager.serverMap 的值,則線程B無法即時拿到線程A修改后的值,可能會導致請求錯誤,需要調用方進行容錯處理。

3、從宏觀的角度看,訪問量越大,負載越均衡。從微觀的角度看,局部并不那么均衡。

本文地址:https://blog.csdn.net/chinawangfei/article/details/109643598

如您對本文有疑問或者有任何想說的,請點擊進行留言回復,萬千網友為您解惑!

總結

以上是生活随笔為你收集整理的java random算法_负载均衡--随机算法(Random)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。