当前位置: 首页 > news >正文

Servlet+tomcat

serverlet

定义:是一个接口,定义了java类被浏览器(tomcat识别)的规则
所以我们需要自定义一个类,实现severlet接口复写方法
通过配置类实现路径和servlet的对应关系
在这里插入图片描述

执行原理

在这里插入图片描述

  1. 当用户在浏览器输入路径,会解析请求的URL路径,获取访问的serverlet资源路径
  2. 查找web.xml文件,是否又对应的标签体内哦让那个
  3. 如果有,则在找到对应的的全类名
    4.tomcat会将字节码文件加载进内存,并创建器对象

生命周期

init方法:在Servelet被创建的时候执行,只会执行一次
serverce提供服务的方法,每次提供方法的时候就会执行
destory正常在服务器被关闭的时候会执行,只会执行一次

创建:默认情况下第一次被访问的时候被创建,或者通过配置文件修改为启动服务器的时候被创建-<load-on-startup> ,并且serverlet的类是单列的,是共享资源,所以不要定义成员变量

提供服务
销毁:在serverlet被销毁之前的时候执行,用来释放资源

SverlectConfig 获得serverlet的配置信息的
getServletConfig 获得serverlet的信息

可以使用 @WebServelet的注解配置去解读

ideal与tomcat的关系

会在日志中的server.xml里面修改对应的tomcat的文件
一个项目会存储在工作空间项目还有会存在tomcat的项目
tomcat真正的访问的是tomcat的项目这个项目对应的是工作空间的web目录下的所有还有一个class目录下里面存储的又工作空间编译生成的class类,并且在工作目录下中的WEB-INF下的资源无法部署在tomcat中

体系结构

静态资源:所有用户访问后,得到的结果都是一样的,称为静态资源——可以直接返回给浏览器(有静态资源解析的引擎)
动态资源:所有用户访问后,得到的结果都是不一样的,称为动态资源——需要先转化成静态资源,然后返回给浏览器(响应)

URI:资源名称 共和国
URL:资源路径+资源名称 中华人民共和国

Request请求转发

服务器内部的资源跳转步骤
1.RequestDispatcher getRequestDispatcher(String path)这个方法用获得转发器对象
2. 使用RequstDispatcher对象进行转发:forward(ServletRequest request, ServletResponse response)

// 1. 获取转发器
RequestDispatcher requestDispatcher = request.getRequestDispatcher("转发的目标地址URI");
// 2. 使用转发器转发
requestDispatcher.forward(request, response);

特点:
浏览器地址栏路径不发生改变
只能访问当前服务器内部的URI,不能访问外部的资源
转发是一次请求,所以request对象和response对象都是同一个

共享数据

域对象:有作用范围的对象,在一定范围共享数据
默认域为一次请求
方法:
setAttribute(String name, Object value) 设置域数据在转发之前设置
getAttribute(String name) 获取域数据
removeAttribute(String name) 移除域数据
所以跨域问题,其实就是发送了两次请求,并且希望携带cookie,所以需要浏览器通过实现跨域问题,否则浏览器默认不允许跨域,防止CSRF攻击

tomcat

tomcat 自己的Main方法在startup文件夹之下boot_start

架构

在这里插入图片描述

TOMCAT不会直接调用servlet,而是调用servlet容器,让容器调用接口。容器先定位再判断是否存在servlet类,如果没有就加载一个然后调用服务再返回

设计是通过两个核心连接器(connector)和容器(cpmyaomer)来实现,连接器对外交流,容器对内部处理
在这里插入图片描述

连接器

架构:Coyote 作为独立的模块,只负责具体的协议和IO相关的操作
在这里插入图片描述

IO 模型
NIO:同步非阻塞IO,一个线程可以处理多个请求
NIO2:异步非阻塞IO,一个线程可以处理多个请求
APR:本地库,可以提高性能
一个容器可以对应多个连接器

在这里插入图片描述

可以通过调用适配器的方法将request转化为servletRequest的方法
EndPoint:是一个处理TCP请求的组件,是将具体的Socket接受和发送处理器
Processor:是对TCP/IP 传输过来的字节流进行解析即实现HTPP/AJP的解读成为一个Request对象

coyote:是连接器
Catalina:是容器的实现-实现具体的逻辑处理
在这里插入图片描述

Catalina

在这里插入图片描述

执行的原理是:
由Catalina开始解析配置文件,从而管理server,而server表示的是整个服务器。服务器下面有多个服务,每个服务可以连接多个连接器和一个容器

Container

存在四层结构是父子关系
Engine:引擎,管理多个虚拟主机/虚拟站点,一个容器内只能有一个引擎
Host:虚拟主机/站点——多个网站
Context:Context是特定Web应用的表示,就是一个项目
Wrapper:Wrapper是特定Servlet的表示,一个Wrapper代表一个Servlet,最底层的容器

