Linux系统——Session ID(负载均衡如何保持会话)

目录

一、实验环境搭建

二、部署Nginx代理服务器配置

三、部署后端真是服务器Tomcat配置

四、配置Tomcat的Session ID会话保持

五、测试


此次实验是Tomcat后端服务器如何做Session ID会话保持

一、实验环境搭建

[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
setenforce: SELinux is disabled
[root@localhost ~]#yum install epel-release.noarch -y
#安装epel额外源
[root@localhost ~]#yum install nginx -y
#yum安装Nginx   作为代理服务器
[root@localhost ~]#systemctl start nginx
[root@localhost ~]#systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since 六 2024-03-16 10:21:23 CST; 5s ago
  Process: 2055 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 2051 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 2049 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 2058 (nginx)
   CGroup: /system.slice/nginx.service
           ├─2058 nginx: master process /usr/sbin/nginx
           ├─2059 nginx: worker process
           └─2060 nginx: worker process

3月 16 10:21:23 localhost.localdomain systemd[1]: Starting The nginx HTTP ...
3月 16 10:21:23 localhost.localdomain nginx[2051]: nginx: the configuratio...
3月 16 10:21:23 localhost.localdomain nginx[2051]: nginx: configuration fi...
3月 16 10:21:23 localhost.localdomain systemd[1]: Started The nginx HTTP a...
Hint: Some lines were ellipsized, use -l to show in full.
[root@node2 ~]#systemctl stop firewalld
[root@node2 ~]#setenforce 0
[root@node2 ~]#rz -E
rz waiting to receive.
[root@node2 ~]#rz -E
rz waiting to receive.
[root@node2 ~]#ls
anaconda-ks.cfg              Downloads                   Pictures
apache-tomcat-9.0.16.tar.gz  initial-setup-ks.cfg        Public
Desktop                      jdk-8u291-linux-x64.tar.gz  Templates
Documents                    Music                       Videos
[root@node2 ~]#tar xf jdk-8u291-linux-x64.tar.gz  -C /usr/local/
[root@node2 ~]#cd /usr/local/
[root@node2 local]#ls
bin  etc  games  include  jdk1.8.0_291  lib  lib64  libexec  sbin  share  src
[root@node2 local]#ln -s jdk1.8.0_291/  jdk
[root@node2 local]#vim /etc/profile.d/jdk.sh
[root@node2 local]#cat /etc/profile.d/jdk.sh 
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME/jre
[root@node2 local]#. /etc/profile.d/jdk.sh 
[root@node2 local]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)
[root@node3 ~]#systemctl stop firewalld
[root@node3 ~]#setenforce 0
[root@node3 ~]#rz -E
rz waiting to receive.
[root@node3 ~]#rz -E
rz waiting to receive.
[root@node3 ~]#ls
anaconda-ks.cfg              jdk-8u291-linux-x64.tar.gz  视频  下载
apache-tomcat-9.0.16.tar.gz  公共                        图片  音乐
initial-setup-ks.cfg         模板                        文档  桌面
[root@node3 ~]#tar xf jdk-8u291-linux-x64.tar.gz  -C /usr/local/
[root@node3 ~]#cd /usr/local/
[root@node3 local]#ls
bin  etc  games  include  jdk1.8.0_291  lib  lib64  libexec  sbin  share  src
[root@node3 local]#ln -s jdk1.8.0_291/  jdk
[root@node3 local]#vim /etc/profile.d/jdk.sh
[root@node3 local]#cat /etc/profile.d/jdk.sh 
export JAVA_HOME=/usr/local/jdk
export CLASSPATH=$JAVA_HOME/lib/:$JRE_HOME/lib/
export PATH=$JAVA_HOME/bin:$PATH
export JRE_HOME=$JAVA_HOME/jre
[root@node3 local]#. /etc/profile.d/jdk.sh 
[root@node3 local]#java -version
java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

二、部署Nginx代理服务器配置

