负载均衡集群——LVS-DR配置
一、简介
1.1 什么是集群?
两台及以上的计算机完成一个任务的模式称为集群。
常见的集群类型包括:
LB(负载均衡)集群:按照不同的算法将前端的访问转发给后端计算点,使节点负载相对平衡。提高并发能力
缺点:负载节点只有一个,容易访问瓶颈,可能存在单点故障
解决方法:增加多个节点,选举主节点(master),访问的IP称为VIP,正常情况下绑定在master上。节点之间有一条心跳检测的线路,若master心跳检测不到了,重新选举master,VIP漂移到新的节点上。
HA(高可用性)集群:保障应用持久、不间断的提供服务,出现故障时应用可以自动快速的切换节点
重切换节点方式称为漂移
HPC(高性能计算)集群:软硬件协同工作的系统,通过集群架构、并行算法等实现单台计算机无法达到的运行速度。(科研居多)
1.2 基于Linux的负载均衡集群软件
LVS——开源的四层(传输层)负载均衡软件
Nginx——支持四层和七层(应用层)负载均衡
HAProxy——支持四层和七层负载均衡
1.3 基于Linux的高可用集群软件
Keepalived:轻量级高可用集群部署软件,为LVS设计,可实现集群的心跳检测、虚拟IP漂移等功能
Hearbeat:与keepalived类似,但不控制虚拟IP的漂移,配置也比较复杂。更擅长资源服务的控制(NFS)
Pacemaker:开源集群资源管理器,不具备心跳检测,需依赖Corosync或Hearbeat,应用广泛,可同时适用于任何规模的集群
集群常见概念
VIP:虚拟IP,一般使用VIP向外提供服务,避免切换master后引起的业务访问IP变化
地址漂移:VIP从一台主机切换到另一台主机
心跳:机制、在高可用集群中,主机之间相互监控彼此状态,以决定哪台主机提供服务
脑裂:现象、如果节点之间心跳中断或不正常,会导致彼此之间争夺资源
代理:正向代理和反向代理。相对与被代理者来说的,正向代理被代理的是客户端(客户需要什么),反向代理被代理的是服务端(商店提供什么)

1.4 LVS相关术语
为了方便大家探讨LVS技术,LVS社区提供了一个命名的约定,内容如下表

1.5 LVS调度算法
调度方法决定了如何在这些集群节点之间分布工作负荷。
当Director收到来自客户端计算机访问她的VIP上的集群服务的入站请求时,Director必须决定那个集
群节点应该获得请求。Director可用于做出该决定的调度方法分成两个基本类别:
固定调度算法:rr,wrr,dh,sh
动态调度算法:wlc,lblc,lblcr,SED,NQ(后两种官方站点没提到)
| 算法 | 说明 |
| rr | 轮循调度(Round-Robin), 它将请求依次分配不同的RS,也就是在RS中均摊请求。这种算法简单,但是只适合于处理性能相差不大的情况 |
| wrr | 加权轮循调度(Weighted Round-Robin) 它将依据不同RS的权值分配任务。权值较高的RS将优先获得任务,并且分配到的连接数将比权值较低的RS更多。相同权值的RS得到相同数目的连接数。 |
| dh | 目的哈希调度(Destination Hashing) 以目的地址为关键字查找一个静态hash表来获得需要的RS。 |
| sh | 源地址哈希调度(source hashing) 以源地址为关键字查找一个静态hash表来获得需要的RS。 |
| wlc | 加权最小连接数调度(weighted leastconnection) 假设各台RS的权值依次为wi(i=1..n),当前的TCP连接数依次为Ti(i=1..n),依次选取Ti/Wi为最小的RS作为下一个分配的RS。 |
| lc | 最小连接数调度(Least-Connection), IPVS表存储了所有的活动的连接。把心的连接请求发送到当前连接数最小的RS。 |
| lblc | 基于地址的最小连接数调度(locality-Based Least-Connection) 将来自同一目的地址的请求分配给同一台RS如果这台服务器尚未满负荷,否则分配给连接数最小的RS,并以它为下一次分配的首先考虑。 |
| lblcr | 基于地址带重复最小连接数调度(Locality-Based Least-Connection with Replication) 对于某一目的地址,对应有一个RS子集。 对此地址请求,为它分配子集中连接数最小RS;如果服务器中所有子集均已满负荷,则从集群中选择一个连接数较小服务器,将它加入到此子集并分配连接;若一定时间内,未被做任何修改,则将子集中负载最大的节点从子集删除。 |
| SED | 最短期望的延迟(shortest expected delay scheduling SED)(SED) 基于wlc算法。 举例: ABC三台机器分别权重123,连接数也分别是123.那么如果使用wlc算法的话一个新请求进入时它可能会分给ABC中的任意一个。使用sed算法后会进这样一个运算 A(1+1)/1 B(1+2)/2 C(1+3)/3 根据运算结果,把连接交给C。 |
| NQ | 最少队列调度(Never Queue Scheduling NQ)(NQ) 无需队列。如果有台realserver的连接数=0就直接分配过去,不需要在进行sed运算 |
二、负载均衡集群
2.1 LVS工作模式——DR配置
在DR模式中,所有的RS(真实的服务器)都需要配置两个地址:RIP和VIP
环境:四台虚拟机 一台配置为LVS服务器 两台用于Nginx服务器的搭建 剩余一台为Client.
LVS仅需要一个网卡可用,两台Nginx服务器和LVS服务器处于同一子网中,客户端位于另一个子网 ,思路如下