tomcat启动流程

在这里插入图片描述

首先调用BootStrap的main()方法,对各个类进行初始化,初始化之后对各个类进行启动
父祖教调用自身并且启动子组件,最后启动PritocolHandler组件,进行监听和处理请求的

Lifecycle:是生命周期组件,可以监听组件的启动和关闭,并且可以调用组件的启动和关闭方法

请求处理流程

在这里插入图片描述

发送的请求首先经过连接器,连接器解析请求,然后交给引擎,引擎会解析本地的Host请求/DNS服务器去找到对应的IP地址,然后就是自己写的服务中的配置找到对应的映射即Context

EndPoint会启动Socket去接受到一个请求然后交给Processor去解析,然后交给CoyoteAdapter进行处理此时作为request请求,
他会先去Mapper去找到请求的路径映射映射,然后转化为Engina所需要的request请求,交给Host再到Context再到Wrapper
他就会构造一个过滤器链然后再执行各个过滤器最后执行servlet
在这里插入图片描述

pipeline:管道的作用就是传输valve——松耦合,责任链
根据请求方式决定执行哪个方法

Jasper

因为服务器最终响应到浏览器的最终只能是静态页面,所以不包含任何java相关的语法。
当浏览器发送的是一个jsp的请求的时候,服务器会先根据自己的JspServlet去寻找对应的index.jsp文件然后将他转化为java文件,在经过编译成为class的可执行文件,就会直接返回response给浏览器其中含有html的页面

运行时编译:即class文件一开始没有是变运行变编译的
在这里插入图片描述

预编译:一次性将所有的JSP页面编译完成,在启动tomcat的时候就编译完成

JSP编译原理
生成的java类之后会编译成为class文件里面就会包含的有html页面生成的函数

服务器的配置文件

server.xml文件(核心配置文件)——包含了容器的所有配置

<Listener /> 表示监听器  
<Service > 表示服务——创建Service实现  
<Executor /> 表示共享线程池,多个connector可以共享一个线程池,默认情况下各个使用的是自己线程池  
<Connector /> 表示连接器,可以通过配置Connector的配置去——里面有一个executor属性去指定共享线程池名称   
<Engine defaultHost="www.tomcat.com" name="Catalina"> 表示引擎,默认访问主机是localhost,name是引擎的名称  <Host appBase="webapps" name="www.tomcat.com" appBase="webapps" unpackWARs="true" autoDeploy="true">
webapps 表示相对目录下的文件目录  
name 表示当前Host通用的网络名称,必须与DNS服务器上的注册信息一致。 
appBase 表示当前Host的根目录,默认是webapps    
unpackWARs="true" 表示是否解压当前下的WAR包,如果为true则将WAR包解压为文件夹,如果为false则不进行解压,但是仍然可以使用war包内的    
autoDeploy="true" 表示是否自动部署,如果为true则自动部署,如果为false则不自动部署  
修改name中的需要对应的dns或者本地host去替代  <Context docBase="webapps/ROOT" path="/" reloadable="true"/>
docBase 表示当前Context的根目录,默认是webapps/ROOT,就是表示访问的是哪一个文件夹  
path 表示当前Context的访问路径,默认是/,服务器的资源路径    
reloadable="true" 表示是否自动加载,如果为true则自动加载,如果为false则不自动加载  
</Host>    
</Engine> </Service>    

tomcat_users.xml文件——是对用户进行管理

web.xml文件

Web 应用配置

<context-param> 表示上下文参数,在这里设置的参数可以再servletContext中获取利用req.getServletContext().getAttribute("key")获取  
<param-name> 表示参数名称  </param-name>
<param-value> 表示参数值  </param-value>
</context-param>  

会话配置

浏览器和web服务器之间建立会话,会话是基于cookie的,cookie是基于session的

<session-config> 表示会话配置  
<session-timeout> 表示会话超时时间,单位为分钟,默认是30分钟  
</session-timeout>  
<cookie-config> 表示cookie配置  
<cookie-name> 表示cookie名称根据名称查sessionId  
<domain> 表示cookie的域名,默认是当前域名  
<http-only> 表示cookie是否只能通过http协议访问,默认是true,不能跨域  
<secure> 表示cookie是否只能通过https协议访问,默认是false     
<cookie-max-age> 表示cookie最大存活时间,单位为秒,默认是-1,表示浏览器关闭后cookie失效  
<tracking-mode> 表示cookie的跟踪模式,默认是COOKIE,表示cookie跟踪模式,可以设置为COOKIE或者URL    
</cookie-config>  
</session-config>  

可以通过application.getSession()获取session对象

servlet配置

主要包括servlet的配置和servlet-mapping的配置

