2-Maven框架

Maven

Maven使一个一键式的自动化的构建工具

  1. 可以自动帮助我们下载jar包
  2. 可以进行多个项目同时的编译运行
  3. 提供了自动化的测试插件帮助我们进行项目测试功能的运行
  4. 进行资源文件、配置文件的整合,来进行打包和部署

项目构建过程

  1. 清理:将上次编译的结果删除,为下一次编译做准备
  2. 编译:将.java文件编译生成.class文件
  3. 测试:针对项目中的关键点测试,确保项目在迭代开发过程中关键点的正确性
  4. 报告:在每一次测试后,以标签的格式记录和展示测试结果
  5. 打包:将项目生成jar包或war包。jar包可供其他功能调用,war包可以上传服务器运行
  6. 安装:将jar包安装到本地仓库
  7. 部署:将jar包部署到私服上

Maven的两大核心功能:项目构建和依赖管理

核心概念

  1. POM(Project Object Model)项目对象模型

它是Maven的核心组件,以pom.xml形式存在,包含了项目的相关属性、添加的依赖、引用的插件等

  1. 约定的目录结构

所有maven项目必须要遵循的目录规范,将java源码和测试代码拆用,用于项目的管理和扩展

项目名称
	src
		main
			java
			resources
		test
			java
			resources
	pom.xml
  1. 坐标GAV

坐标是资源的唯一定位,创建项目时使用坐标拟定一个名称,访问资源时通过坐标找到资源。表现在仓库,gav是一级一级的目录

groupid:组织名称,一般是公司域名的倒写

artifactid:项目名称

version:版本编号

定义项目

  <groupId>org.example</groupId>
  <artifactId>easyJava</artifactId>
  <packaging>war</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>easyJava Maven Webapp</name>

引用项目

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>${mysql.version}</version>
    </dependency>
  1. 仓库

存放jar包的位置,分为本地仓库和远程仓库

本地仓库一定要是一个没有中文的路径

远程仓库:通过局域网或互链网访问的仓库地址。分为中央仓库http://mvnrepository.com/artifact,各大洲的镜像,私服。

  1. 依赖

一个maven项目正常运行需要其他项目的支持。依赖就是添加jar包,所有资源都是以gav进行定义的,也是通过gav来添加引用

在大标签中,通过子标签,通过gav进行引用

  1. 生命周期

整个项目构建过程的各个阶段,

  1. 插件

maven就是一个插件的框架,插件是集成化的功能

通过大标签,再通过子标签进行极简化的添加。

常见的插件:comcat插件,编译插件,Mybatis的逆向工程插件

Maven应用

需要用到JAVA_HOME和MAVEN_HOME

conf/setting.xml中配置注释:

本地仓库、远程仓库(阿里)

jdk版本

maven在第一次使用时最好要联网,因为需要下载依赖

配置idea中的maven

file—>settings—>Build,Execution,Depolyment—>Build Tools—>Maven

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为所有项目配置maven:在setting for new Project中再配置一遍

maven的目录有颜色,带有属性。如果不写packaging,默认是jar

测试方法的规范:

  • 访问权限是public
  • 方法没有返回值void
  • 方法名自定义,推荐以Test结尾
  • 方法没有参数
  • 以@Test注解,声明是一个测试方法

创建一个maven支持的javaweb的项目:

  • 新建modules,选择Maven ArcheType,什么都不要的话可以选择quickstart

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

web项目生成的是jar包

需要添加Servlet依赖,相当于Controller

Maven的依赖管理

依赖范围的的标签为,有compile、test、provided、runtime、system

  1. compile:编译依赖范围,如果没有指定,默认使用该依赖范围,对于编译、测试、运行3种classpath有效

  2. test:只在测试范围内生效

  3. provided:编译源码、编译测试和测试范围内有效,运行时无效

  4. runtime:测试和运行时依赖范围,在编译时无效

  5. system:与provided范围相同,非maven仓库的本地jar包,路径使用绝对路径(少用,过度依赖某一台机器)

依赖传递

依赖具有传递性,不管Maven项目存在多少间接依赖,POM中都只需要定义其直接依赖