实际配置自己方便区分即可,但是VIP必须是该网段里没用过的
LB : 192.168.1.111
(RS)nginx1 : 192.168.1.112
(RS)nginx2 : 192.168.1.113
Client : 192.168.1.11
VIP: 192.168.1.10(后续单独配置)
2.1.1 nginx服务器配置
1.RS下载nginx服务
(两个nginx服务器都尝试相同的操作)
yum install nginx -y
会提供一个默认主页

尝试访问主页
向主页输入内容:
[root@openeuler-1 ~]# echo "web test page,ip is `hostname -I`." > /usr/share/nginx/html/index.html 设置开机自启动,将输入的内容覆盖原有页面:
[root@openeuler-1 ~]# systemctl enable --now nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.访问页面,覆盖成功:
[root@openeuler-1 ~]# curl localhost
web test page,ip is 192.168.1.113 .
注意: `hostname -I` 表示输入当前主机IP, 两台机器ip不一样,所以访问出来的页面IP也不一样
纠错提醒:如果输入时内容输错,重新输入重启服务即可覆盖
如果输错了文件夹,将其移动到正确的文件即可,不用重启: mv /错误的文件 /正确的文件
2.绑定VIP
[root@openeuler-1 ~]# nmcli con add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.1.10/32
Connection 'dummy-dummy1' (231b9ead-7b44-4daf-b8b1-2a9a6d864dfb) successfully added.
[root@openeuler-1 ~]# ip a
3.arp抑制
在文件最后加入如下配置
[root@openeuler-1 ~]# vim /etc/sysctl.conf
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.dummy1.arp_ignore = 1
net.ipv4.conf.dummy1.arp_announce = 2使文件生效:
[root@openeuler-1 ~]# sysctl -p查看是否生效:
[root@openeuler-1 ~]# ip a
...
3: dummy1: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
...
到此,nginx服务器就配置完成了。
2.1.2 LB服务器配置
1)绑定VIP
nmcli con add type dummy ifname dummy1 ipv4.method manual ipv4.addresses 192.168.1.10/32
2)安装工具ipvsadm
yum install ipvsadm -y
3)LVS配置
手工执行配置添加LVS服务并增加两台RS
[root@Directory ~]# ipvsadm -C 清除当前配置
[root@Directory ~]# ipvsadm --set 30 5 60
因为此前没有配置过,所以这两步可省略,直接添加LVS服务
添加LVS服务:
[root@Directory ~]# ipvsadm -At 192.168.1.10:80 -s rr增加真实的服务器RS:
[root@Directory ~]# ipvsadm -at 192.168.1.10:80 -r 192.168.1.112:80 -g
[root@Directory ~]# ipvsadm -at 192.168.1.10:80 -r 192.168.1.113:80 -g 查看配置[root@Directory ~]# ipvsadm -L -nIP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port Forward Weight ActiveConn InActConnTCP 192.168.1.10:80 rr-> 192.168.1.112:80 Route 1 0 0 -> 192.168.1.113:80 Route 1 0 0
rr:轮询算法 轮流提供服务
-g:DR模式
-At = -A -t 两种写法,可分开也可合并
[相关参数说明]
[root@Directory ~]# ipvsadm –help
-A 添加虚拟服务器
-t 设置群集地址(VIP,Virtual IP)
-s 指定负载调度算法
-a 添加真实服务器
-d 删除真实服务器
-r 指定真实服务器(Real Server)的地址
-m 使用NAT模式;-g、-i分别对应DR、TUN模式
-w 为节点服务器设置权重,默认为1
[删除方法]
# ipvsadm -D -t 192.168.79.110:80 -s wrr
# ipvsadm -d -t 192.168.79.110:80 -r 192.168.79.118:80
2.1.3 client客户机测试
1)测试连通性
访问nginx服务器,113服务器无法访问可能是该服务器防火墙有限制, 阻止了对目标端口(如 80 端口)的访问
[root@openeuler-1 ~]# curl 192.168.1.112
web test page,ip is 192.168.1.112 .
[root@openeuler-1 ~]# curl 192.168.1.113
curl: (7) Failed to connect to 192.168.1.113 port 80 after 0 ms: No route to host
开放nginx113服务器80端口
[root@openeuler-1 ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@openeuler-1 ~]# firewall-cmd --reload
success
再次访问
[root@openeuler-1 ~]# curl 192.168.1.113
web test page,ip is 192.168.1.113 .
2)关闭服务器和客户机的防火墙和SElinux
ps:每台都要关
[root@openeuler-1 ~]# systemctl stop firewalld
[root@openeuler-1 ~]# setenforce 0
setenforce: SELinux is disabled
[root@openeuler-1 ~]# for ((i=1;i<=6;i++)); do curl 192.168.1.10; done
web test page,ip is 192.168.1.113 .
web test page,ip is 192.168.1.112 .
web test page,ip is 192.168.1.113 .
web test page,ip is 192.168.1.112 .
web test page,ip is 192.168.1.113 .
web test page,ip is 192.168.1.112 .
2.1.4自动配置脚本
每次都要手动配置较为麻烦,为了方便可以做一个启动脚本
1)清除之前的配置
ipvsadm -C #清除配置ipvsadm -Ln #查看nmcli connection delete dummy-dummy1 #删除网络ip a
2)LB代理服务器 上的脚本:
注意:脚本内容需要根据自身ip、网段、端口不同更改相应配置
vim /etc/init.d/lvs_dr
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.95.10
RIP1=192.168.95.11
RIP2=192.168.95.12
DipName=ens33
. /etc/rc.d/init.d/functions
start() {PID=`ipvsadm -Ln | grep ${VIP} | wc -l`if [ $PID -gt 0 ];thenecho "The LVS-DR Server is already running !"else#Set the Virtual IP Address/sbin/ifconfig ${DipName}:10 $VIP broadcast $VIP netmask
255.255.255.255 up/sbin/route add -host $VIP dev ${DipName}:10#Clear IPVS Table/sbin/ipvsadm -C#Set Lvs/sbin/ipvsadm -At $VIP:80 -s rr/sbin/ipvsadm -at $VIP:80 -r $RIP1:80 -g/sbin/ipvsadm -at $VIP:80 -r $RIP2:80 -g/bin/touch $LOCK#Run Lvsecho "starting LVS-DR Server is ok !" fi
}
stop() {#clear Lvs and vip/sbin/ipvsadm -C/sbin/route del -host $VIP dev ${DipName}:10/sbin/ifconfig ${DipName}:10 down >/dev/nullrm -rf $LOCKecho "stopping LVS-DR server is ok !"
}
status() {if [ -e $LOCK ];thenecho "The LVS-DR Server is already running !"elseecho "The LVS-DR Server is not running !"fi
}
case "$1" instart)start;;stop)stop;;restart)stopstart;;
status)status;;
*)echo "Usage: $1 {start|stop|restart|status}"exit 1
esac
exit 0
3)RS上的脚本
vim /etc/init.d/rs_dr
#!/bin/sh
#
# Startup script handle the initialisation of LVS
# chkconfig: - 28 72
# description: Initialise the Linux Virtual Server for DR
#
### BEGIN INIT INFO
# Provides: ipvsadm
# Required-Start: $local_fs $network $named
# Required-Stop: $local_fs $remote_fs $network
# Short-Description: Initialise the Linux Virtual Server
# Description: The Linux Virtual Server is a highly scalable and highly
# available server built on a cluster of real servers, with the load
# balancer running on Linux.
# description: start LVS of DR-RIP
LOCK=/var/lock/ipvsadm.lock
VIP=192.168.95.10
. /etc/rc.d/init.d/functions
start() {PID=`ifconfig | grep lo:10 | wc -l`if [ $PID -ne 0 ];thenecho "The LVS-DR-RIP Server is already running !"else/sbin/ifconfig lo:10 $VIP netmask 255.255.255.255 broadcast $VIP up/sbin/route add -host $VIP dev lo:10echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "1" >/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/eth0/arp_announceecho "1" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "2" >/proc/sys/net/ipv4/conf/all/arp_announce/bin/touch $LOCKecho "starting LVS-DR-RIP server is ok !"fi
}
stop() {/sbin/route del -host $VIP dev lo:10/sbin/ifconfig lo:10 down >/dev/nullecho "0" >/proc/sys/net/ipv4/conf/lo/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/lo/arp_announceecho "0" >/proc/sys/net/ipv4/conf/eth0/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/eth0/arp_announceecho "0" >/proc/sys/net/ipv4/conf/all/arp_ignoreecho "0" >/proc/sys/net/ipv4/conf/all/arp_announcerm -rf $LOCKecho "stopping LVS-DR-RIP server is ok !"
}
status() {if [ -e $LOCK ];thenecho "The LVS-DR-RIP Server is already running !"elseecho "The LVS-DR-RIP Server is not running !"fi
}
case "$1" instart)start;;stop)stop;;restart)stopstart;;
status)status;;
*)echo "Usage: $1 {start|stop|restart|status}"exit 1
esac
exit 0
两个脚本都设置开机自启,这里以LB服务器的为例
chkonfig --add lvs_drchkconfig lvs_dr onsystemctl start lvs_dr
然后在客户机上测试即可
相关文章:
负载均衡集群——LVS-DR配置
一、简介 1.1 什么是集群? 两台及以上的计算机完成一个任务的模式称为集群。 常见的集群类型包括: LB(负载均衡)集群:按照不同的算法将前端的访问转发给后端计算点,使节点负载相对平衡。提高并发能力 缺…...
数据结构篇
链表 用数组模拟链表,看该链表结构,有几个域则用几个数组分别存储 单链表是只知道下一个元素位置,双链表还知道上一个链表位置 单链表 双向链表 左移右移 栈 模拟栈 判断括号序列 队列 模拟队列 递归 集合和哈希 集合就是哈希表 哈希表的实现…...
「软件设计模式」建造者模式(Builder)
深入解析建造者模式:用C打造灵活对象构建流水线 引言:当对象构建遇上排列组合 在开发复杂业务系统时,你是否经常面对这样的类:它有20个成员变量,其中5个是必填项,15个是可选项。当用户需要创建豪华套餐A&…...
Matlab 机器人 雅可比矩阵
工业机器人运动学与Matlab正逆解算法学习笔记(用心总结一文全会)(四)——雅可比矩阵_staubli机器人正逆向运动学实例验证matlab-CSDN博客 matlab求雅可比矩阵_六轴机械臂 矢量积法求解雅可比矩阵-CSDN博客 (63 封私信 / 80 条消息…...
DeepSeek 助力 Vue 开发:打造丝滑的面包屑导航(Breadcrumbs)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
IntelliJ IDEA 2024.1.4版无Tomcat配置
IntelliJ IDEA 2024.1.4 (Ultimate Edition) 安装完成后,调试项目发现找不到Tomcat服务: 按照常规操作添加,发现服务插件中没有Tomcat。。。 解决方法 1、找到IDE设置窗口 2、点击Plugins按钮,进入插件窗口,搜索T…...
chrome://version/
浏览器输入: chrome://version/ Google浏览器版本号以及安装路径 Google Chrome131.0.6778.205 (正式版本) (64 位) (cohort: Stable) 修订版本81b36b9535e3e3b610a52df3da48cd81362ec860-refs/branch-heads/6778_155{#8}操作系统Windows…...
知识图谱数据库 Neo4j in Docker笔记
下载 docker pull neo4j:community官方说明 https://neo4j.com/docs/operations-manual/2025.01/docker/introduction/ 启动 docker run \--restart always \--publish7474:7474 --publish7687:7687 \--env NEO4J_AUTHneo4j/your_password \--volumeD:\files\knowledgegrap…...
【动手学强化学习】02多臂老虎机
问题定义 强化学习关注的是在于环境交互中学习,是一种试错学习的范式。在正式进入强化学习之前,我们先来了解多臂老虎机问题。该问题也被看作简化版的强化学习,帮助我们更快地过度到强化学习阶段。 有一个拥有 K K K 根拉杆的老虎机&#…...
【网络编程】之Udp网络通信步骤
【网络编程】之Udp网络通信步骤 TCP网络通信TCP网络通信的步骤对于服务器端对于客户端 TCP实现echo功能代码实现服务器端getsockname函数介绍 客户端效果展示 对比两组函数 TCP网络通信 TCP网络通信的步骤 对于服务器端 创建监听套接字。(调用socket函数ÿ…...
Java 基于 SpringBoot+Vue 的家政服务管理平台设计与实现
博主介绍:✌程序员徐师兄、8年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战*✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...
架构——Nginx功能、职责、原理、配置示例、应用场景
以下是关于 Nginx 的功能、职责、原理、配置示例、应用场景及其高性能原因的详细说明: 一、Nginx 的核心功能 1. 静态资源服务 功能:直接返回静态文件(如 HTML、CSS、JS、图片、视频等)。配置示例:server {listen 80…...
Spring Boot中使用Flyway进行数据库迁移
文章目录 概要Spring Boot 集成 FlywayFlyway 其他用法bug错误Flyway版本不兼容数据库存在表了Flyway 的校验和(Checksum)不匹配 概要 在 Spring Boot 项目开发中,数据库的变更不可避免。手动执行 SQL 脚本不仅容易出错,也难以维…...
CAS单点登录(第7版)9.属性
如有疑问,请看视频:CAS单点登录(第7版) 属性 属性定义 概述 属性定义 从身份验证或属性存储库源获取和解析 CAS 中属性的定义时,往往使用其名称进行定义和引用,而无需任何其他元数据或修饰。例如&#…...
137,【4】 buuctf web [SCTF2019]Flag Shop
进入靶场 都点击看看 发现点击work会增加¥ 但肯定不能一直点下去 抓包看看 这看起来是一个 JWT(JSON Web Token)字符串。JWT 通常由三部分组成,通过点(.)分隔,分别是头部(Header&…...
P9853 [入门赛 #17] 方程求解
P9853 [入门赛 #17] 方程求解 - 洛谷 题目描述 小A有n个关于x的方程,第i个方程形如aixibici。方程的解x均为正整数,例如下面几个方程都是符合要求的方程: 2x 4 10 -3x 13 10 4x - 8 16 其中,第一组方程的解为x1…...
【网络安全 | 漏洞挖掘】跨子域账户合并导致的账户劫持与删除
未经许可,不得转载。 文章目录 概述正文漏洞成因概述 在对目标系统进行安全测试时,发现其运行着两个独立的域名——一个用于司机用户,一个用于开发者/企业用户。表面上看,这两个域名各自独立管理账户,但测试表明它们在处理电子邮件变更时存在严重的逻辑漏洞。该漏洞允许攻…...
spring集成activiti流程引擎(源码)
前言 activiti工作流引擎项目,企业erp、oa、hr、crm等企事业办公系统轻松落地,请假审批demo从流程绘制到审批结束实例。 源码获取:本文末个人名片直接获取。 一、项目形式 springbootvueactiviti集成了activiti在线编辑器,流行…...
ROS基本功能
1.Topic话题与Message消息(主要通讯方式) 基本规则 发布消息的步骤 常用工具 话题的订阅 使用launch启动多个节点...
C++基础系列【13】类的成员初始化
博主介绍:程序喵大人 35- 资深C/C/Rust/Android/iOS客户端开发10年大厂工作经验嵌入式/人工智能/自动驾驶/音视频/游戏开发入门级选手《C20高级编程》《C23高级编程》等多本书籍著译者更多原创精品文章,首发gzh,见文末👇…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
day36-多路IO复用
一、基本概念 (服务器多客户端模型) 定义:单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用:应用程序通常需要处理来自多条事件流中的事件,比如我现在用的电脑,需要同时处理键盘鼠标…...
windows系统MySQL安装文档
概览:本文讨论了MySQL的安装、使用过程中涉及的解压、配置、初始化、注册服务、启动、修改密码、登录、退出以及卸载等相关内容,为学习者提供全面的操作指导。关键要点包括: 解压 :下载完成后解压压缩包,得到MySQL 8.…...