<servlet> 
<servlet-name> 表示servlet名称  
<servlet-class> 表示servlet类  
<load-on-startup> 表示servlet的加载顺序,默认是0,表示在启动服务器的时候加载,如果为负数表示在服务器启动后加载,如果为正数表示在服务器启动前加载    
<enabled> 表示servlet是否启用,默认是true,表示启用,如果为false表示禁用    
</servlet>  
<servlet-mapping> 
<servlet-name> 表示servlet名称  
<url-pattern> 表示servlet的访问路径  
</servlet-mapping>  

监听器

<listener>

过滤器

拦截请求,用于认证、日志、加密、数据转化

<filter> 
<filter-name> 表示过滤器名称  
<filter-class> 表示过滤器类  
<async-supported> 表示过滤器是否支持异步,默认是false,表示不支持,如果为true表示支持    
</filter>  
<filter-mapping> 
<filter-name> 表示过滤器名称  
<url-pattern> 表示过滤器的访问路径  
</filter-mapping>  

欢迎页面和错误页面配置

<welcome-file-list> 
<welcome-file> 表示欢迎页面,默认的全局的欢迎页面    
</welcome-file>  
</welcome-file-list>//由于资源和网络占用会出现异常,不希望给用户查看    
<error-page> 
<error-code> 表示错误代码(404,500,403)  </error-code>
<location> 表示错误页面  </location>
</error-page>  

Tomcat管理配置

在tomcat-users.xml文件中配置用户名和密码

<role roleName="manager-gui"> 
<role roleName="admin-gui"> 
<user username="admin" password="admin" roles="manager-gui,admin-gui"/>

提供一个虚拟主机的管理页面

相对APP应用程序进行管理

<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="admin" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

JVM 的配置

JVM内存分配
在这里插入图片描述

集群

单个tomcat的承载能力是有限的,单排tomcat不能满足这需求,所以有一个nginx的负载均衡器,将请求分发到多个tomcat上,从而提高系统的吞吐量和可靠性。
负载均衡的测率:
轮询:将请求均匀的分配到多个tomcat上
加权轮询:根据tomcat的性能不同,分配不同的权重,性能好的分配的权重高,性能差的分配的权重低
ip_hash:根据ip地址分配,同一个ip地址的请求会分配到同一个tomcat上

集群的问题:
session共享问题
1.通过ip_hash方式,同一个请求访问的同一个ip所以session是共享的
2.session复制:将session复制到多个tomcat上,从而实现session共享,通过tomcat的广播机制——通过添加集群的配置。

在engine下添加集群的配置    
<Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster" channelSendOptions="8">  <Manager className="org.apache.catalina.ha.session.DeltaManager"expireTime="10000"/>  
</Cluster>  

在web.xml中添加<distributable/>标签,表示当前的web应用是可分布的

3.单点登录——SSO
在这里插入图片描述

Tomcat的安全

配置安全
删除所有webapps下的项目
关闭删除用户所有权限
关闭/修改8005端口,修改关闭之类
设置错误页面
将密钥库文件复制到tomcat/conf目录下
修改server.xml文件

<Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"connectionTimeout="20000"scheme="https"secure="true"SSLEnabled="true"><SSLHostConfig certificateVerification="false"><Certificate certificateKeyFile="conf/localhost-rsa.jks"certificateFile="conf/localhost-rsa.jks"//密钥库文件certificateChainFile="conf/localhost-rsa.jks"//证书链文件type="RSA"  // 密钥库类型/></SSLHostConfig>
</Connector>

性能测试

yum install -y httpd-tools  
ab -v //查看版本  
上传war包  
并且移动到webapps下-里面剩余的其他文件全部删除  
ab -n 1000 -c 100 -p data.json http://192.168.1.100:8080/项目名/index.jsp    
-p表示post的是一个json格式文件  
-n表示总共请求次数  
-c表示并发数  

Jconslo可以查看远程的垃圾回收机制

连接器
maxConnections——当达到最大的连接数,服务器接受但不会处理更多的请求额外的请求会阻塞,知道连接数低于最大连接数
maxThreads——当达到最大的线程
acceptCount——最大的排队等待数量,就是maxConnections之后

WebSocket

是一个在浏览器和服务器之间建立一个不受限制的双向通信的协议
传统的的请求响应功能,可以使用轮询的方式,但是服务器的压力比较大。

websocket就不是Http这样请求响应的协议,而是一种全双通信,服务和客户端之间相互通信,基于http协议
在这里插入图片描述

相当于对http请求进行升级,相当于用ws作为开头地址

使用两种方式定义Endpoint:
第一种编程式子,继承javax.websocket.Endpoint类
第二种注解式子,使用@ServerEndpoint注解

@OnOpen-记录session,httpSession,在线会话,广播消息
@OnMessage-解析消息判定收件人,发送消息
@OnClose-销毁session,httpSession,在线会话,广播消息