[root@localhost ~]#vim /etc/nginx/nginx.conf
[root@localhost ~]#sed -n '23,26p' /etc/nginx/nginx.conf
    upstream tomcat {
    server 192.168.241.22:8080;
    server 192.168.241.23:8080;
    }
[root@localhost ~]#sed -n '50,52p' /etc/nginx/nginx.conf
        location ~* \.jsp$ {
        proxy_pass http://tomcat;
        }
[root@localhost ~]#nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost ~]#nginx -s reload

三、部署后端真是服务器Tomcat配置

[root@node2 local]#cd
[root@node2 ~]#ls
anaconda-ks.cfg              Downloads                   Pictures
apache-tomcat-9.0.16.tar.gz  initial-setup-ks.cfg        Public
Desktop                      jdk-8u291-linux-x64.tar.gz  Templates
Documents                    Music                       Videos
[root@node2 ~]#tar xf apache-tomcat-9.0.16.tar.gz -C /usr/local/
[root@node2 ~]#cd /usr/local/
[root@node2 local]#ls
apache-tomcat-9.0.16  etc    include  jdk1.8.0_291  lib64    sbin   src
bin                   games  jdk      lib           libexec  share
[root@node2 local]#ln -s apache-tomcat-9.0.16/ tomcat
[root@node2 local]#ls
apache-tomcat-9.0.16  etc    include  jdk1.8.0_291  lib64    sbin   src
bin                   games  jdk      lib           libexec  share  tomcat
[root@node2 local]#cd tomcat/
[root@node2 tomcat]#useradd -s /sbin/nologin tomcat
[root@node2 tomcat]#chown tomcat:tomcat tomcat/  -R
chown: cannot access ‘tomcat/’: No such file or directory
[root@node2 tomcat]#chown tomcat:tomcat -R
chown: missing operand after ‘tomcat:tomcat’
Try 'chown --help' for more information.
[root@node2 tomcat]#cd ..
[root@node2 local]#chown tomcat:tomcat tomcat/  -R
[root@node2 local]#cat > /usr/lib/systemd/system/tomcat.service <<EOF
> [Unit]
> Description=Tomcat
> After=syslog.target network.target
> 
> [Service]
> Type=forking
> ExecStart=/usr/local/tomcat/bin/startup.sh
> ExecStop=/usr/local/tomcat/bin/shutdown.sh
> RestartSec=3
> PrivateTmp=true
> User=tomcat
> Group=tomcat
> 
> [Install]
> WantedBy=multi-user.target
> 
> EOF
[root@node2 local]#cd tomcat/webapps/ROOT/
[root@node2 ROOT]#ls
asf-logo-wide.svg  bg-upper.png       tomcat.css        tomcat.svg
bg-button.png      favicon.ico        tomcat.gif        WEB-INF
bg-middle.png      index.jsp          tomcat.png
bg-nav.png         RELEASE-NOTES.txt  tomcat-power.gif
[root@node2 ROOT]#mv index.jsp index.jsp.bak
[root@node2 ROOT]#rz -E
rz waiting to receive.
[root@node2 ROOT]#ls
asf-logo-wide.svg  bg-upper.png   RELEASE-NOTES.txt  tomcat-power.gif
bg-button.png      favicon.ico    tomcat.css         tomcat.svg
bg-middle.png      index.jsp      tomcat.gif         WEB-INF
bg-nav.png         index.jsp.bak  tomcat.png
[root@node2 ROOT]#cat index.jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>tomcat test</title>
</head>
<body>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
[root@node2 ROOT]#systemctl start tomcat
[root@node3 local]#cd
[root@node3 ~]#ls
anaconda-ks.cfg              jdk-8u291-linux-x64.tar.gz  视频  下载
apache-tomcat-9.0.16.tar.gz  公共                        图片  音乐
initial-setup-ks.cfg         模板                        文档  桌面
[root@node3 ~]#tar xf apache-tomcat-9.0.16.tar.gz -C /usr/local/
[root@node3 ~]#cd /usr/local/
[root@node3 local]#ls
apache-tomcat-9.0.16  etc    include  jdk1.8.0_291  lib64    sbin   src
bin                   games  jdk      lib           libexec  share
[root@node3 local]#ln -s apache-tomcat-9.0.16/ tomcat
[root@node3 local]#ls
apache-tomcat-9.0.16  etc    include  jdk1.8.0_291  lib64    sbin   src
bin                   games  jdk      lib           libexec  share  tomcat
[root@node3 local]#cd tomcat/
[root@node3 tomcat]#useradd -s /sbin/nologin tomcat
[root@node3 tomcat]#chown tomcat:tomcat tomcat/  -R
chown: 无法访问"tomcat/": 没有那个文件或目录
[root@node3 tomcat]#chown tomcat:tomcat -R
chown: "tomcat:tomcat" 后缺少操作数
Try 'chown --help' for more information.
[root@node3 tomcat]#cd ..
[root@node3 local]#chown tomcat:tomcat tomcat/  -R
[root@node3 local]#cat > /usr/lib/systemd/system/tomcat.service <<EOF
> [Unit]
> Description=Tomcat
> After=syslog.target network.target
> 
> [Service]
> Type=forking
> ExecStart=/usr/local/tomcat/bin/startup.sh
> ExecStop=/usr/local/tomcat/bin/shutdown.sh
> RestartSec=3
> PrivateTmp=true
> User=tomcat
> Group=tomcat
> 
> [Install]
> WantedBy=multi-user.target
> 
> EOF
[root@node3 local]#cd tomcat/webapps/ROOT/
[root@node3 ROOT]#ls
asf-logo-wide.svg  bg-upper.png       tomcat.css        tomcat.svg
bg-button.png      favicon.ico        tomcat.gif        WEB-INF
bg-middle.png      index.jsp          tomcat.png
bg-nav.png         RELEASE-NOTES.txt  tomcat-power.gif
[root@node3 ROOT]#mv index.jsp index.jsp.bak
[root@node3 ROOT]#rz -E
rz waiting to receive.
[root@node3 ROOT]#cat index.jsp
<%@ page import="java.util.*" %>
<!DOCTYPE html>
<html lang="en">
<head>
   <meta charset="UTF-8">
   <title>tomcat test</title>
