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

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429403.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql group by 问题

根据标准sql规定&#xff0c;select字段&#xff08;除聚合函数与&#xff09;必须跟在group by后&#xff0c;但mysql除外&#xff0c;即select * from table a group by a.property 无报错 聚合函数如下&#xff1a; 1. avg() 取其平均数 2.count() 取其数量,返回值为int 3.…

java io体系_java IO流的体系结构图

常用字节流字符流字节流 InputStream 字符流 ReaderFileInputStream BufferedReaderFilte…

jetty java 禁用目录列表_java – 如何禁用Jetty的WebAppContext目录列表?

我将Jetty(版本7.4.5.v20110725)嵌入到java应用程序中。我使用Jetty的WebAppContext在./webapps/jsp/中提供JSP页面&#xff0c;但是如果我访问localhost&#xff1a;8080 / jsp /我获取了Jetty的目录列表&#xff0c;以获取./webapps/jsp/的所有内容。我已经尝试将dirAllowed参…

Arch Linux 安装总结

这篇随笔的目的&#xff1a; 这篇是我今天重新安装后&#xff0c;觉得每次都看别人的来复制&#xff0c;太麻烦了&#xff0c;每次自己解决的一些问题&#xff0c;又不能及时记录下来&#xff0c;导致每次都又需要一通乱找&#xff0c;肯定比第一次开始搜索的要快&#xff0c;但…

java空心正方形代码_从Java中的用户输入绘制空心星号正方形/矩...

我正在尝试创建一个程序,要求用户提供正方形/矩形的宽度和长度尺寸,然后使用#符号将其绘制出来.我几乎了解了,除了我似乎不太了解矩形的右边以正确打印出来…这是我的代码&#xff1a;import java.util.Scanner;public class warmup3{public static void main(String[] args){i…

2017.4.17------软件测试的艺术+整理以前的摘记

2017.4.17 以下内容来自《软件测试的艺术》 第1页——14页。供自己学习使用。 第一章 软件测试&#xff1a;就是一个过程或一个系列过程&#xff0c;用来确认计算机代码完成了其应该完成的功能&#xff0c;不执行其不该有的操作。 第二章 测试人员需要有正确的态度。每当测试一…

基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)

基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文) 导读&#xff1a;触摸屏能够直观、生动地显示运行参数和运行状态&#xff0c;而且通过触摸屏画面可以直接修改系统运行参数&#xff0c;人机交互性好。触摸屏和单片机通信&#xff0c;需要根据触摸屏采用的通信协议为单片机编…

java mask_Java 三大属性:

# Java 三大属性&#xff1a;面试时候问的一个很基础的问题&#xff0c;也是面向对象的三大特点。## 一、封装首先&#xff0c;属性可用来描述同一类事物的特征&#xff0c;方法可描述一类事物可做的操作。封装就是把属于同一类事物的共性(包括属性与方法)归到一个类中&#xf…

java 事物_java事务

1、事务的四大特性(1)原子性(Atomicity)&#xff1a;原子性是指事务包含的所有操作要么全部成功&#xff0c;要么全部失败回滚。失败回滚的操作事务&#xff0c;将不能对数据库有任何影响(2)一致性(Consistency)&#xff1a;一致性是指事务必须使数据库从一个一致性状态变换到另…

【转】C#之继承

C#之继承 一.继承的类型  在面向对象的编程中&#xff0c;有两种截然不同继承类型&#xff1a;实现继承和接口继承  1.实现继承和接口继承  *实现继承&#xff1a;表示一个类型派生于基类型&#xff0c;它拥有该基类型的所有成员字段和函数。在实现继承中&#xff0c;派生…

java 学习计划_Java学习计划范例

Java学习计划范例Java学习计划好的计划是成功的一半&#xff0c;今天是在创新思维的第一节课&#xff0c;在这门课程的开始&#xff0c;一个有策略的、有目的性的计划是非常必要的&#xff0c;为了在以后的学习中能够达到最好的.效果&#xff0c;"坚持"是一把雕刻刀&…

SQL Server 2012自动备份

SQL 2012和2008一样&#xff0c;都可以做维护计划&#xff0c;来对数据库进行自动的备份。 现在做这样一个数据库维护的计划&#xff0c;每天0点对数据库进行差异备份&#xff0c;每周日0点对数据库进行完全备份&#xff0c;并且每天晚上10点删除一次过期备份&#xff08;两个星…

mysql查逻辑表的分片规则_MySQL(19) Mycat分片(分库分表)配置

一、前言本文将基于主从复制&#xff0c;读写分离的环境基础上进行一个简单的分片(分库分表)配置二、Mycat分片配置mycat分片主要在scheam.xml&#xff0c;rule.xml这2个表中配置① scheam.xml&#xff1a;配置逻辑表以及对应使用的分片规则select user()这里小编主要对t_user表…

JS取消浏览器文本选中的方法

一 、问题的出现 今天在使用Easy-UI 的messager.alert()方法时候出现浏览器文本被选中&#xff0c;不知道其中是什么原因&#xff0c;如下图所示。 二 、解决思路 我最后的思路时在弹出消息框的同时&#xff0c;取消浏览器文本的选择&#xff0c;最后查找资料编写如下方法。  …

java 重构 if else_项目中的if else太多了,该怎么重构?

前言if else过多的话&#xff0c;一般都是用策略模式来进行重构&#xff0c;策略模式也非常的简单。先定义一个接口&#xff0c;各种处理分支实现这个接口&#xff0c;定义好 条件->处理类的映射关系&#xff0c;然后根据条件找到响应的处理类执行即可&#xff0c;当有新的分…

读书笔记:秘密

2017年立下了读30本书的旗子&#xff0c;现在这是第3本&#xff0c;是一本小说&#xff0c;东野圭吾的小说《秘密》。看小说也可以看出生活&#xff0c;但是是为了娱乐&#xff0c;是为了放松&#xff0c;小说本身挺好看的&#xff5e;引人入胜&#xff0c;一看到底类型。读书前…

mysql的student是什么意思_复习mysql

一、复习详尽如下&#xff1a;创建一个test库create database test;授权一个用户grant all privileges on *.* to xiang% identified by 1qazWSX;创建表create table student(id int not null);查询select * from tabel_name where 条件1 and 条件2增加insert into table_name …

算法复杂度的理解

算法复杂度的理解 from:http://blog.sina.com.cn/s/blog_4bab8e7f0102vmth.html算法复杂度分为时间复杂度和空间复杂度。 时间复杂度的计算 ​1.一个算法执行所耗费的时间&#xff0c;从理论上是不能算出来的&#xff0c;必须上机运行测试才能知道。但我们不可能也没有必要对每…

php如何将mysql数据库中的admin字段赋值给session_php实现将Session写入数据库

/**author Fahy*数据库为mysql&#xff0c;*数据库名为session&#xff0c;表名为session&#xff0c;*表中字段包括PHPSESSID,update_time,client_ip,data*/class Session{private static $handler null;private static $ip null;private static $lifetime null;private st…

linux 脚本 java_Linux 通过脚本执行Java程序

由于要统计不同的IP&#xff0c;代码中应用了HashSet来存放IP地址。上述Java程序是在Windows下编写的&#xff0c;如果在Linux服务器上运行&#xff0c;只需要把上面文件的路径和文件更换了就可以了。2.编写好java程序后&#xff0c;将java程序打成jar文件(环境Linux)我将上述测…