相当于前端也有一个websocket的类然后也有特定的session只需要通过send指令就可以发送过去了
服务端始终只是使用一个类,通过使用session保存独有的websocket的所有信息,
httpSession表示在客户端与服务端传输的标记,onlineUser表示的就是用来确定此时请求的用户是谁

通过构造一个websocket的类,然后继承Endpoint类,然后重写方法

public class MyEndpointConfig extends ServerEndpointConfig.Configurator{@Overridepublic void modifyHandshake(ServerEndpointConfig config, HandshakeRequest request, HandshakeResponse response) {HttpSession httpSession = (HttpSession)request.getHttpSession(); config.getUserProperties().put(HttpSession.class.getName(),httpSession);}
}@ServerEndpoint("/websocket",configuration=MyEndpointConfig.class)  //请求路径  
public class ChatSocket {private static Session session;  //用来表示记录websocket的session信息private static HttpSession httpSession;  //用来表示当前登录后的用户的httpSession  private static Map<HttpSession,Chatsocket> onlineUsers = new HashMap<>();  //用来表示记录的session@OnOpen  //表示打开会话的时候会触发的方法  //这里面的config就是用来获取HttpSession的,所以每次有人登录就会触发一次public void onOpen(Session session , EndpointConfig config){this.session = session;HttpSession httpSession = (HttpSession)config.getUserProperties().get(HttpSession.class.getName());this.httpSession = httpSession;if(httpSession.getAttribute("user") != null){onlineUsers.put(httpSession,this);}String name = getName(onlineUsers);// session.getBasicRemote().sendText(name);//表示发送单条数据给当前的会话  broadcast(name);//表示发送广播数据给所有的会话  }private String broadcast(String name){for(HttpSession httpSession : onlineUsers.keySet()){onlineUsers.get(httpSession).session.getBasicRemote().sendText(name);}}@OnMessage  //表示收到消息的时候会触发的方法  public void onMessage(String message,Session session){//1.获取客户端的消息并且解析  Map<String,String> messageMap = JSON.parseObject(message,Map.class);  String fromName = messageMap.get("fromName");String toName = messageMap.get("toName");String content = messageMap.get("content");if(toName != null && !toName.equals("")){return ;}String message = MessageUtil.getMessage(fromName,content);  singleMessage(message,fromName,toName);  
}private String singleMessage(String message,String fromName,String toName){  for(HttpSession httpSession : onlineUsers.keySet()){if(httpSession.getAttribute("user").equals(toName)){boolean flag = true;}}if(flag){for(HttpSession httpSession : onlineUsers.keySet()){if(httpSession.getAttribute("user").equals(toName)||httpSession.getAttribute("user").equals(fromName)){onlineUsers.get(httpSession).session.getBasicRemote().sendText(message);}}}}@OnClose  //表示关闭会话的时候会触发的方法  public void onClose(Session session,CloseReason closeReason){onlineUsers.remove(httpSession);}@OnError  //表示发生错误的时候会触发的方法  public void onError(Session session,Throwable throwable){throwable.printStackTrace();}}

相关文章:

Servlet+tomcat

serverlet 定义&#xff1a;是一个接口&#xff0c;定义了java类被浏览器&#xff08;tomcat识别&#xff09;的规则 所以我们需要自定义一个类&#xff0c;实现severlet接口复写方法 通过配置类实现路径和servlet的对应关系 执行原理 当用户在浏览器输入路径&#xff0c;会…...

中间件和组件

文章目录 1. 前言2. 中间件介绍3. 组件介绍4. 区别对比5. 简单类比6. 总结 中间件和组件 1. 前言 中间件和组件是软件开发中两个重要的概念&#xff0c;但它们的定位和作用完全不同。中间件解决的事通信、跨系统、安全等问题&#xff0c;组件是解决具体业务模块&#xff0c;提高…...

piccolo-large-zh-v2 和 bge-m3哪个效果好?

环境&#xff1a; piccolo-large-zh-v2 bge-m3 问题描述&#xff1a; piccolo-large-zh-v2 和 bge-m3哪个效果好&#xff1f; 解决方案&#xff1a; 比较Piccolo-large-zh-v2&#xff08;商汤&#xff09;与BGE-M3&#xff08;智源&#xff09;的效果时&#xff0c;需结合…...

《告别试错式开发:TDD的精准质量锻造术》

深度解锁TDD&#xff1a;应用开发的创新密钥 在应用开发的复杂版图中&#xff0c;如何雕琢出高质量、高可靠性的应用&#xff0c;始终是开发者们不懈探索的核心命题。测试驱动开发&#xff08;TDD&#xff09;&#xff0c;作为一种颠覆性的开发理念与方法&#xff0c;正逐渐成…...

哈希函数详解(SHA-2系列、SHA-3系列、SM3国密)案例:构建简单的区块链——密码学基础

