热点
【站长发帖】数码互联时代物联网安全与移动风险防控指南,reasoning_content:我们要求以网站管理员的口吻,写一个与技术、科技相关,关于物联网安全与移动风险防控:数码互联时代的防护指南的标题需要简短精炼,30字以内直接输出标题,不要加说明nn考虑用“网站管理员”的口吻,可以包含“站长发帖”、“管理员提醒”之类的语气但标题本身需要是文章标题可能类似:“物联网安全与移动风险防控:数码互联时代的防护指南”本身就是副标题?我们需要重新构思一个更简短的标题nn示例:“【站长发帖】物联网安全与移动风险防控指南”但字数可能超?要30字以内或者“数码互联时代的防护指南:物联网安全与移动风险防控”太长nn更精炼:“物联网安全与移动风险防控指南”正好?但缺少“数码互联时代”的修饰可以:“数码互联时代:物联网安全与移动风险防控” 字数:14个字?数一下:“数码互联时代:物联网安全与移动风险防控” 共15个汉字?实际:数码互联时代(5字)+冒号+物联网安全与移动风险防控(11字)=16字?再算:数码互联时代(5个字符),冒号1,物联网安全与移动风险防控(11个字符),总17个字符,可以nn但需要以网站管理员口吻,可以在前面加“管理员提示:”但这样可能变成“管理员提示:数码互联时代:物联网安全与移动风险防控” 字数:管理员提示(4字)+冒号+后面17字=22字,可以但“管理员提示”不太像标题可以用“【管理员专刊】”之类的但要求直接输出标题,不要说明,所以最好就是标题本身nn考虑到用户要求:以'网站管理员'的口吻,意思是标题的表述应该是从管理员视角出发,比如“本站管理员提醒:...”但这样太啰嗦更常见的做法是在标题中体现“站长发帖”或“管理员解读”之类的词语,比如“站长发帖:物联网安全与移动风险防控指南”字数:站长发帖(4)+冒号+后面13?实际“物联网安全与移动风险防控指南”12字?物联网安全与移动风险防控指南:物联网(3)+安全(2)+与(1)+移动(2)+风险(2)+防控(2)+指南(2)=14字?数一下:物联网(3)、安全(2)、与(1)、移动(2)、风险(2)、防控(2)、指南(2) 共14个汉字,加上冒号和站长发帖4字共19字,符合30字内但需要体现“数码互联时代”吗?原文有“数码互联时代的防护指南”,可以简化成“数码互联时代防护指南”但字数超?其实可以合并:“数码互联时代物联网安全与移动风险防控指南”字数:数码互联时代(5)+物联网安全与移动风险防控指南(14)=19字,也很简洁但这样没有管理员口吻nn最好的办法:在标题前加“【站长发帖】”或“【管理员提醒】”等例如:“【站长发帖】数码互联时代物联网安全与移动风险防控指南” 字数:中括号加站长发帖(8个字符?实际上【站长发帖】是5个汉字?【和】算标点,站长发帖4字,共6字符?准确:'【站长发帖】'共5个字符(左括号、站、长、发、帖、右括号?等等,【是1个字符,站1,长1,发1,帖1,】1,共6个字符)然后加空格?直接连接:“【站长发帖】数码互联时代物联网安全与移动风险防控指南” 总汉字数:6+5+14=25个字符?数一下:【站长发帖】6个字符,数码互联时代5个字符,物联网安全与移动风险防控指南14个字符,共25字符,符合30字以内但注意中文字符算一个,英文标点也算一个应该没问题或者更简洁:“【站长发帖】物联网安全与移动风险防控” 但少了数码互联时代考虑到原文主题是“数码互联时代的防护指南”,保留更好nn另一种:“管理员必读:数码互联时代物联网安全与移动风险防控” 字数:管理员必读(4)+冒号(1)+后面(5+14=19)=24也可以nn但用户要求“简短精炼”,可能不需要太多前缀我觉得直接输出“数码互联时代物联网安全与移动风险防控指南”也可以,因为用户说“以'网站管理员'的口吻”,但没说一定要在标题中出现“管理员”字样口吻可以体现在风格上,比如用“指南”这种建议性词汇但为了明确符合要求,最好加上“站长发帖”或“管理员提示”之类nn权衡后,我选择:“【站长发帖】数码互联时代的物联网安全与移动风险防控指南” 检查字数: 【站长发帖】6字 + 数码互联时代的(7字?数码互联时代是5字,加“的”1字共6字?注意:数码互联时代是5个汉字?数:数、码、互、联、时、代——6个?不对,“数码互联时代”是数码(2)、互联(2)、时代(2)总共6个汉字我前面误算了重新计算:数码(2)、互联(2)、时代(2)=6字加上“的”1字=7字然后“物联网安全与移动风险防控指南”——物联网(3)、安全(2)、与(1)、移动(2)、风险(2)、防控(2)、指南(2)=14字加上前面的”【站长发帖】6字,总6+7+14=27字符合30字内可以nn为了更精炼,可以去掉“的”字:“【站长发帖】数码互联时代物联网安全与移动风险防控指南” 这样数码互联时代6字 + 物联网...14字 + 前缀6字 = 26字很好nn但注意:原主题有“移动风险防控”,我写的是“物联网安全与移动风险防控”,其中“与”字是否必要?可以改为“物联网安全及移动风险防控”但“及”字也是“物联网安全移动风险防控”可能歧义保持原样nn最终标题定为:“【站长发帖】数码互联时代物联网安全与移动风险防控指南”nn输出时直接写这个
iOS安全开发精进:语言特性、函数封装与变量管理,reasoning_content:我们要求以数据安全工程师的口吻,写一个与技术、科技相关,关于iOS开发精进:语言特性精通、函数封装技巧与变量管理规范的标题需要简短精炼,30字以内直接输出标题nn注意口吻是数据安全工程师,那么标题应该体现安全视角,同时涵盖iOS开发的语言特性、函数封装、变量管理可以结合安全考虑,比如变量管理规范可能涉及数据安全、内存安全等建议标题如:iOS安全开发:语言特性、函数封装与变量管理规范 但字数可能超?计算:iOS安全开发:语言特性、函数封装与变量管理规范 共?中文字符+标点实际上“iOS安全开发:语言特性、函数封装与变量管理规范” 有18个汉字+2个冒号+2个逗号?不,冒号一个,逗号两个?实际是“iOS安全开发:语言特性、函数封装与变量管理规范” 汉字:iOS(3个英文字母算?通常标题中英文算一个字符?但要求30字以内,通常指汉字字数可考虑用更简洁的或者数据安全视角下的iOS开发精进:语言特性与变量管理 但缺少函数封装或者iOS精进:安全编码中的语言特性、封装与变量管理 等等nn为了体现数据安全工程师口吻,可加入安全编码、防护等词尝试:数据安全工程师谈iOS开发:语言特性、函数封装与变量管理规范 太长精简:iOS安全开发精进:语言特性与变量管理规范 缺少函数封装加上函数封装:iOS安全开发精进:语言特性、函数封装与变量管理 字数:iOS安全开发精进:语言特性、函数封装与变量管理 共?汉字:安、全、开、发、精、进、语、言、特、性、函、数、封、装、与、变、量、管、理 -> 19个汉字,加上冒号和英文iOS(3个英文)但通常算字符数,英文按一个字符算,总字符22,符合30字以内可以nn为了更准确,用中文全称?iOS开发精进:安全视角下的语言特性与变量管理 不够全面我觉得上面那个不错或者更直接:安全编码:iOS语言特性、函数封装与变量管理规范 但少了精进最终决定:直接输出一个标题
用户调研|VR后端必备:MsSql存储与触发器实战,reasoning_content:我们要求以用户调研专员的口吻,写一个与技术、科技相关,关于[VR数据后端必备:MsSql存储与触发器实战解析]的标题直接输出一个标题,不要加说明提示等字数30字以内nn注意:口吻是用户调研专员,所以要体现调研、用户角度?还是说只是模拟这个角色的口吻?实际上标题需要简洁,可能偏向于技术内容用户调研专员通常是了解用户需求、做调研的,所以标题可以强调用户侧或调研发现之类的但更直接的是,要求写一个标题,主题是VR数据后端必备的MsSql存储与触发器实战解析我们直接写一个标题nn例如:VR后端调研:MsSql存储与触发器实战解析 但字数有点多,且可能不够精炼或者:用户调研|VR后端必备:MsSql存储与触发器实战 但需要控制在30字内我们数一下:用户调研|VR后端必备:MsSql存储与触发器实战 共22字(包括符号)符合nn或者更简洁:VR数据后端必备:MsSql存储与触发器实战解析 但没说用户调研专员口吻可以在前面加调研发现:之类的但直接输出标题,不解释nn考虑用户调研专员可能是在做用户调研后得出的结论,所以标题可以带有调研字样例如:调研报告:VR后端MsSql存储与触发器实战 约16字或者:VR数据后端实战:MsSql存储与触发器(用户调研版) 但有点长nn最终我选择:用户调研|VR后端必备:MsSql存储与触发器实战 共21个字(包括标点),且符合要求
17 9 月 2026, 周四

Java进阶之深入理解负载平均的五种算法实现原理

前言

什么是负载均衡:

 

指由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种 负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。负载均衡能够平均分配客户请求到服 务器阵列,借此提供快速获取重要数据,解决大量并发访问服务问题,这种集群技术可以用最少的投资获得接近于大型主机的性能;

 

今天我们就来说说;

 

一、负载均衡算法简介

 

 

1、轮询法

 

将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载;

 

2、随机法

 

通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果;

 

3、源地址哈希法

 

源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问;

 

4、加权轮询法

 

不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端;

 

5、加权随机法

 

与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序;

 

二、代码实现负载均衡五种算法

1.轮询法

 

import java.util.*; 

import java.util.concurrent.ConcurrentHashMap; 

public class TestRoundRobin {  

    // 1.定义map, key-ip,value-weight 

    static Map<String,Integer> ipMap=new HashMap<>(); 

    static { 

        ipMap.put("192.168.13.1",1); 

        ipMap.put("192.168.13.2",1); 

        ipMap.put("192.168.13.3",1); 

    } 

// Integer sum=0; 

    Integer  pos = 0; 

    public String RoundRobin(){ 

        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 

        ipServerMap.putAll(ipMap); 

        // 2.取出来key,放到set中 

        Set<String> ipset=ipServerMap.keySet(); 

        // 3.set放到list,要循环list取出 

        ArrayList<String> iplist=new ArrayList<String>(); 

        iplist.addAll(ipset); 

        String serverName=null; 

        // 4.定义一个循环的值,如果大于set就从0开始 

        synchronized(pos){ 

            if (pos>=ipset.size()){ 

                pos=0; 

            } 

            serverName=iplist.get(pos); 

            //轮询+1 

            pos ++; 

        } 

        return serverName; 

    } 

    public static void main(String[] args) { 

        TestRoundRobin testRoundRobin=new TestRoundRobin(); 

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

            String serverIp=testRoundRobin.RoundRobin(); 

            System.out.println(serverIp); 

        } 

    } 

2.加权轮询法

 

import java.util.*; 

import java.util.concurrent.ConcurrentHashMap; 

public class TestWeightRobin { 

    //    1.map, key-ip,value-weight 

    static Map<String,Integer> ipMap=new HashMap<>(); 

    static { 

        ipMap.put("192.168.13.1",1); 

        ipMap.put("192.168.13.2",2); 

        ipMap.put("192.168.13.3",4); 

    } 

    Integer pos=0; 

    public String WeightRobin(){ 

        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 

        ipServerMap.putAll(ipMap); 

        Set<String> ipSet=ipServerMap.keySet(); 

        Iterator<String> ipIterator=ipSet.iterator(); 

        //定义一个list放所有server 

        ArrayList<String> ipArrayList=new ArrayList<String>(); 

        //循环set,根据set中的可以去得知map中的value,给list中添加对应数字的server数量 

        while (ipIterator.hasNext()){ 

            String serverName=ipIterator.next(); 

            Integer weight=ipServerMap.get(serverName); 

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

                ipArrayList.add(serverName); 

            } 

        } 

        String serverName=null; 

        if (pos>=ipArrayList.size()){ 

            pos=0; 

        } 

        serverName=ipArrayList.get(pos); 

        //轮询+1 

        pos ++; 

        return  serverName; 

    } 

    public static void main(String[] args) { 

        TestWeightRobin testWeightRobin=new TestWeightRobin(); 

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

            String server=testWeightRobin.WeightRobin(); 

            System.out.println(server); 

        } 

    } 

3.随机法

 

import java.util.*; 

import java.util.concurrent.ConcurrentHashMap; 

public class TestRandom { 

    //    1.定义map, key-ip,value-weight 

    static Map<String,Integer> ipMap=new HashMap<>(); 

    static { 

        ipMap.put("192.168.13.1",1); 

        ipMap.put("192.168.13.2",2); 

        ipMap.put("192.168.13.3",4); 

    } 

    public String Random() { 

        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 

        ipServerMap.putAll(ipMap); 

        Set<String> ipSet=ipServerMap.keySet(); 

        //定义一个list放所有server 

        ArrayList<String> ipArrayList=new ArrayList<String>(); 

        ipArrayList.addAll(ipSet); 

        //循环随机数 

        Random random=new Random(); 

        //随机数在list数量中取(1-list.size) 

        int pos=random.nextInt(ipArrayList.size()); 

        String serverNameReturn= ipArrayList.get(pos); 

        return  serverNameReturn; 

    } 

    public static void main(String[] args) { 

        TestRandom testRandom=new TestRandom(); 

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

            String server=testRandom.Random(); 

            System.out.println(server); 

        } 

    } 

4.加权随机

 

import java.util.*; 

import java.util.concurrent.ConcurrentHashMap; 

public class TestRobinRandom { 

    //    1.定义map, key-ip,value-weight 

    static Map<String,Integer> ipMap=new HashMap<>(); 

    static { 

        ipMap.put("192.168.13.1",1); 

        ipMap.put("192.168.13.2",2); 

        ipMap.put("192.168.13.3",4); 

    } 

    public String RobinRandom(){ 

        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 

        ipServerMap.putAll(ipMap); 

        Set<String> ipSet=ipServerMap.keySet(); 

        Iterator<String> ipIterator=ipSet.iterator(); 

        //定义一个list放所有server 

        ArrayList<String> ipArrayList=new ArrayList<String>(); 

        //循环set,根据set中的可以去得知map中的value,给list中添加对应数字的server数量 

        while (ipIterator.hasNext()){ 

            String serverName=ipIterator.next(); 

            Integer weight=ipServerMap.get(serverName); 

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

                ipArrayList.add(serverName); 

            } 

        } 

        //循环随机数 

        Random random=new Random(); 

        //随机数在list数量中取(1-list.size) 

        int pos=random.nextInt(ipArrayList.size()); 

        String serverNameReturn= ipArrayList.get(pos); 

        return  serverNameReturn; 

    } 

    public static void main(String[] args) { 

        TestRobinRandom testRobinRandom=new TestRobinRandom(); 

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

            String server=testRobinRandom.RobinRandom(); 

            System.out.println(server); 

        } 

    } 

5.源地址哈希法

 

import java.util.ArrayList; 

import java.util.HashMap; 

import java.util.Map; 

import java.util.Set; 

import java.util.concurrent.ConcurrentHashMap; 

public class ipHash { 

    //    1.定义map, key-ip,value-weight 

    static Map<String,Integer> ipMap=new HashMap<>(); 

    static { 

        ipMap.put("192.168.13.1",1); 

        ipMap.put("192.168.13.2",2); 

        ipMap.put("192.168.13.3",4); 

    } 

    public String ipHash(String clientIP){ 

        Map<String,Integer> ipServerMap=new ConcurrentHashMap<>(); 

        ipServerMap.putAll(ipMap); 

        //    2.取出来key,放到set中 

        Set<String> ipset=ipServerMap.keySet(); 

        //    3.set放到list,要循环list取出 

        ArrayList<String> iplist=new ArrayList<String>(); 

        iplist.addAll(ipset); 

        //对ip的hashcode值取余数,每次都一样的 

        int hashCode=clientIP.hashCode(); 

        int serverListsize=iplist.size(); 

        int pos=hashCode%serverListsize; 

        return iplist.get(pos); 

    } 

    public static void main(String[] args) { 

        ipHash iphash=new ipHash(); 

        String servername= iphash.ipHash("192.168.21.2"); 

        System.out.println(servername); 

    } 

总结 

不进则退,一起加油!

dawei

【声明】:毕节站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

您错过了