学习tomcat(三)
一、tomcat安装
1、部署java环境
# yum install java-1.8.0
# java -version
2、部署tomcat
# mkdir /data/soft -p
# cd /data/soft/
# wget https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.53/bin/apache-tomcat-8.5.53.tar.gz
# tar zxf apache-tomcat-8.5.53.tar.gz -C /opt/
# cd /opt
# ln -s apache-tomcat-8.5.53 tomcat
# echo 'export TOMCAT_HOME=/opt/tomcat'>>/etc/profile
# /opt/tomcat/bin/startup.sh
# netstat -lntup | grep 8080
# ps -ef | grep tomcat
# tail -1 /opt/tomcat/logs/catalina.out
# curl -I 127.0.0.1:8080
3、tomcat目录介绍
1、总目录
# tree -L 1 /opt/tomcat/
├── bin #脚本目录(启动,关闭Tomcat,.bat,.sh)
├── conf #配置文件目录(配置Tomcat的XML及DTD文件)
├── lib #存放web应用访问的JAR包
├── logs #日志目录(Catalina,其他日志文件)
├── temp #临时文件
├── webapps #Web应用程序根目录
└── work #产生JSP编译出的Servlet的.java和.class文件
2、webapps目录
# ll webapps/
docs #tomcat帮助文档
examples #web应用
host-manager #管理
manager #管理
ROOT #默认网站根目录
3、bin目录
# ll bin/
startup.sh #启动脚本
shutdown.sh #关闭脚本
catalina.shtomcat #核心管理脚本(jvm优化参数及配置,tomcat启动参数)
4、启动和关闭tomcat
方法1
# /opt/tomcat/bin/startup.sh
# /opt/tomcat/bin/shutdown.sh
方法2
# /opt/tomcat/bin/catalina.sh start
# /opt/tomcat/bin/catalina.sh stop
方法3
# vim /usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target [Service]
Type=forking
ExecStart=/opt/tomcat/bin/catalina.sh start
ExecReload=/opt/tomcat/bin/catalina.sh restart
ExecStop=/opt/tomcat/bin/catalina.sh stop
User=tomcat [Install]
WantedBy=multi-user.target
EOF
# systemctl daemon-reload
# systemctl start tomcat
# systemctl stop tomcat
5、检查和测试
# ps -ef|grep tomcat
# ss -lntup|grep java
# tail -f /opt/tomcat/logs/catalina.out
访问http:192.168.1.11:8080
二、tomcat配置文件
1、tomcat配置文件介绍
server.xml #主配置文件
tomcat-users.xml #管理用户配置文件
2、tomcat管理(生产不要用)
# vim /opt/tomcat/conf/tomcat-users.xml
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
version="1.0">
<role rolename="admin-gui"/> #角色类型
<role rolename="host-gui"/>
<role rolename="manager-gui"/>
<user username="tomcat" password="tomcat" roles="admin-gui,host-gui,manager-gui"/>
</tomcat-users>
# vim /opt/tomcat/webapps/manager/META-INF/context.xml
allow="10\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" /> #允许ip地址范围
# /opt/tomcat/bin/shutdown.sh
# /opt/tomcat/bin/startup.sh
3、Server.xml的组成
1、格式
<server> #顶级组件
<service> #容器类组件
<connector /> #连接器组件
<connector />
<engine> #容器类组件
<host> #容器类组件
<context></context>
</host>
</engine>
</service>
</server>
2、组成
① 顶级组件: 位于整个配置的顶层,如server
② 容器类组件: 包含其它组件的组件,如server,engine,host,context
③ 连接器组件: 连接请求,如connector
④ 被嵌套类组件: 位于一个容器内,不能包含其它组件,如Valve,logger
3、组件详情
server: 在最顶层,整个tomcat容器,监听端口
service: 服务名,将connector关联到engine,一个service内只能有一个引擎engine,可有多个connector
connector: 接收用户请求,客户端和service之间的连接
engine: 核心容器组件,catalina引擎,负责接受并处理connector请求,将请求转到对应的虚拟主机host
host: 虚拟主机,支持基于FQDN的虚拟主机
context: 一个web应用程序,warapp文件路径,web应用程序url的前缀,webapp部署方式
Valve: 阀门,拦截请求并将其转到对应的webapp前过滤,如记录日志,IP访问控制,用于任何容器中
logger: 日志记录器,记录组件内部的状态信息,用于除context外的任何容器中
realm: 存放用户名,密码及role的数据库,用于任意容器的组件中
UserDatabaseRealm: 用JNDI自定义的用户认证库
MemoryRealm: 认证信息定义在tomcat-users.xml中
JDBCRealm: 认证信息定义在数据库中,并通过JDBC连接至数据库查找认证用户
4、Server.xml配置文件解析
# vim server.xml
<?xml version='1.0' encoding='utf-8'?>
<!--
<Server> #实例的顶层元素,包含一个<Service>元素
port #关闭端口
shutdown #关闭命令字符串
-->
<Server port="8005" shutdown="SHUTDOWN">
<Listener className="org.apache.catalina.startup.VersionLoggerListener" />
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
<Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
<Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
<GlobalNamingResources>
<Resource name="UserDatabase" auth="Container"
type="org.apache.catalina.UserDatabase"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
pathname="conf/tomcat-users.xml" />
</GlobalNamingResources>
<!--
service
name #服务名
-->
<Service name="Catalina">
<!--
connector: #处理客户端请求
port: #服务监听端口
address: #服务监听地址,默认0.0.0.0
protocol: #连接器使用的协议,支持HTTP和AJP
minProcessors: #最小处理请求的线程数
maxProcessors: #最大处理请求的线程数
enableLookups: #是否开启DNS查询,true:返回主机名,false:返回ip地址
redirectPort: #https端口
acceptCount: #等待请求队列的最大长度
connectionTimeout: #客户端发送请求的超时时间(单位毫秒)
-->
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
<!--
engine #分析协议的引擎
defaultHost #处理请求的默认虚拟主机
-->
<Engine name="Catalina" defaultHost="localhost">
<!--
Realm #存放用户,密码及role的数据库
-->
<Realm className="org.apache.catalina.realm.LockOutRealm">
<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>
</Realm>
<!--
host #一个虚拟主机
name #主机名
appBase #应用程序的目录,webapp应用路径
unpackWARs #是否自动WAR包,true:不解压,false:解压
autoDeploy #是否自动部署WAR包
xmlValidation #是否启动xml的校验功能
xmlNamespaceAware #检测名称空间,一般是false
-->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<!--
Context #一个web应用程序,通常为WAR文件
docBase #webapp的war包目录,相对路径或绝对路径
path #webapp的url的前缀,127.0.0.1:8080/path/webapp
reloadable #自动重载新的应用,目录:/WEB-INF/class和/WEB-INF/lib
-->
<Context path="" docBase="" debug=""/>
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log" suffix=".txt"
pattern="%h %l %u %t "%r" %s %b" />
</Host>
</Engine>
</Service>
</Server>
5、Server.xml参数解析
元素名 | 属性 | 解释 |
server | address |
监听地址 |
port |
监听关闭端口 |
|
shutdown | 关闭命令字符串 | |
service | name | service的名字 |
Connector | address | 监听地址,默认0.0.0.0 |
port | 监听端口 | |
maxThreads | 最大并发连接数,默认为200 | |
maxConnections | 允许建立的最大连接数 | |
protocol | 连接器使用的协议,支持HTTP和AJP | |
minProcessors | 最小处理请求的线程数 | |
maxProcessors | 最大处理请求的线程数 | |
enableLookups | 是否开启DNS查询,true:返回主机名,false:返回ip地址 | |
redirectPort | https端口 | |
acceptCount | 等待请求队列的最大长度 | |
connectionTimeout | 客户端发送请求的超时时间(单位毫秒) | |
keepAliveTimeout | 长连接状态的超时时间 | |
compression | 是否压缩数据,off: 默认,on: 只压缩text,force: 压缩所有内容 | |
Engine | name | 引擎名称 |
defaultHost | 处理请求的默认虚拟主机 | |
Context | docBase | webapp的war包目录,相对路径或绝对路径 |
path | webapp的url的前缀,127.0.0.1:8080/path/webapp | |
reloadable | 自动重载新的应用,目录:/WEB-INF/class和/WEB-INF/lib | |
cookies | 是否启用cookie来标识session,默认为true | |
xmlNamespaceAware | 和web.xml的解析方式有关,默认为true,设置为false可提升性能 | |
xmlValidation | 和web.xml的解析方式有关,默认为true,设置为false可提升性能 | |
host | name | 主机名 |
appBase | 应用程序的目录,webapp应用路径 | |
unpackWARs | 是否自动WAR包,true:不解压,false:解压 | |
autoDeploy | 是否自动部署WAR包 | |
xmlValidation | 是否启动xml的校验功能 | |
xmlNamespaceAware | 检测名称空间,一般是false | |
xmlBase | 虚拟主机的context xml目录 | |
startStopThreads | 启动context容器时的并行线程数 | |
workDir | 虚拟主机的工作目录 | |
Realm | className | JAASRealm(基于Java Authintication and Authorization Service实现用户认证) |
JDBCRealm(通过JDBC访问,关系型数据库表,实现用户认证) | ||
JNDIRealm(基于JNDI,使用目录服务实现认证) | ||
MemoryRealm(查找tomcat-user.xml文件,实现用户认证) | ||
UserDatabaseRealm(基于UserDatabase文件(tomcat-user.xml)实现用户认证,兼容MemoryRealm,实现可更新和持久的MemoryRealm,通过JNDI实现) | ||
Valve | AccessLogValve | 访问日志 |
ExtendedAccessValve | 扩展功能的访问日志 | |
JDBCAccessLogValve | 通过JDBC将访问日志信息发送到数据库中 | |
RequestDumperValve | 请求转储 | |
RemoteAddrValve | 基于远程地址的访问控制 | |
RemoteHostValve | 基于远程主机名称的访问控制 | |
SemaphoreValve | 用于控制Tomcat主机上任何容器上的并发访问数量 | |
ReplicationValve | 用于Tomcat集群中,在请求session信息发生更改时,触发session数据,在各节点间进行复制 | |
SingleSignOn | 两个或多个webapp需要用户认证,webapp统一认证用户,即一次认证,就可访问所有webapp的连接 |
三、WEB站点部署
1、Tomcat端口
8080: http监听端口
8443: https监听端口
8005: 监听的关闭端口
8009: 反向代理tomcat的时用的端口,基于ajp协议
2、站点部署
1、上传软件包
# cd /opt/tomcat/webapps
# rz -y memtest.war
2、访问测试
访问: http://192.168.1.11/memtest/meminfo.jsp
3、自定义默认网站目录
1、修改默认站点目录
# vim /opt/tomcat/conf/server.xml
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true">
<Context path="" docBase="/opt/tomcat/webapps/memtest"
debug="0" reloadable="false" crossContext="true"/>
2、访问测试
访问: http://192.168.1.11/meminfo.jsp
四、搭建jpress部署实践
1、安装配置mariadb数据库
# yum install mariadb mariadb-server
# systemctl start mariadb.service
# mysqladmin password 123456
# mysql -uroot -p123456
mysql> create database jpress DEFAULT CHARACTER SET utf8;
mysql> grant all on jpress.* to jpress@'192.168.1.%' identified by '123456';
mysql> flush privileges;
2、上传jpress代码
# cd /opt/tomcat/webapps
# rz -y jpress-web-newest.war
# mv jpress-web-newest.war jpress.war
3、web页面配置jpress
浏览器访问: http://192.168.1.11:8080/jpress/
4、重启tomcat
# /opt/tomcat/bin/shutdown.sh
# /opt/tomcat/bin/startup.sh
5、测试
1、写一篇文章并上传附件
2、上传文件的路径
# ll /opt/tomcat/webapps/jpress/attachment/20200810/
3、文章内容在数据库的位置
mysql> select * from jpress.jpress_content\G
id: 1
title: 测试页面
text: <p>测试第一个</p><p><img src="/jpress/attachment/20200810/55f65d452e9b4fdb99a09f0c68532f6a.jpeg" \
alt="" width="256" height="256"></p>
五、zabbix监控tomcat
1、安装zabbix-agent服务
# https://mirrors.tuna.tsinghua.edu.cn/zabbix/zabbix/4.0/rhel/7/x86_64/
# yum install zabbix-agent -y
# cat /etc/zabbix/zabbix_agentd.conf
PidFile=/var/run/zabbix/zabbix_agentd.pid
LogFile=/var/log/zabbix/zabbix_agentd.log
LogFileSize=0
Server=192.168.1.20 #zabbix-server地址
ServerActive=192.168.1.20 #zabbix-server地址
Hostname=Zabbix server #zabbix-server主机名
Include=/etc/zabbix/zabbix_agentd.d/*.conf
# systemctl restart zabbix-agent.service
2、开启远程监控
# vim /opt/tomcat/bin/catalina.sh
#!/bin/sh #添加到最前面
CATALINA_OPTS="$CATALINA_OPTS
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345 #远程端口
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=192.168.1.11" #tomcat地址
# /opt/tomcat/bin/shutdown.sh
# /opt/tomcat/bin/startup.sh
3、修改hosts解析
# tail -1 /etc/hosts
192.168.1.11 tomcat01
4、检查进程和端口号
# ps -ef | grep java
# ss -lntup | grep 12345
5、配置zabbix-server
1、安装java
# yum install java-1.8.0 -y
# java -version
2、安装zabbix-java-gateway服务
# yum install zabbix-java-gateway.x86_64 -y
# systemctl start zabbix-java-gateway.service
3、修改zabbix_server.conf配置文件
# vim "Java" /etc/zabbix/zabbix_server.conf
JavaGateway=127.0.0.1
JavaGatewayPort=10052
StartJavaPollers=5
4、重启zabbix服务
# systemctl restart httpd
# systemctl restart zabbix-server.service
# systemctl restart zabbix-java-gateway.service
5、zabbix网页操作
六、tomcat多实例
1、复制目录
# cd /opt/
# cp -a apache-tomcat-8.5.43 tomcat_01
# cp -a apache-tomcat-8.5.43 tomcat_02
2、修改配置文件
1、修改端口号(实例一)
# sed -i 's#8005#8006#g' tomcat_01/conf/server.xml
# sed -i 's#8009#8010#g' tomcat_01/conf/server.xml
# sed -i 's#8080#8081#g' tomcat_01/conf/server.xml
# sed -i 's#12345#12346#g' tomcat_01/bin/catalina.sh 2、修改端口号(实例二)
# sed -i 's#8005#8007#g' tomcat_02/conf/server.xml
# sed -i 's#8009#8011#g' tomcat_02/conf/server.xml
# sed -i 's#8080#8082#g' tomcat_02/conf/server.xml
# sed -i 's#12345#12346#g' tomcat_02/bin/catalina.sh 3、修改或删除自定义的配置路径
# vim server.xml
<Context path="" docBase="/opt/tomcat" debug="0" reloadable="false" crossContext="true"/>
3、启动多实例
# /opt/tomcat_01/bin/startup.sh
# /opt/tomcat_02/bin/startup.sh
4、查看服务
# ss -lntup|grep java
5、浏览器访问
实例一: http://192.168.1.11:8081/jpress/
实例二: http://192.168.1.11:8082/jpress/
七、tomcat集群配置
1、安装nginx
# yum install nginx -y
2、创建配置文件
# vim /etc/nginx/conf.d/proxy.conf
upstream java {
server 192.168.1.11:8081;
server 192.168.1.11:8082;
}
server {
listen 80;
server_name www.test.com;
root html;
index index.html index.htm;
location / {
proxy_pass http://java;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
3、启动nginx
# nginx -t
# systemctl start nginx
八、tomcat安全优化
1、降权启动(普通用户启动)
# cp -a apache-tomcat-8.0.27 /home/test/tomcat
# chown -R test.test /home/test/tomcat
# su - test
$ ./tomcat/bin/startup.sh
2、telnet管理端口保护
# vim server.xml(更改端口)
<Server port="8055" shutdown="pass">
3、ajp连接端口保护(更改端口,或禁用)
# vim server.xml
<Connector port="8099" protocol="AJP/1.3" redirectPort="8443" />
4、禁用管理端(删除webapp所有默认目录和文件)
# cd /opt/tomcat/webapps/
# mv docs examples host-manager manager /tmp
# mv ROOT/* /tmp
5、屏蔽dns查询(只记录IP,不记录主机名)
# vim /application/tomcat/conf/server.xml
<Connector port="8081" protocol="HTTP/1.1"
connectionTimeout="6000" enableLookups="false" acceptCount="800"
redirectPort="8443" />
6、加速Tomcat启动
# vim /usr/java/jdk1.8.0_181-amd64/jre/lib/security/java.security
securerandom.source=file:/dev/urandom
九、jvm调优
# vim catalina.sh
JAVA_OPTS="-Djava.awt.headless=true -Dfile.encoding=UTF-8 -server -Xms1024m -Xmx1024m
-XX:NewSize=512m -XX:MaxNewSize=512m -XX:PermSize=512m -XX:MaxPermSize=512m"
-server #JVM的server模式
-Xms #堆内存初始值(推荐:物理内存的一半)
-Xmx #堆内存最大值(xms和xmx的配置相同的值)
-XX:NewSize #堆区,新生代初始值
-XX:MaxNewSize #堆区,新生代最大值
-XX:PermSize #非堆区,持久代(方法区)初始值
-XX:MaxPermSize #非堆区,持久代(方法区)最大值
-Xmn #同时配置新生代初始值和最大值(JDK1.4之后支持)
-Xss #每个线程的堆栈大小(最佳:128K,默认:512k)
+XX:AggressiveHeap #java堆最佳化设置,会忽略Xmx参数
-verbose:gc #输出JVM gc日志
-Xloggc:gc.log #指定gc日志目录
-XX:+UseParNewGC #并行多线程收集,对年轻代进行GC
-XX:+UseConcMarkSweepGC #用CMS收集器,对年老代进行GC
十、其他
1、打包和解包
1、解包
# /opt/jdk1.8/bin/jar -xvf jpress-web-newest.war 2、打包
# /opt/jdk1.8/bin/jar -cvfM0 jpress.war ./ #添加文件夹
# /opt/jdk1.8/jar -cvfM0 jpress.war ./add.class #添加文件 3、jar 命令参数
-M: 不创建文件的清单文件(Manifest.mf),该参数会忽略掉-m参数
-0: 不压缩,仅存储
2、ansible启动tomcat
1、直接用ansible的shell模块,启动不了,要chdir切换工作目录,并结合nohub放在后台启动
# vim tomcat.yml
- hosts: tomcat
tasks:
- name: 01-start-tomcat
shell: chdir=/opt/tomcat/bin nohup ./startup.sh start &
- name: 02-copy-jpress
copy:
src: /root/tomcat/jpress.war
dest: /opt/tomcat/webapps 2、用system管理
1) 创建用户
# groupadd tomcat -g 1111
# useradd tomcat -u 1111 -g 1111 -M -s /sbin/nologin
# id tomcat
2) 编辑服务启动脚本
# vim >/usr/lib/systemd/system/tomcat.service
[Unit]
Description=Apache Tomcat Web Application Container
After=syslog.target network.target [Service]
Type=forking
ExecStart=/opt/tomcat/bin/catalina.sh start
ExecReload=/opt/tomcat/bin/catalina.sh restart
ExecStop=/opt/tomcat/bin/catalina.sh stop
User=tomcat [Install]
WantedBy=multi-user.target
3) 测试启动服务
# systemctl daemon-reload
# systemctl start tomcat
# systemctl stop tomcat
学习tomcat(三)的更多相关文章
- JavaWeb学习总结(三)——Tomcat服务器学习和使用(二) 包含https 非对称秘钥 NB
JavaWeb学习总结(三)--Tomcat服务器学习和使用(二) 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命 ...
- JSP学习笔记(三):简单的Tomcat Web服务器
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- JavaWeb学习总结(三)——Tomcat服务器学习和使用
收藏 JavaWeb学习总结(三)——Tomcat服务器学习和使用 http://www.cnblogs.com/xdp-gacl/p/3744053.html
- JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面
注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...
- 烂泥:学习tomcat之通过shell批量管理多个tomcat
本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 公司的业务是使用tomcat做web容器,为了更有效的利用服务器的性能,我们一般部署多个 ...
- (转)Maven学习总结(三)——使用Maven构建项目
孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(三)——使用Maven构建项目 maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的 ...
- Oracle学习笔记三 SQL命令
SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)
- 从零开始学习jQuery (三) 管理jQuery包装集
本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...
- 前端学习 第三弹: JavaScript语言的特性与发展
前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...
- Android Animation学习(三) ApiDemos解析:XML动画文件的使用
Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...
随机推荐
- 想找好用的BI软件?看这一篇就够了:2021年好用的BI软件推荐
很多厂商活跃在商业智能(下面称BI)领域.事实上,能够满足用户需要的BI产品和方案必须建立在稳定.整合的平台之上,该平台需要提供用户管理.安全性控制.连接数据源以及访问.分析和共享信息的功能.那么,有 ...
- linux中()、[]、{}、(())、[[]]等各种括号的使用
转至:https://www.jianshu.com/p/b88c7e07aaa9 linux中().[].{}.(()).[[]]等各种括号的使用 1.小括号.圆括号() 1.1 单小括号() 命令 ...
- java复习面向对象(二)
java复习面向对象(二) 1.static关键字 举例图片 静态变量 使用static修饰的成员变量是静态变量 如果一个成员变量使用了关键字static,那么这个变量不属于对象自己,而属于所在的类多 ...
- 快速整透Redis中的压缩列表到底是个啥
压缩列表简介 压缩列表(ziplist)是由一个连续内存组成的顺序型数据结构.一个压缩列表可以包含任意多个节点,每个节点上可以保存一个字节数组或整数值.它是Redis为了节省内存空间而开发的. 压缩列 ...
- Spring Cloud Gateway 不小心换了个 Web 容器就不能用了,我 TM 人傻了
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...
- 安装MYSQL8.0提示api-ms-win-crt-runtime-l1-1-0.dll 丢失
Windows Server 2012 api-ms-win-crt-runtime-l1-1-0.dll 丢失 2017-11-06 11:11:37 Martin_Yelvin 阅读数 17015 ...
- JavaSE 千寻简学习笔记
JavaSE 千寻简学习笔记 简介 TIOBE:编程语言排行榜 官网:https://hellogithub.com/report/tiobe/ 如何高效的学习Java 多写(代码)多写(笔记)多写( ...
- LGP3311题解
为什么我和同学对比了一下,发现我和他的做法差别很大啊 对于这种问题,我们把整个字符串分为两个部分:前缀顶着最高位和后缀没有顶着最高位. 我们枚举这个前缀,然后后缀通过 DP 来搞定. 不包含任何一个子 ...
- CF594D题解
我不会数据结构/kk 我想题意应该十分清楚了. 我们知道 \(\varphi(p^k)=p^{k-1}(p-1)\),那么我们考虑将一个询问下放到右端点,然后往右移动右端点并更新每个左端点到右端点的答 ...
- selenium&火狐驱动安装及兼容性处理
1.selenium安装 安装:pip install selenium==3.7.0 卸载: pip uninstall selenium 查看版本号:pip show selenium 2.火 ...