文章目录 一、密码哈希函数概述1.1 哈希函数的基本概念1.2 哈希函数在数据安全中的应用 二、SHA-2系列算法详解2.1 SHA-2的起源与发展2.2 SHA-256技术细节与实现2.3 SHA-384和SHA-512的特点2.4 SHA-2系列算法的安全性评估 三、SHA-3系列算法详解3.1 SHA-3的起源与设计理念3.2 K…...

CUDA输出“hello world”

在我们学习任何一门编程语言的时候, 无疑当我们真正用其输出“hello world”的时候, 我们已经成功入门, 接下来要做的就是从入门到放弃了&#x1f606; 接下来我们通过对比C和CUDA来学习CUDA的运行逻辑: C中的hello worldCUDA中的hello world文本编辑器编写源代码, 比如vscod…...

计算机视觉与深度学习 | 视觉里程计算法综述(传统+深度)

视觉里程计算法综述 1. 算法分类与原理1.1 传统几何方法1.2 深度学习方法2. 关键公式与模型2.1 本征矩阵分解2.2 深度学习模型架构3. 代码实现与开源项目3.1 传统方法实现3.2 深度学习方法实现4. 挑战与未来方向总结传统视觉里程计算法综述1. 算法分类与核心原理1.1 特征点法1.…...

c++ 函数参数传递

C 中的值传递和地址传递 在 C 中&#xff0c;函数参数传递主要有两种方式&#xff1a;值传递和地址传递&#xff08;指针传递和引用传递都属于地址传递的变体&#xff09;。 1. 值传递 特点 函数接收的是实参的副本对形参的修改不会影响原始变量适用于小型数据&#xff08;…...

计算机视觉与深度学习 | 什么是图像金字塔?

图像金字塔详解 图像金字塔 图像金字塔详解1. **定义**2. **原理与公式****2.1 高斯金字塔****2.2 拉普拉斯金字塔**3. **代码示例****3.1 使用OpenCV实现****3.2 手动实现高斯模糊与降采样**4. **应用场景**5. **关键点总结**1. 定义 图像金字塔是一种多尺度图像表示方法,将…...

AI超级智能体教程(五)---自定义advisor扩展+结构化json输出

文章目录 1.自定义拦截器1.2自定义Advisor1.2打断点调试过程1.3Re-reading Advisor自定义实现 2.恋爱报告开发--json结构化输出2.1原理介绍2.1代码实现2.3编写测试用例2.4结构化输出效果 1.自定义拦截器 1.2自定义Advisor spring里面的这个默认的是SimpleloggerAdvisor&#…...

ActiveMQ 集群搭建与高可用方案设计(一)

一、引言 在当今分布式系统盛行的时代&#xff0c;消息中间件扮演着至关重要的角色&#xff0c;而 ActiveMQ 作为一款开源的、功能强大的消息中间件&#xff0c;在众多项目中得到了广泛应用。它支持多种消息传输协议&#xff0c;如 JMS、AMQP、MQTT 等 &#xff0c;能够方便地实…...

MySQL数据操作全攻略:DML增删改与DQL高级查询实战指南

知识点4【MySQL的DDL】 DDL&#xff1a;主要管理数据库、表、列等操作。 库→表&#xff08;二维&#xff09;→列&#xff08;一维&#xff09; 数据表的第一行是 列名称 数据库是由一张或多张表组成 我们先学习在数据库中创建数据表 0、常见的数据类型&#xff1a; 1、…...

RabbitMQ 中的六大工作模式介绍与使用

文章目录 简单队列&#xff08;Simple Queue&#xff09;模式配置类定义消费者定义发送消息测试消费 工作队列&#xff08;Work Queues&#xff09;模式配置类定义消费者定义发送消息测试消费负载均衡调优 发布/订阅&#xff08;Publish/Subscribe&#xff09;模式配置类定义消…...

一种基于重建前检测的实孔径雷达实时角超分辨方法——论文阅读

一种基于重建前检测的实孔径雷达实时角超分辨方法 1. 专利的研究目标与实际问题意义2. 专利提出的新方法、模型与公式2.1 重建前检测(DBR)与数据裁剪2.1.1 回波模型与检测准则2.1.2 数据裁剪效果2.2 数据自适应迭代更新2.2.1 代价函数与迭代公式2.2.2 矩阵递归更新2.3 正则化…...

代购平台如何“说本地话,穿本地衣”

当海外消费者点开一个代购商城&#xff0c;看到满屏机械翻译的中式文案&#xff0c;他们大概率会默默关闭页面。还有数据显示&#xff0c;不符合本地审美的页面设计会导致70%的潜在客户流失&#xff0c;而专业的本地化改造能让订单转化率提升3倍以上。 01 AI翻译&#xff1a;让…...

C++调试(叁):编译qBreakpad并使用其生成Dump文件