</head>
<body>
<div>On <%=request.getServerName() %></div>
<div><%=request.getLocalAddr() + ":" + request.getLocalPort() %></div>
<div>SessionID = <span style="color:blue"><%=session.getId() %></span></div>
<%=new Date()%>
</body>
</html>
[root@node3 ROOT]#systemctl start tomcat

实际生产环境不允许Session ID不断变动的。

  • 客户第一次访问被调度到后端真实服务器Tomcat1上,由于是第一次访问,客户度的Cookie缓存会记录,不会有SessionID,Tomcat1服务器会生成新的Session ID传输给客户端,客户端会将这个新的Session ID记录下来;
  • 当第二次访问的时候,Nginx代理服务器又可能将服务请求调度到后端真实服务器Tomcat2上,Tomcat2服务器是没有客户端传输来的Session ID1的,Tomcat2服务器认为客户端要生成新的SessionID,于是Tomcat2服务器将新的Session ID2传输给客户端,客户端会更新Session ID,将刚刚的SessionID更改为SessionID2;
  • 当第三次访问的时候,客户端带着SessionID2去Nginx代理服务器,Nginx代理服务器可能将客户端又调度到Tomcat1服务器上,Tomcat1服务器并没有SessionID2,于是又将新生成的SessionID3传输给客户端,这样会有很不好的客户端体验,所以我们可以根据修改Tomcat配置文件来进行会话保持 

四、配置Tomcat的Session ID会话保持

Tomcat会话保持官方说明https://tomcat.apache.org/tomcat-9.0-doc/cluster-howto.html

[root@node2 ROOT]#vim /usr/local/tomcat/conf/server.xml 
[root@node2 ROOT]#sed -n '163,201p' /usr/local/tomcat/conf/server.xml 
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.241.22"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
[root@node3 ROOT]#vim /usr/local/tomcat/conf/server.xml 
[root@node3 ROOT]#sed -n '163,201p' /usr/local/tomcat/conf/server.xml 
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"
                 channelSendOptions="8">

          <Manager className="org.apache.catalina.ha.session.DeltaManager"
                   expireSessionsOnShutdown="false"
                   notifyListenersOnReplication="true"/>

          <Channel className="org.apache.catalina.tribes.group.GroupChannel">
            <Membership className="org.apache.catalina.tribes.membership.McastService"
                        address="228.0.0.4"
                        port="45564"
                        frequency="500"
                        dropTime="3000"/>
            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"
                      address="192.168.241.23"
                      port="4000"
                      autoBind="100"
                      selectorTimeout="5000"
                      maxThreads="6"/>

            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">
              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>
            </Sender>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>
            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatchInterceptor"/>
          </Channel>

          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"
                 filter=""/>
          <Valve className="org.apache.catalina.ha.session.JvmRouteBinderValve"/>

          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"
                    tempDir="/tmp/war-temp/"
                    deployDir="/tmp/war-deploy/"
                    watchDir="/tmp/war-listen/"
                    watchEnabled="false"/>

          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>
        </Cluster>
[root@node2 ROOT]#vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml 
[root@node2 ROOT]#sed -n 29p /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml 
  <distributable/>
[root@node2 ROOT]#systemctl restart tomcat
[root@node2 ROOT]#systemctl status tomcat.service 
● tomcat.service - Tomcat
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2024-03-15 22:42:31 EDT; 5s ago
  Process: 2566 ExecStop=/usr/local/tomcat/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 2601 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2617 (catalina.sh)
   CGroup: /system.slice/tomcat.service
           ├─2617 /bin/sh /usr/local/tomcat/bin/catalina.sh start
           └─2618 /usr/bin/java -Djava.util.logging.config.file=/usr/local/...

Mar 15 22:42:31 node2.localdomain systemd[1]: Starting Tomcat...
Mar 15 22:42:31 node2.localdomain systemd[1]: Started Tomcat.
[root@node3 ROOT]#vim /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml 
[root@node3 ROOT]#sed -n 29p /usr/local/tomcat/webapps/ROOT/WEB-INF/web.xml 
  <distributable/>
[root@node3 ROOT]#systemctl restart tomcat
[root@node3 ROOT]#systemctl status tomcat.service 
● tomcat.service - Tomcat
   Loaded: loaded (/usr/lib/systemd/system/tomcat.service; disabled; vendor preset: disabled)
   Active: active (running) since 六 2024-03-16 18:42:30 CST; 5s ago
  Process: 2480 ExecStop=/usr/local/tomcat/bin/shutdown.sh (code=exited, status=0/SUCCESS)
  Process: 2518 ExecStart=/usr/local/tomcat/bin/startup.sh (code=exited, status=0/SUCCESS)
 Main PID: 2533 (catalina.sh)
   CGroup: /system.slice/tomcat.service
           ├─2533 /bin/sh /usr/local/tomcat/bin/catalina.sh start
           └─2534 /usr/bin/java -Djava.util.logging.config.file=/usr/local/...

3月 16 18:42:30 node3.node3 systemd[1]: Starting Tomcat...
3月 16 18:42:30 node3.node3 startup.sh[2518]: Using CATALINA_BASE:   /usr...t
3月 16 18:42:30 node3.node3 startup.sh[2518]: Using CATALINA_HOME:   /usr...t
3月 16 18:42:30 node3.node3 startup.sh[2518]: Using CATALINA_TMPDIR: /usr...p
3月 16 18:42:30 node3.node3 startup.sh[2518]: Using JRE_HOME:        /usr
3月 16 18:42:30 node3.node3 startup.sh[2518]: Using CLASSPATH:       /usr...r
3月 16 18:42:30 node3.node3 systemd[1]: Started Tomcat.
Hint: Some lines were ellipsized, use -l to show in full.

五、测试

此时后端真实服务器Tomcat调优完成,SessionID会话保持完成,客户端体验绝佳!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实战:django项目环境搭建(pycharm,virtualBox)

django项目环境搭建 一.创建虚拟环境二.创建PyCharm远程连接 一.创建虚拟环境 需要用到的软件&#xff1a;PyCharm&#xff0c;VirtualBox虚拟机。 1.打开虚拟机终端&#xff0c;创建新的虚拟环境 Book。 2.在虚拟环境中创建新的文件夹 library&#xff0c;cd命令进入该文件…

MIT线性代数-方程组的几何解释

文章目录 1. 二维空间1.1 行方向1.2 列方向 2. 三维空间2.1 行方向2.2 列方向 假设有一个方程组 A X B AXB AXB表示如下 2 x − y 0 (1) 2x-y0\tag{1} 2x−y0(1) − x 2 y 3 (2) -x2y3\tag{2} −x2y3(2) 矩阵表示如下&#xff1a; [ 2 − 1 − 1 2 ] [ x y ] [ 0 3 ] (3)…

数据分析-Pandas的直接用Matplotlib绘图

数据分析-Pandas的直接用Matplotlib绘图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表…

Linux第80步_使用“信号量”实现“互斥访问”共享资源

1、创建MySemaphoreLED目录 输入“cd /home/zgq/linux/Linux_Drivers/回车” 切换到“/home/zgq/linux/Linux_Drivers/”目录 输入“mkdir MySemaphoreLED回车”&#xff0c;创建“MySemaphoreLED”目录 输入“ls回车”查看“/home/zgq/linux/Linux_Drivers/”目录下的文件…

基于opencv的图像处理系统的设计与实现

概要 随着计算机技术的飞速发展&#xff0c;图像技术在各领域的研究和应用日渐深入和广泛。opencv是近年来推出的开源、免费的计算机视觉库,利用其所包含的函数可以很方便地实现数字图像处理。本文旨在对opencv进行一个快速全面简介,通过介绍图像处理的相关函数&#xff0c;使读…

Git学习记录

目录 Git Git介绍 版本控制 版本控制工具 集中式版本控制工具 分布式版本控制工具 Git工作机制 ​编辑 Git和代码托管中心 Git安装 Git常用命令 设置用户签名 初始化本地库 查看本地库状态 添加到暂存区 提交到本地库 修改文件 历史版本 查看历史版本 版本…

python的opencv最最基础初学

localhost中详解OpenCV的函数imread()和函数imshow(),并利用它们实现对图像的读取和显示_opencv imshow-CSDN博客 其实以下均为numpy 显示一张图片 import cv2 ####opencv读取的格式是BGR import matplotlib.pyplot as plt import numpy as np %matplotlib inline imgcv2.…

“一键解锁复古魅力:底片效果瞬间生成!“

时光荏苒&#xff0c;岁月如梭。你是否曾怀念那些旧时光里&#xff0c;老照片所散发出的独特韵味&#xff1f;那种历经岁月沉淀的底片效果&#xff0c;仿佛能带我们回到那些被遗忘的角落&#xff0c;重温那些温馨的瞬间。 首先第一步&#xff0c;我们要进入视频剪辑高手&#…

算法---滑动窗口练习-6(找到字符串中所有字母异位词)

找到字符串中所有字母异位词 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;找到字符串中所有字母异位词 2. 讲解算法原理 有效字符个数count更新条件&#xff1a;满足【hash1表&#xff08;遍历s的表&#xff09;中对应元素出现次数<hash2表&am…

C语言之归并排序

目录 一 简介 二 代码实现 三 时空复杂度 A.时间复杂度&#xff1a; B.空间复杂度&#xff1a; C.总结&#xff1a; 一 简介 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治策略的高效排序算法&#xff0c;其基本思想是将一个大问题分解为若干个规模较小且相…

RK3568平台开发系列讲解(基础篇)内核是如何发送事件到用户空间