依赖传递过程中,依赖范围的影响:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  1. 当间接依赖时compile时,与直接依赖的范围一致

  2. 当间接依赖是test和provided时,不可被传递

  3. 当间接依赖时runtime时,传递性依赖的范围与智姐依赖的范围一致,但compile例外,会改为runtime

依赖冲突

当一个间接依赖存在多条引入路径时,可能会存在多个相同的依赖项但是版本不同

解决方案:

  1. 版本锁定

pom是父工程的打包方式,此工程不能运行,只是来进行规范和定义的

子工程的gv与父工程保持一致

使用大标签,再包含,包含,这个标签只是用来定义,并没有添加进行引用

子工程中可以不写version,会使用与父工程相同的版本。

但是子工程也可以声明版本号,使用声明的版本

  1. 短路径优先
image-20240531144610836
  1. 声明优先

在路径相同的情况下,先声明的优先

image-20240531144813550
  1. 特殊优先

在pom.xml文件中,对一个依赖多次进行了声明,后面的会覆盖前面的配置

  1. 可选依赖

使用true标签,不传递此间接依赖。在被引用项目中使用

  1. 排除依赖

使用标签

exclusions下会有多个子标签,在当前项目中使用

可选依赖的优先级高于排除依赖

刷新依赖的8种方式
  1. 点击M刷新按钮
  2. 点击Maven窗口的全部项目刷新
  3. 点击Build中的ReBuild Project
  4. 点击pom.xml右键—》Maven—》Reload Project刷新本项目的依赖
  5. 重写pom.xml文件
  6. 清空缓存:Invalidate Caches—>全选—>Invalidate and Restart,清空idea的缓存并重启idea刷新依赖
  7. 打开本地仓库,搜索last,全选删除,点Maven的刷新全部依赖按钮(因为网络不好只下了一半,但是引用已经存在了)
  8. 在7的步骤后执行,File—>settings—>Build,Execution,Depolyment—>Build Tools—>Maven—>Repositories—>选中本地仓库—>update—>ok

资源文件的指定

除了resources目录下的资源文件,其他路径下的资源文件(.xml、.properties等等)