目录 1.前言 2.生成Dump文件的第三方库 3.第三方库下载链接 4.编译qBreakpad 5.VS中使用qBreakpad 6.qBreakpad测试程序 前言 在第二篇文章中&#xff0c;我主要讲解了如何使用SetUnhandledExceptionFilter函数设置程序的异常回调&#xff0c;在设置的回调函数中调用MiniDumpWr…...

0基础 | STM32 | TB6612电机驱动使用

TB6612介绍及使用 单片机通过驱动板连接至电机 原因&#xff1a;单品机I/O口输出电流I小 驱动板&#xff1a;从外部引入高电压&#xff0c;控制电机驱动 电源部分 VM&#xff1a;电机驱动电源输入&#xff0c;输入电压范围建议为3.7&#xff5e;12V GND&#xff1a;逻辑电…...

Cycleresearcher:通过自动化评审改进自动化研究

1、引言 迄今为止&#xff0c;整个科学发现过程自动化的挑战在很大程度上仍未解决&#xff0c;特别是在生成和改进符合同行评审工作高标准的研究成果方面。此外&#xff0c;很少有工作涉及迭代反馈的整合&#xff0c;这对保持学术的健全性和新奇至关重要。当前的模型往往难以适…...

深入理解Redis SDS:高性能字符串的终极设计指南

&#x1f4cd; 文章提示 10分钟掌握Redis核心字符串设计 | 从底层结构到源码实现&#xff0c;揭秘SDS如何解决C字符串七大缺陷&#xff0c;通过20手绘图示与可运行的C代码案例&#xff0c;助你彻底理解二进制安全、自动扩容等核心机制&#xff0c;文末附实战优化技巧&#xff…...

【tcp连接windows redis】

tcp连接windows redis 修改redis.conf 修改redis.conf bind * -::*表示禁用保护模式&#xff0c;允许外部网络连接 protected-mode no...

【AI平台】n8n入门6:调用MCP服务(非社区节点)

前言 前边用n8n搭建一个MCP服务&#xff0c;现在&#xff0c;用n8n调用其他服务商提供的MCP服务。本文以高德地图服务为例&#xff0c;记录一下操作过程。 实现案例功能 MCP是啥 MCP&#xff08;Model Context Protocol&#xff0c;模型上下文协议&#xff09;是由Anthropi…...

C++负载均衡远程调用学习之 Dns-Route关系构建

目录 1.LARS-DNS-MYSQL环境搭建 2.LARSDNS-系统整体模块的简单说明 3.Lars-Dns-功能说明 4.Lars-Dns-数据表的创建 5.Lars-Dns-整体功能说明 6.Lars-DnsV0.1-Route类的单例实现 7.Lars-DnsV0.1-Route类的链接数据库方法实现 8.Lars-DnsV0.1-定义存放RouteData关系的map数…...

Linux53 百度网盘运行(下载devtoolset11后仍提示stdc++3.0.29缺失 计划用docker容器隔离运行,计划后续再看)