🚀返回专栏总目录 文章目录 一、相关接口函数二、udevadm 命令三、实验沉淀、分享、成长,让自己和他人都能有所收获!😄 一、相关接口函数 kobject_uevent 是 Linux 内核中的一个函数, 用于生成和发送 uevent 事件。 它是 udev 和其他设备管理工具与内核通信的一种方式。…

Golang实现Redis分布式锁(Lua脚本+可重入+自动续期)

Golang实现Redis分布式锁&#xff08;Lua脚本可重入自动续期&#xff09; 1 概念 应用场景 Golang自带的Lock锁单机版OK&#xff08;存储在程序的内存中&#xff09;&#xff0c;分布式不行 分布式锁&#xff1a; 简单版&#xff1a;redis setnx》加锁设置过期时间需要保证原…

数据结构的概念大合集01(含数据结构的基本定义,算法及其描述)

概念大合集01 1、数据结构基础的定义2、数据结构2.1 数据元素之间关系的集合2.2数据结构的三要素2.2.1数据的逻辑结构2.2.2数据的存储&#xff08;物理&#xff09;结构2.2.3数据的运算 3、数据类型4、抽象数据类型类型&#xff08;ADT&#xff09;5、算法及其描述5.1算法的5个…

ChatGLM3-6B独立部署提供HTTP服务failed to open nvrtc-builtins64_121.dll

背景 我在本地windoes部署ChatGLM3-bB&#xff0c;且希望部署后能提供HTTP server的能力。 模型部署且启动是成功了&#xff0c;但是在访问生成接口/v1/chat/completions时报错failed to open nvrtc-builtins64_121.dll。 问题详细描述 找不到nvrtc-builtins64_121.dll Runtime…

mac电脑修改终端zsh显示的用户名

电脑名称一直没有修改&#xff0c;所以电脑名称都是Apple的MacBook Pro&#xff0c;如下图所示&#xff1a; mac电脑终端显示用户名太长一点也不美观&#xff0c;而且占用很长的行&#xff0c;浪费空间&#xff0c;可以通过修改来调整要显示什么内容&#xff1a; 方式一 要想换…

Windows→Linux,本地同步到服务器

适用背景&#xff1a; 用自己电脑修改代码&#xff0c;使用实验室/公司的服务器炼丹的朋友 优势&#xff1a; 本地 <--> 服务器&#xff0c;实时同步&#xff0c;省去文件传输的步骤 本地改 -> 自动同步到服务器 -> 服务器跑代码 -> 一键同步回本地&#xff…

汽车氛围灯静电浪涌的难点

汽车氛围灯&#xff0c;顾名思义&#xff0c;是烘托车内氛围的照明灯&#xff0c;是汽车内饰情感化设计的一种体现。 一般有暖色&#xff08;红色等&#xff09;和冷色系&#xff08;蓝色、紫色等&#xff09;两种&#xff0c;在夜晚开启后绚丽浪漫&#xff0c;可营造车内情调&…

JSP+Servlet开发汽车租赁管理系统

开发工具&#xff1a;EclipseJdkTomcatSQLServer数据库 链接: https://pan.baidu.com/s/1O5tGguNl6V1CvSpN-amNXA 提取码: exak 如果需要&#xff0c;联系下面的客服人员

SQL的执行与优化

文章目录 MySQL查询原理与优化一、select语句的执行顺序二、join 的执行与优化1、驱动表 & 被驱动表2、Simple Nested Loop Join3、Index Nested Loop Join4、Block Nested Loop Join5、Hash Join6、join 优化小结 三、on 与 where 对比四、group by 的执行与优化1、group …

在Docker容器中配置`code-server`以访问宿主机的Docker环境

在Docker容器中配置code-server以访问宿主机的Docker环境 部分内容使用gpt生成&#xff0c;但经过测试可用。 要在code-server容器内部安全地管理和访问宿主机的Docker环境&#xff08;主要是为了访问宿主机的texlive&#xff09;&#xff0c;遵循以下步骤能够确保流畅的集成和…
最新文章