<!-- 指定资源文件的位置 -->
<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xm</include>
                    <include>**/*.properties/include>
                </includes>
        </resource>
        <resource>
            <directory>src/main/resource</directory>
                <includes>
                    <include>**/*.xm</include>
                    <include>**/*.properties/include>
                </includes>
        </resource>
    </resources>
</build>

Maven的继承和聚合

在标签中定义版本及对应名称

使用标签进行继承

聚合:通过标签将其他的项目添加在一起,同时进行管理,没有具体的功能,打包方式时pom。相当于创建一个父工程

私服

私服是一种特殊的远程仓库,架设在局域网内的仓库服务

hosted:宿主仓库

proxy:代理仓库,用于代理远程的工程仓库

group:仓库组,用于合并多个hosted和proxy。

nexus私服

Redis

远程字典服务,使用ANCI C语言开发,支持网络、可基于内存亦可持久化的日志型、NoSQL开源内存数据库。

Redis是一个key-value存储系统,支持存储String(字符串)、List(链表)、Set(集合)、Zset(有序集合)、Hah(哈希)等

NoSQL泛指非关系型数据库,仅仅是一个概念,为了解决大规模数据集合多重数据类型带来的挑战。包含有:

  1. 键值存储数据库:代表Redis
  2. 列存储数据库:列存储数据库可实现分布式存储,适合海量存储,代表HBase
  3. 文档型数据库:代表MangDB
  4. 图形数据库:存放节点关系的数据库,代表Neo4j

Redis用途:在高并发环境下,将压力从数据库(硬盘)转移到了redis(内存)

  • 性能极高:读的速度可达11w次/s,写的速度可达8w次/s。因为他的所有操作都在内存中发生。c语言开发。源码精细
  • 简单稳定:源码很少,早期版本只有2w行左右。从3.0版本开始,增加了集群功能,代码变为了5w行
  • 持久化:虽然存储在内存,但是可以持久化的硬盘,有两种方式:RDB和AOF
  • 高可用集群:
  • 丰富的数据类型
  • 强大的功能:数据过期、发布/订阅,简单事务功能,Lua脚本扩展
  • 客户端语言丰富:提供了简单的tcp通信协议
  • 支持ACL权限控制:redis6引用,可以为不同的用户定义不同的用户权限。

ACL是一种细粒度的权限管理策略

Unix与Linux系统默认使用的是UGO(User、Group、Other),是一种粗粒度的权限控制策略

  • 支持多线程IO模型:1-5使用单线程模型,6之后使用多线程模型

缓存数据的分类:

  1. 实时同步数据:要求缓存中的数据必须与DB中的数据保持一致。只要DB中的数据发生了变更,缓存中的数据立即消失
  2. 阶段性同步数据:没有必要必须与DB中的数据保持一致。为缓存数据添加了生存时长属性

IO模型:Redis处理客户端请求所采用的处理架构

在3.0之前采用的时单线程模型

image-20240615124749422

单线程的速度可以达到8w-10w的qps。相较于多线程,单线程不需要考虑线程切换问题、不涉及线程安全问题。采用多路复用技术

常用的多路选择算法:select模型、poll模型、epoll模型。poll模型采用的时轮询算法,该模型对于客户端的就绪处理是有延迟的。epoll模型采用的是回调方式,根据就绪事件发生后的处理方式不同,可分为LT和ET模型。

混合模型:在Thread处增加了子线程

image-20240615125322392

多线程IO模型中的“多线程”仅用于接收、解析客户端的请求,然后将解析出的请求写入到任务队列。而对具体任务的处理,仍由主线程处理。这样用户无需考虑线程安全问题,无需考虑事务控制。

单线程

优点:可维护性高,性能高。不存在并发读写情况,所以不存在执行顺序的不确定性,不存在线程切换开销,不存在思索问题,不存在加锁/解锁造成的开销

缺点:性能会受到影响,且由于只能使用一个处理器,所以会造成浪费。

多线程

优点:结合了单线程与多线程的优点,避开了他们的不足。

缺点:并非一个真正的“多线程”,

redis配置文件

tcp-backlog是一个TCP链接的队列,其主要用于解决高并发场景下客户端慢连接问题。TCP中的backlog队列长度在linux中由内核参数somaxconn来决定。所以在redis中队列的长度由redis配置文件设置与somaxconn来共同决定,取其中的最小值。

生产环境下(高并发)backlog值最好要大一些,否则可能会影响系统性能。

服务器运行时修改配置文件
sysctl

三次握手是为了建立连接,四次挥手是为了断开连接。

image-20240617212600261 image-20240617212832529

modules是加载第三方资源的动态库

general

daemonize:

pidfile:该配置用于指定Redis运行时pid写入的文件,无论Redis是否采用守护进程方式启动,pid都会写入该配置的文件。如果没有配置pid文件,不同的启动方式会产生不同的pid效果。

  • 守护进程方式启动(后台启动):pid文件为/var/run/redis.pid
  • 前台启动(daemonize为no时):不产生pid文件

loglevel:配置日志的级别,由低到高四个级别:debug, verbose,notice,warning

logfile:指定日志文件,如果设置为空船,则强制将日志记录到标准输出设备(显示器)

databases:设置数据库数量

clients

该模块用于设置与客户端相关的属性,其中仅包含1个属性

maxclients:用于设置Redis可并发处理的客户端连接数量,默认值为10000.如果达到了最大连接数量,会拒绝新的连接并发送异常信息。该值不能超过linux系统支持的可打开的最大文件数量阈值。

memory management

可以控制最大可用内存及相关内容移除问题

maxmemory:将内存使用限制设置为指定的字节数。当达到内存限制时,Redis将根据选择的逐出策略maxmemory-policy尝试删除符合条件的key

maxmemory-policy:8种策略:volatile lru、allkeys-lru、volatile-lfu、allkeys-lfu、volatile-random、allkeys-random、volatile-ttl、noeviction

maxmemory-samples:该属性用于指定挑选要删除的key的样本数量。样本的选择采用的是LRU算法。其不能修改。但是从样本中再选择要移除的key,则采用的是maxmemory-policy指定的策略。

maxmemory-eviction-tenacity:设置移除容忍度。数值越小表示容忍度越低,需要移除的数据移除延迟越小。

Threaded IO

io-threads:该属性用于指定要启动多线程IO模型时,要使用的线程数量

查看当前系统中包含的CPU:lscpu

设置线程数量时不能占满,至少预留一个

io-threads-do-reads

Redis命令

基本命令
redis-cli:进入Redis
ping:测试Redis与客户端的连通性
set name zhangsan:设置值
get name:取值
slect 5:切换到5号数据库
dbsize:查看数据库大小
flushdb:删除当前数据库内容
flushall:删除所有数据库内容
quit和exit:退出
Key操作命令

Redis中存储的数据整体都是键值对key-value

keys *:查看所有的key值
key "*":
keys的速度非常快,但是再一个大的数据库中可能会阻塞服务器

exisits hello:是否存在一个key,名为hello。有的话返回1
del key:删除一个key
rename old_name new_name:重命名
move hello 3:将hello移到3号库
type key:查看key的类型
expire key seconds:设置生存时间
ttl key:查看剩余时间
persist key:持久化key
randomkey:随机返回一个key,用来判断一个数据库是不是空的

scan 0 count 3:指针从零开始检索,检索3条。会返回指针位置和检索结果
scan 0 count 3 match *a*:名称中有a
scan 0 count 3 match *a* type set:
使用间断的、负数、超出范围或其他非正常游标时,不会造成崩溃
hscan key:用来匹配hash类型中的key
sscan
zscan
String类型操作命令

最常用的命令,可以放任意的数值

set age ex seconds:为当前key设置过期时间,单位秒
setex age seconds:与上面的作用相同
set age px milliseconds:为当前key设置过期时间,单位毫秒
setpx age seconds:与上面的作用相同

set age 12 nx:指定的key不存在才会设置成功
setnx age value:与上面的作用相同
set age 23 xx:指定的key存在才会设置成功,用于更新指定key的value
setxx age value:与上面的作用相同
如果为key设置的value值带有空格,则需要加单引号或双引号
getset key value:先获取,再设置
mset k1 v1 k2 v2 k3 v3:同时设置多个
mget k1 k2 k3:同时获取多个
也可以有msetnx等等

append key value:追加值,相当于连接
incr age:自增
decr age:自减
incrby age 5:一次加5
incrbyfloat age 2.5:可以操作浮点数

strlen key:获取长度
getrange key start end:获取字串的长度
setrange key start value:替换字符串
对不存在的key当作空值处理

典型应用场景

  1. 数据缓存
  2. 计数器:有效访问客户端一次,或视频一次
  3. 共享Session:记录用户的登录信息,当在此提交收藏、支付等请求时就不需要再次登录
  4. 限速器:为了防止Dos(拒绝服务)攻击,会限制一个IP在一秒内访问不能超过n次。但是无法防止DDos(分布式拒绝服务)攻击
Hash类型操作命令

Hash类型也称为Hash表、字典等

Hash表就是一个map表

hmset employee name zhangsan age 23:创建hash类型的值
hmget employee name age:获取hash类型的值
hgetall employee:获取所有的hash键和值
hkeys employee::获取所有的值
hsetnx employee name list
hdel employee weight:删除employee中的weight
hincrby employee weight 3:加3
hincrbyfloat employee  weight 0.3:加0.3
hstrlen employee weight:weight的长度
hlen employee:employee的长度

应用场景

非常适合存储对象数据,key作为对象名称

List类型操作命令

(l)头在左侧,(r)尾在右侧

lpush names zs ls ww zl
Set类型操作命令

Hash类型操作命令

Hash类型也称为Hash表、字典等

Hash表就是一个map表

hmset employee name zhangsan age 23:创建hash类型的值
hmget employee name age:获取hash类型的值
hgetall employee:获取所有的hash键和值
hkeys employee::获取所有的值
hsetnx employee name list
hdel employee weight:删除employee中的weight
hincrby employee weight 3:加3
hincrbyfloat employee  weight 0.3:加0.3
hstrlen employee weight:weight的长度
hlen employee:employee的长度

应用场景

非常适合存储对象数据,key作为对象名称

List类型操作命令

(l)头在左侧,(r)尾在右侧

lpush names zs ls ww zl
Set类型操作命令
ZSet类型操作命令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值