算了 放弃 都用到docker了 计划先看看系统服务后续再研究吧 百度网盘运行(下载devtoolset11后仍提示stdc3.0.29缺失 计划用docker容器隔离运行 但是由于系统服务未扎实&#xff0c;计划后续再看 重新下了el7的版本 刚才已启动成功 单输入xlock不启动 切换用户也不启动 …...

ASP.NET MVC​ 入门与提高指南八

45. 神经形态计算与 MVC 应用性能革新 45.1 神经形态计算概念 神经形态计算是借鉴生物神经系统的结构和工作原理来设计计算系统。它模仿人脑神经元和突触的工作方式&#xff0c;具备低功耗、高并行性和自适应学习等特性&#xff0c;能在处理复杂感知和认知任务时展现出卓越的…...

Python刷题:流程控制(下)

今天刷的是PythonTip的Python 入门挑战中的题&#xff0c;整体难度不高&#xff0c;适合小白练手以及巩固知识点。下面会进行详细讲解。 每日一句 在无人问津的角落里&#xff0c; 默默努力的人独自发光&#xff0c; 孤独是他们奋斗路上的常客&#xff0c; 却也是成就他们的…...

【Bootstrap V4系列】学习入门教程之 组件-徽章(Badge)和面包屑导航(Breadcrumb)

Bootstrap V4系列 学习入门教程之 组件-徽章&#xff08;Badge&#xff09;和面包屑导航&#xff08;Breadcrumb&#xff09; 徽章&#xff08;Badge&#xff09;一、示例二、根据情境改变外观三、胶囊式徽章&#xff08;Pill badges&#xff09;四、链接 面包屑导航&#xff0…...

结合强化学习RL和SFT各自训练优势,让模型边学边练,从而平衡Zero-RL训练中的模仿和探索!!

摘要&#xff1a;最近在大型推理模型&#xff08;LRMs&#xff09;方面的进展表明&#xff0c;通过简单的基于规则的奖励进行强化学习&#xff08;RL&#xff09;&#xff0c;可以涌现出复杂的行为&#xff0c;例如多步推理和自我反思。然而&#xff0c;现有的零强化学习&#…...

ai之paddleOCR 识别PDF python312和paddle版本冲突 GLIBCXX_3.4.30

这里写自定义目录标题 问题一**解决方案****方法 1&#xff1a;使用符号链接将系统库链接到 Conda 环境** **补充说明****验证修复结果** 问题二&#xff1a;**问题根源****解决方案****1. 确认 TensorRT 安装状态****2. 安装 TensorRT 并配置环境变量****3. 验证 TensorRT 与 …...

C++ 单例模式详解

单例模式是一种创建型设计模式&#xff0c;它确保一个类只有一个实例&#xff0c;并提供一个全局访问点来访问该实例。 概念解析 单例模式的核心思想是&#xff1a; 限制类的实例化次数&#xff0c;确保在整个应用程序中只有一个实例存在 提供对该实例的全局访问点 控制共享…...

生成器模式(Builder Pattern)

好问题&#xff01;生成器模式&#xff08;Builder Pattern&#xff09;在现实生活和程序开发中非常常见&#xff0c;它适合创建**“一步一步搭建起来的复杂对象”**。 &#x1f9e0; 一句话定义 生成器模式&#xff08;Builder Pattern&#xff09;是一种将复杂对象的构建过程…...

计算机网络八股文--day4 --传输层TCP与UDP

这是面试中最常考到的一层&#xff1a;端到端&#xff08;也就是进程之间&#xff09;的透明数据传输服务&#xff0c;差错控制和流量控制 该层呈上启下&#xff0c;像上面的资源子网提高服务&#xff0c;并使用下面通信子网的服务 端口&#xff0c;用于唯一标识主机上进程的&…...

大型语言模型个性化助手实现

大型语言模型个性化助手实现 目录 大型语言模型个性化助手实现PERSONAMEM,以及用户资料和对话模拟管道7种原位用户查询类型关于大语言模型个性化能力评估的研究大型语言模型(LLMs)已经成为用户在各种任务中的个性化助手,从提供写作支持到提供量身定制的建议或咨询。随着时间…...

步进电机中断函数解释

STM32 motor111.c 中 HAL_TIM_PeriodElapsedCallback 函数逐行解释 下面我们对 STM32 项目中 motor111.c 文件里的 HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) 函数进行逐行解析&#xff0c;帮助初学者理解每一行代码的作用。此函数是在定时器产生更新中断时被调…...

多把锁以及线程死锁问题

在 Java 中&#xff0c;每一个对象都可以作为一把锁&#xff0c;synchronized 通过获取对象头中的锁标志位来实现同步。当一个线程获取到对象的锁后&#xff0c;其他线程就无法再获取该锁&#xff0c;只能等待获取到锁的线程释放锁之后才能继续执行被 synchronized 修饰的代码块…...

Vue 3 Element Plus 浏览器使用例子

Element Plus 是一个基于 Vue 3 的流行开源 UI 库&#xff0c;提供了一系列的组件&#xff0c;帮助开发者快速构建现代化的用户界面。它的设计简洁、现代&#xff0c;包含了许多可定制的组件&#xff0c;如按钮、表格、表单、对话框等&#xff0c;适合用于开发各种 Web 应用。 …...

NoxLucky:个性化动态桌面,打造独一无二的手机体验

在数字时代&#xff0c;手机桌面的个性化设置已经成为许多人表达自我和展示个性的重要方式。今天&#xff0c;我们要介绍的 NoxLucky&#xff0c;就是这样一款功能强大的动态桌面手机应用。它不仅提供了独家的动态壁纸素材库&#xff0c;还支持将抖音、INS等平台的短视频直接设…...

如何在WORD WPS中输入英语音标 批量给英语标注音标

在我国&#xff0c;英语的学习&#xff0c;已经是贯穿小学到大学的课程&#xff0c;英语学习&#xff0c;关键是听说读写&#xff0c;而听说读&#xff0c;都离不开一个字--音&#xff0c;这就涉及到了英语的音标了。音标&#xff08;Phonetics&#xff09;是表示单词发音的一种…...

RUST变量学习笔记

1&#xff0c;作用域概念 捕获环境 2&#xff0c;所有权概念 Rust则是通过所有权和借用来保证内存安全。很多人不理解为啥说Rust是内存安全的&#xff0c;其实就是在默认情况下&#xff0c;你是写不出内存不安全的代码的。 Rust的所有权并不难理解&#xff0c;它有且只有如下…...

n8n工作流自动化平台的实操:本地化高级部署

