Nginx(发音为 “Engine-X”)是一个高性能的 HTTP 和反向代理服务器,同时也是一个 IMAP/POP3 代理服务器。由俄罗斯工程师 Igor Sysoev 开发,最早发布于 2004 年。Nginx 的轻量和高并发处理能力让它在高流量网站中迅速流行,目前被广泛用于各类服务器环境中。
为什么选择 Nginx?Nginx 具有以下主要优势:
高并发性能:Nginx 采用事件驱动(异步)的非阻塞架构,能够高效处理成千上万的并发连接,特别适合高流量应用。
资源效率:与其他服务器(如 Apache)相比,Nginx 占用的内存和 CPU 资源更少,提供更好的资源利用率。
功能丰富:Nginx 支持静态文件服务、反向代理、负载均衡、缓存、SSL/TLS 加密等功能,适用多种场景。
高度可扩展:Nginx 支持模块化配置,可通过模块扩展功能。其配置文件简单明了,便于管理和扩展。
Nginx 的应用场景Nginx 具备多种应用场景,常见的包括:
静态文件服务器:适合静态内容(如 HTML、CSS、JavaScript、图片和视频)的高效分发。
反向代理服务器: ...
新时代码农
未读1. SQL 连接操作简介在数据库查询中,JOIN 操作是一种非常强大的工具。它允许我们将来自不同表的数据结合起来。下面是几种常见的 JOIN 类型及其用途:
INNER JOIN(内连接):返回两个表中匹配的行。
LEFT JOIN(左连接):返回左表所有记录,右表无匹配时返回 NULL。
RIGHT JOIN(右连接):返回右表所有记录,左表无匹配时返回 NULL。
2. 使用 CASE WHEN 在 SQL 中处理条件逻辑在 SQL 查询中,CASE WHEN 是一种强大的工具,它允许你在查询结果中根据特定条件添加不同的值。以下是一个示例:
1234567SELECT *, CASE WHEN (A - B) = 0 THEN 'T' WHEN (A - B) < 0 THEN 'WRONG' ELSE CASE WHEN (A IS NULL OR B IS NULL) THEN 'F' ELSE 'T' END ...
通过端口号获取对应的 PID1/usr/sbin/lsof -n -P -t -i :$TOMCAT_WEB_PORT
根据名称获取 PID1234ps -ef | grep -w java | grep -v grep | awk '{print $2}'-w 全匹配名字-v 忽略名字
tar123.tar.gz 和 .tgz解压:tar zxvf FileName.tar.gz压缩:tar zcvf FileName.tar.gz DirName
shell 执行多个命令
每个命令之间用 ; 隔开说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。
每个命令之间用 && 隔开说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。
每个命令之间用 || 隔开说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止
查看历史命令1history | awk '{ ...
Spring Boot 为什么建议将 main 类放在所有类所在包的顶层
通常建议将应用的 main 类放到其他类所在包的顶层 (root package),并 将 @EnableAutoConfiguration 注解到你的 main 类上,这样就隐式地定义了一个 基础的包搜索路径(search package),以搜索某些特定的注解实体(比如 @Service,@Component 等) 。例如,如果你正在编写一个 JPA 应用,Spring 将 搜索 @EnableAutoConfiguration 注解的类所在包下的 @Entity 实体。
采用 root package 方式,你就可以使用 @ComponentScan 注解而不需要指 定 basePackage 属性,也可以使用 @SpringBootApplication 注解,只要将 main 类放到 root package 中。
@SpringBootApplication 等同于以默认属性使用一下注解:
@EnableAutoConfiguration
@ComponentScan 扫描所有 Spring 组件 ...
volatile 关键字的 2 层含义:
用 volatile 修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新的值.作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
可见性可见性是指 当一个线程修改了一个共享变量,其他线程能够立刻得知这个修改.这里有必要了解一下 Java 的内存模型
被 volatile 修饰的变量,当线程需要使用这个变量时,回去主内存中读取,然后加载到自己的工作线程中,工作线程中的变量只是主存变量的一个拷贝,当使用完这个变量后,会刷新会主存中.
当数据中主内存复制到工作内存存储时,必须出现两个动作:
由主内存执行的 read 操作
有工作内存执行相应的 load 操作
当数据从工作内存拷贝到主内存时,也会有两个操作:
用工作内存执行的 store 操作
用主内存执行相应的 write 操作
volatile 的特殊规则就是 read、load、use 必须连续出现。assign、store、write 动作必须连续出现。所以使用 volatile 变量能够保证必须先从主内存刷新最新的值,每次修改后必须立即同步 ...
如果我们希望输出 com.foo.Bar 的 TRACE 等级的日志,而不像影响其他日志的输出。简单的改变日志等级是不能达到我们想要的目的;但是修改也很简单,只要我们添加一个新的 Logger 定义就可以达到目标。
1234<Logger name="com.foo.Bar" level="TRACE"/><Root level="ERROR"> <AppenderRef ref="STDOUT"></Root>
这个配置达到了我们想要的目标,所有 com.foo.Bar 的日志都会被输出,而其他组件的日志仅仅会输出 ERROR 等级的日志。
在上面的例子,所有 com.foo.Bar 的日志都会被输出到控制台。这是因为为 com.foo.Bar 配置的 Logger 没有设定任何的 Appender。
请看如下的配置
12345678910111213141516<?xml version="1.0" encoding=&qu ...
在 Linux 系统中,rm 命令是一个非常强大的工具,它可以永久删除文件和目录。然而,这种强大的能力也带来了风险,因为一旦文件被删除,就很难恢复。为了防止因误操作而丢失重要数据,我们可以创建一个自定义的回收站来保存被删除的文件。以下是实现这一功能的详细步骤和脚本。
背景作为 Ubuntu 的用户,我们经常需要在命令行下执行文件删除操作。但是,命令行下的 rm 命令一旦执行,被删除的文件几乎不可能恢复。为了避免这种情况,我们编写了一个简单的脚本,将删除操作改为移动操作,从而实现了一个类似于 Windows 系统中回收站的功能。
脚本介绍下面提供的脚本 rmtrash 可以作为 rm 命令的替代品。它将用户指定的文件或目录移动到一个特定的“回收站”目录中,而不是直接删除它们。这样,如果需要,用户可以从回收站中恢复这些文件。
脚本功能
移动文件到回收站:而不是直接删除文件,脚本会将它们移动到用户家目录下的 .rmtrash/ 目录。
记录删除操作:脚本会记录所有删除操作的详细信息,包括删除的文件路径和时间,以便于恢复。
恢复文件:可以从回收站中恢复文件到原始位置。
清空回收站:当确认不再需 ...
Apache Log4j 2 是对 Log4j 的升级,它比其前身 Log4j 1.x 提供了重大改进,并提供了 Logback 中可用的许多改进,同时修复了 Logback 架构中的一些固有问题。
log4j2 是 log4j 1.x 的升级版,参考了 logback 的一些优秀的设计,并且修复了一些问题,因此带来了一些重大的提升,主要有:
主要特点
异常处理,在的 logback 中,追加程序中的异常不会被应用感知到,但是在 log4j2 中,提供了一些异常处理机制。
性能提升,log4j2 相比于 log4j 1 和 logback 都具有很明显的性能提升,后面会有官方测试的数据。
自动重载配置,参考了的 logback 的设计,当然会提供自动刷新参数配置,最实用的就是我们在生产上可以动态的修改日志的级别而不需要重启应用 - 那对监控来说,是非常敏感的。
无垃圾机制,log4j2 在大部分情况下,都可以使用其设计的一套无垃圾机制,避免频繁的日志收集导致的 jvm gc。
一些概念之前看官方文档摘抄了一些概念,这里懒得翻译了,使用的 log4j 的都应该清楚,这里只是标记 ...
Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,广泛用于构建网络应用程序。它允许开发者使用 JavaScript 来编写服务器端代码。本文将为你提供 Node.js 的入门步骤以及一些实用工具的使用。
安装 Node.js1. 安装 n 模块首先,你需要安装 n 模块,这是一个强大的版本控制工具,可以方便地管理多个 Node.js 版本。
1sudo npm install -g n
2. 更新到最新稳定版使用 n 可以轻松升级到最新的 Node.js 稳定版:
1sudo n stable
3. 升级到最新版本如果你想要安装最新版本的 Node.js,无论是稳定版还是长期支持(LTS)版,可以使用以下命令:
1sudo n latest
4. 安装指定版本n 还允许你安装任意历史版本的 Node.js。你可以使用版本号来升级到特定的版本:
1sudo n v0.10.26 或 sudo n 0.10.26
5. 切换版本要切换到某个特定的 Node.js 版本,可以使用以下命令:
1sudo n 7.10.0
6. 删除指定版本如果 ...
在 Linux 系统中,Python 是一个非常流行的编程语言,被广泛应用于 Web 开发、数据分析、人工智能等多个领域。本文将详细介绍如何在 CentOS 操作系统中安装和配置 Python 环境。
安装步骤1. 解压 Python 包首先,你需要下载 Python 的源代码包并将其解压到你的服务器上。由于你要求不使用外部工具安装 Python,我们将手动进行这一步。
12# 假设你已经下载了 Python 的源码压缩包到 /usr/local/src 目录下tar -xzf Python-3.8.x.tar.gz -C /usr/local/src
2. 进入解压后的文件夹接下来,进入 Python 的源代码目录:
1cd /usr/local/src/Python-3.8.x
3. 配置和安装 Python现在,我们可以执行 configure 脚本来配置 Python 的编译选项。如果你需要指定安装目录,可以添加 --prefix 参数。
12./configure --prefix=/opt/python38make && make install
这个 ...
Redis 是一个开源的内存数据结构存储系统,它提供了多种数据类型和丰富的操作命令,使得它在处理快速读写和高并发场景下表现出色。下面将详细介绍 Redis 的主要特性和应用场景。
1. 支持持久化RDB 持久化RDB 是 Redis 的本地持久化方式,通过周期性地将内存中的数据写入磁盘来保存数据状态。在 redis.conf 配置文件中,可以通过设置定时任务或手动触发 RDB 快照。
AOF 持久化AOF(Append Only File)是另一种持久化方法,它记录每次写操作到文件中。当 Redis 重启时,它会重新执行这些命令来重建数据状态。开启 AOF 持久化对于防止数据丢失非常有用,但它可能会消耗更多磁盘空间。
2. 丰富的数据类型Redis 支持多种数据类型,包括:
String:最简单的键值对存储。
List:列表,可以用于消息队列等场景。
Set:集合,支持成员的唯一性和操作如求交集、并集等。
Sorted Set:有序集合,常用于排行榜应用。
Hash:哈希表,适合用于存储结构化数据。
这些数据类型提供了高效的数据结构和丰富的操作命令,使得 Redis 可以适应各种不 ...
RESTful API 是一种网络应用架构风格,强调通过统一的接口和资源操作设计 API。它使用 HTTP 协议中的不同方法来创建、读取、更新和删除资源,让开发者和用户能够直观地理解和操作应用程序。
RESTful API 设计原则1. 资源导向RESTful API 以资源为中心进行设计。每个资源都有一个唯一的 URI,客户端可以通过这个 URI 访问相应的资源。
URL 示例:
GET /zoos:查看所有动物园
POST /zoos:创建一个新动物园
GET /zoos/1:获取指定动物园的信息
2. 方法使用RESTful API 使用 HTTP 协议中的不同方法来执行不同的操作:
GET:从服务器检索资源。
POST:在服务器上新建一个资源。
PUT:更新资源(客户端提供改变后的完整资源)。
PATCH:部分更新资源(客户端提供改变的属性)。
DELETE:删除资源。
3. 状态码使用RESTful API 使用标准的 HTTP 状态码来表示请求的结果:
200 OK:成功检索数据
201 Created:创建新资源成功
...
Web 服务器一旦发出响应,一个请求响应过程就结束了.当再次发出请求时,Web 服务器不记得曾就做过的请求,也不记得给用户发出过响应.,这就是 http 的无状态模式
当需要跨多个请求需要保留与客户端会话状态时,我们有 4 种解决方案
表单隐藏字段<input type="hidden" name="userName" value="…">作用:
对用户在网上的访问进行会话跟踪
为服务器提供预定义的输入
存储动态产生的网页的上下文信息
缺点: 只有当每个网页是动态生成的才有效
Cookie将数据已键值对的形式通过响应保存在客户端方法:
Cookie(name,value)
get/setComment(String comment): 注释
get/setDomain(String domainPattern): 得到/设置应用 Cookie 的域
setMaxAge(int lifetime) 设置过期时间,默认为负数,表示在关闭浏览器后过期
getMaxAge()
get ...
APP 服务端的 Token 验证通过拦截器对使用了 @Authorization 注解的方法进行请求拦截,从 http header 中取出 token 信息,验证其是否合法。非法直接返回 401 错误,合法将 token 对应的 user key 存入 request 中后继续执行。具体实现代码:
1234567891011121314151617181920212223242526272829303132public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //如果不是映射到方法直接通过 if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMetho ...