一、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 &quot;%r&quot; %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(三)的更多相关文章

  1. JavaWeb学习总结(三)——Tomcat服务器学习和使用(二) 包含https 非对称秘钥 NB

    JavaWeb学习总结(三)--Tomcat服务器学习和使用(二) 一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命 ...

  2. JSP学习笔记(三):简单的Tomcat Web服务器

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  3. JavaWeb学习总结(三)——Tomcat服务器学习和使用

    收藏 JavaWeb学习总结(三)——Tomcat服务器学习和使用 http://www.cnblogs.com/xdp-gacl/p/3744053.html

  4. JAVA WEB学习笔记(三):简单的基于Tomcat的Web页面

    注意:每次对Tomcat配置文件进行修改后,必须重启Tomcat 在E盘的DATA文件夹中创建TomcatDemo文件夹,并将Tomcat安装路径下的webapps/ROOT中的WEB-INF文件夹复 ...

  5. 烂泥:学习tomcat之通过shell批量管理多个tomcat

    本文由ilanniweb提供友情赞助,首发于烂泥行天下 想要获得更多的文章,可以关注我的微信ilanniweb 公司的业务是使用tomcat做web容器,为了更有效的利用服务器的性能,我们一般部署多个 ...

  6. (转)Maven学习总结(三)——使用Maven构建项目

    孤傲苍狼 只为成功找方法,不为失败找借口! Maven学习总结(三)——使用Maven构建项目 maven作为一个高度自动化构建工具,本身提供了构建项目的功能,下面就来体验一下使用maven构建项目的 ...

  7. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  8. 从零开始学习jQuery (三) 管理jQuery包装集

    本系列文章导航 从零开始学习jQuery (三) 管理jQuery包装集 一.摘要 在使用jQuery选择器获取到jQuery包装集后, 我们需要对其进行操作. 本章首先讲解如何动态的创建元素, 接着 ...

  9. 前端学习 第三弹: JavaScript语言的特性与发展

    前端学习 第三弹: JavaScript语言的特性与发展 javascript的缺点 1.没有命名空间,没有多文件的规范,同名函数相互覆盖 导致js的模块化很差 2.标准库很小 3.null和unde ...

  10. Android Animation学习(三) ApiDemos解析:XML动画文件的使用

    Android Animation学习(三) ApiDemos解析:XML动画文件的使用 可以用XML文件来定义Animation. 文件必须有一个唯一的根节点: <set>, <o ...

随机推荐

  1. 想找好用的BI软件?看这一篇就够了:2021年好用的BI软件推荐

    很多厂商活跃在商业智能(下面称BI)领域.事实上,能够满足用户需要的BI产品和方案必须建立在稳定.整合的平台之上,该平台需要提供用户管理.安全性控制.连接数据源以及访问.分析和共享信息的功能.那么,有 ...

  2. linux中()、[]、{}、(())、[[]]等各种括号的使用

    转至:https://www.jianshu.com/p/b88c7e07aaa9 linux中().[].{}.(()).[[]]等各种括号的使用 1.小括号.圆括号() 1.1 单小括号() 命令 ...

  3. java复习面向对象(二)

    java复习面向对象(二) 1.static关键字 举例图片 静态变量 使用static修饰的成员变量是静态变量 如果一个成员变量使用了关键字static,那么这个变量不属于对象自己,而属于所在的类多 ...

  4. 快速整透Redis中的压缩列表到底是个啥

    压缩列表简介 压缩列表(ziplist)是由一个连续内存组成的顺序型数据结构.一个压缩列表可以包含任意多个节点,每个节点上可以保存一个字节数组或整数值.它是Redis为了节省内存空间而开发的. 压缩列 ...

  5. Spring Cloud Gateway 不小心换了个 Web 容器就不能用了,我 TM 人傻了

    个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判.如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 i ...

  6. 安装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 ...

  7. JavaSE 千寻简学习笔记

    JavaSE 千寻简学习笔记 简介 TIOBE:编程语言排行榜 官网:https://hellogithub.com/report/tiobe/ 如何高效的学习Java 多写(代码)多写(笔记)多写( ...

  8. LGP3311题解

    为什么我和同学对比了一下,发现我和他的做法差别很大啊 对于这种问题,我们把整个字符串分为两个部分:前缀顶着最高位和后缀没有顶着最高位. 我们枚举这个前缀,然后后缀通过 DP 来搞定. 不包含任何一个子 ...

  9. CF594D题解

    我不会数据结构/kk 我想题意应该十分清楚了. 我们知道 \(\varphi(p^k)=p^{k-1}(p-1)\),那么我们考虑将一个询问下放到右端点,然后往右移动右端点并更新每个左端点到右端点的答 ...

  10. selenium&火狐驱动安装及兼容性处理

    1.selenium安装 安装:pip install selenium==3.7.0 卸载: pip uninstall selenium 查看版本号:pip show selenium   2.火 ...