一、本地高级部署 1.下载 docker pull docker.n8n.io/n8nio/n8n 2.运行 docker volume create n8n_data docker run -dit --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n -e N8N_SECURE_COOKIEfalse -e N8N_RUNNERS_ENABLEDtrue -e N8N_ENFORCE_SETTINGS_FIL…...

【Ansible自动化运维实战:从Playbook到负载均衡指南】

本文是「VagrantVirtualBox虚拟化环境搭建」的续篇&#xff0c;深入探索Ansible在自动化运维中的核心应用&#xff1a; ✅ Ansible核心技能&#xff1a;Playbook编写、角色&#xff08;Roles&#xff09;模块化、标签&#xff08;Tags&#xff09;精准控制 ✅ 实战场景覆盖&a…...

数据赋能(210)——质量管理——可靠性原则

概述 数据可靠性原则确保数据的准确性、完整性、一致性和可信性&#xff0c;是决策和业务活动对数据质量的基本要求。在信息化和数字化快速发展的今天&#xff0c;数据已成为企业的重要资产&#xff0c;数据可靠性直接影响到企业的决策质量和业务活动效果。数据可靠性是数据质…...

二、机器学习中Python变量基础

二、Python变量基础 像C语言和Matlab一样&#xff0c;变量名由字母、数字、下划线组成&#xff08;但不能以数字开头&#xff0c;字母区分大小写&#xff09;变量名不能与内置的函数同名。 根据变量是否可以充当容器&#xff0c;将变量类型分为基本类型和高级类型。 基本变量…...

有机玻璃材质数据采集活性炭吸附气体中二氧化硫实验装置

JGQ112Ⅱ有机玻璃材质数据采集活性炭吸附气体中二氧化硫实验装置 一.实验目的 1.熟悉活性炭吸附剂的特性和在SO2气体净化方面的应用。 2.掌握活性炭吸附法的流程和实验过程中各参数的控制方法。 3.了解主要参数变化对吸附效率的影响。 4.掌握吸附等温线概念和测定方法。 二.技术…...

Javase 基础入门 —— 07 接口

本系列为笔者学习Javase的课堂笔记&#xff0c;视频资源为B站黑马程序员出品的《黑马程序员JavaAI智能辅助编程全套视频教程&#xff0c;java零基础入门到大牛一套通关》&#xff0c;章节分布参考视频教程&#xff0c;为同样学习Javase系列课程的同学们提供参考。 01 概述 接…...

LangChain:重构大语言模型应用开发的范式革命

2022年10月22日&#xff0c;Harrison Chase在GitHub上提交了名为LangChain的开源项目的第一个代码版本。这个看似普通的代码提交&#xff0c;却悄然开启了一场重塑大语言模型&#xff08;LLM&#xff09;应用开发范式的技术革命。彼时&#xff0c;距离ChatGPT引爆全球人工智能浪…...

【现代深度学习技术】现代循环神经网络04:双向循环神经网络

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈PyTorch深度学习 ⌋ ⌋ ⌋ 深度学习 (DL, Deep Learning) 特指基于深层神经网络模型和方法的机器学习。它是在统计机器学习、人工神经网络等算法模型基础上&#xff0c;结合当代大数据和大算力的发展而发展出来的。深度学习最重…...

重塑数学边界:人工智能如何引领数学研究的新纪元

目录 一、人工智能如何重新定义数学研究的边界 &#xff08;一&#xff09;数学与AI的关系&#xff1a;从基础理论到创新思维的回馈 &#xff08;二&#xff09;AI的创造力&#xff1a;突破传统推理的局限 &#xff08;三&#xff09;AI对数学研究的潜在贡献&#xff1a;创…...

链表的回文结构题解

首先阅读题目&#xff1a; 1.要保证是回文结构 2.他的时间复杂度为O(n)、空间复杂度为O(1) 给出思路: 1.首先利用一个函数找到中间节点 2.利用一个函数逆置中间节点往后的所有节点 3.现在有两个链表&#xff0c;第一个链表取头节点一直到中间节点、第二个链表取头结点到尾…...

xLua笔记

Generate Code干了什么 肉眼可见的&#xff0c;在Asset文件夹生成了XLua/Gen文件夹&#xff0c;里面有一些脚本。然后对加了[CSharpCallLua]的变量寻找引用&#xff0c;发现它被XLua/Gen/DelegatesGensBridge引用了。也可以在这里查哪些类型加了[CSharpCallLua]。 public over…...

【Hive入门】Hive与Spark SQL深度集成:通过Spark ThriftServer高效查询Hive表

目录 引言 1 Spark ThriftServer架构解析 1.1 核心组件与工作原理 1.2 与传统HiveServer2的对比 2 Spark ThriftServer部署指南 2.1 环境准备与启动流程 2.1.1 前置条件检查 2.1.2 服务启动流程 2.2 高可用部署方案 2.2.1 基于ZooKeeper的HA架构 3 性能优化实战 3.…...