面试题整理2

文章目录

  • 前言
  • 1.Redis数据结构及其使用场景
  • 2.Redis缓存穿透、击穿、雪崩如何发生及解决方案
  • 3.SpringBoot启动类注解的底层实现原理
  • 4.docker常用命令
  • 5.Linux常用命令
  • 6.Java线程实现的几种方式
  • 7.Mybatis框架中#{}和${}的区别
  • 8.MySQL常见索引和区别
  • 9.乐观锁怎么实现
  • 10.SpringCloud组件
  • 11.负载均衡的作用
  • 12.并行和并发的区别
  • 13.HashMap和Hashtable的区别
  • 14.Runnable和Callable的区别
  • 15.Spring自动注入
  • 16.@Autowired和@Resource的区别
  • 17.SpringMVC执行流程
  • 18.Java中的异常处理
  • 19.Spring异常处理
  • 20.Spring框架中的常用类


前言

本文为朋友2024年一次实习面试试题记录,很多都是基础八股文。


1.Redis数据结构及其使用场景

Redis支持5种数据类型作为其value,Redis的key都是字符串类型的。

  1. string:Redis中字符串value最大可为512M。可以用来做一些计数功能的缓存(也是实际工作中最常见的)。
  2. list:简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边),其底层实现是一个链表。可以实现一个简单消息队列功能,做基于Redis的分页功能等。
  3. set:是一个字符串类型的无序集合,可以用来进行全局去重等。
  4. sorted set:是一个字符串类型的有序集合,给每一个元素一个固定的分数score来保持排序。可以用来做排行榜应用或者进行范围查找等。
  5. hash:键值对集合,是一个字符串类型的key和value的映射表,也就是说其存储的value是一个键值对(key-value),可以用来存放一些具有特定结构的信息

其实,Redis还支持三种特殊的数据类型,分别是BitMap、Geo和HyperLogLog。一般情况下,可以认为Redis的支持的数据类型有上述5种。其底层数据结构包括:简单动态字符串、链表、字典、跳表、整数集合以及压缩列表。


2.Redis缓存穿透、击穿、雪崩如何发生及解决方案

  1. 缓存雪崩:在高并发下,大量的缓存key在同一时间失效,导致大量请求落到数据库上,如活动系统里面同时进行这非常多的活动,但在某个时间点所有的活动缓存全部过期。
    解决方案:
    缓存数据的过期时间设置随机,防止同一时间大量数据过期现象的发生。
    ②如果缓存数据库是分布式部署,将热点数据均匀分布在不同高的缓存数据库中
    设置热点数据永远不过期
  2. 缓存穿透:访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。
    解决方案:
    接口增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截。
    ②从缓存取不到的数据,在数据库中也没有取到,这时可以将key-value对写为key-null,缓存有效时间可以设置短点,如30s。这样可以防止攻击用户反复用同一个id暴力攻击。
  3. 缓存击穿:一个存在的key,在缓存过期的那一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。
    解决方案:
    设置热点数据永远不过期
    加互斥锁:简单来说,就是在缓存失效的时候(判断拿出来的值是否为空),不是立即去加载数据库,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis 的 SETNX)去set一个mutex key,当操作返回成功时,再进行加载数据库的操作并回设缓存;否则,就重试整个get缓存方法。

3.SpringBoot启动类注解的底层实现原理

来源:Spring Boot 原理解析


4.docker常用命令

来源:docker常用命令大全

  1. 基础命令

启动docker:systemctl start docker
关闭docker:systemctl stop docker
重启docker:systemctl restart docker
docker设置随服务启动而自启动:systemctl enable docker
查看docker 运行状态(如果是在运行中 输入命令后 会看到绿色的active):systemctl status docker
查看docker 版本号信息:docker versiondocker info
帮助命令:docker --help

  1. 镜像命令

查看自己服务器中docker 镜像列表:docker images
搜索镜像:docker search 镜像名如:docker search --filter=STARS=9000 mysql 搜索 STARS >9000的 mysql 镜像
拉取镜像 不加tag(版本号) 即拉取docker仓库中 该镜像的最新版本latest 加:tag 则是拉取指定版本:docker pull 镜像名 docker pull 镜像名:tag
运行镜像:docker run 镜像名docker run 镜像名:Tag
删除镜像:

  • #删除一个: docker rmi -f 镜像名/镜像ID
  • #删除多个 其镜像ID或镜像用用空格隔开即可:docker rmi -f 镜像名/镜像ID 镜像名/镜像ID 镜像名/镜像ID
  • #删除全部镜像 -a 意思为显示全部, -q 意思为只显示ID:docker rmi -f $(docker images -aq)

强制删除镜像:docker image rm 镜像名称/镜像ID
保存镜像:docker save 镜像名/镜像ID -o 镜像保存在哪个位置与名字
加载镜像:docker load -i 镜像保存文件位置

  1. 容器命令

查看正在运行容器列表:docker ps
查看所有容器:docker ps -a
运行一个容器:# -it 表示 与容器进行交互式启动 -d 表示可后台运行容器 (守护式运行) --name 给要运行的容器 起的名字 /bin/bash 交互路径:docker run -it -d --name 要取的别名 镜像名:Tag /bin/bash
查看容器日志:docker logs -f --tail=要查看末尾多少行 默认all 容器ID

  1. 运维命令

查看docker工作目录:sudo docker info | grep "Docker Root Dir"
查看docker磁盘占用总体情况:du -hs /var/lib/docker/


5.Linux常用命令

  1. grep:Global Regular Expression Print,可以使用正则表达式搜索文本,并把匹配的行打印出来。

示例:查找文件file.log中“password”字段,并且统计出现的次数:
grep "password" file.log|wc -| 或者 grep "password" file.log -c

  1. awk:将一行分为多个字段做处理。

示例1:去掉第一列
awk -F "," '{print $2, $3}' test.txt
示例2:对第一列求和
awk '{a+$1}END{print a}' test.txt
示例3:去掉列数不为3的列
awk -F "," '{if(NF == 3){print $0}}' test.txt

  1. ps:默认只会显示运行在当前控制台下的属于当前用户的进程。

显示所有进程
ps -Aps -e
显示完整格式的所有进程
ps -ef
指定进程名,找出进程名中包括java的所有进程
ps -ef | grep 'java'

  1. top:实时监测进程,输出的第一部分显示系统的概括。

pstop命令的区别:

  • ps看到的是命令执行瞬间的进程信息,而top可以持续监视
  • ps只是查看进程,而top还可以监视系统性能,如平均负载、CPU和内存的消耗
  • top可以操作进程,如改变优先级(命令r)和关闭进程(命令k)
  • ps主要是查看进程的,关注点在于查看需要查看的进程
  • top主要看CPU,内存使用情况即占用资源最多的进程由高到低排序,关注点在于资源占用情况。
  1. sed:利用脚本处理文本文件。可以依照脚本的指令来处理、编辑文本文件。sed主要用来自动编辑一个或者多个文件、简化对文件的反复操作、编写转换程序等。

可以将文件的第二行和第三行裁剪出来
sed -n '2,3p' test.txt

  1. sort:对文本文件进行排序

正序排序
sort -n test.txt
反序排序
sort -nr test.txt

  1. tailhead命令

查看文件的最后2行
tail -n 2 file.log
实时查看文件的后边追加的部分
tail -f file.log
查看文件的开始2行
head -n 2 file.log


6.Java线程实现的几种方式

我这边列举了三种,更详细的介绍请参考:【Java】详细介绍Java实现线程的四种方式

  1. 继承自 Thread类:通过继承 Thread 类,可以创建⼀个新的线程。为了实现线程的执⾏逻辑,需要重写 run() 方法。
  2. 实现 Runnable接口
  3. 使用 Executor 框架:Executor 框架是 Java 并发编程中的高级工具,它提供了⼀种更为灵活的方式来管理和执⾏线程。通过 Executor ,可以将任务提交给线程池,由线程池来管理线程的⽣命周期和执行。

7.Mybatis框架中#{}和${}的区别

MyBatis中能用#就尽量不要使用$符号,它们的区别主要体现在以下几点:

  1. #将传入的数据都当做一个字符串,会对自动传入的数据加一个双引号
  2. $符号将传入的数据直接显示在生成的SQL语句中
  3. #存在预编译的过程,对问号赋值,防止SQL注入
  4. $符号是直译的方式,一般用在order by ${列名} 语句中

8.MySQL常见索引和区别

来源:MySQL常见索引和区别
MySQL索引常见的分类包括:普通索引、唯一索引、主键索引、全文索引等。

  1. 普通索引:普通索引是最基本的索引类型,不包含任何约束和限制条件。仅仅是为了提高查询速度而建立的索引。当我们使用 WHERE 字句进行搜索时,MySQL 会使用普通索引来定位符合条件的行。如果查询条件使用到了索引字段,那么 MySQL 可以更快速地定位所需的数据。普通索引可以在字符型、数字型、日期型等各种基本数据类型上创建。
  2. 唯一索引:唯一索引与普通索引相同,也是为了提高查询速度而建立的索引。唯一索引不允许其字段中出现重复的值,因此,唯一索引可以用于任何必须具有唯一性的字段上。MySQL 在执行 INSERT 和 UPDATE 操作时,会对唯一索引进行检测以确保其值的唯一性。
  3. 主键索引:主键索引是一种特殊的唯一索引,它具有唯一性约束,但是,主键索引要求所有索引列都不为空,即设置了 NOT NULL 约束。主键索引也是最常用的索引类型,主键索引可以单独一列或多列组成。
  4. 全文索引:全文索引是 MySQL 中针对文本类型数据(如文本、字符型、甚至二进制类型数据)的特殊索引。它可以帮助我们更快地查询到数据,主要用于诸如文章、博客、评论、产品描述等等文本信息的快速匹配。全文索引支持中文分词,并且可以确定文本中关键词合适的位置,从而快速定位相关文本。

9.乐观锁怎么实现

乐观锁就是对数据冲突保持乐观点态度,认为不会有其他线程同时修改数据。因此乐观锁不会上锁,只是在更新数据都时候判断是否有其他线程更新,如果没有其他线程修改则更新数据,有其他线程修改则放弃数据,重新读取数据处理。Java中的乐观锁主要有两种实现方式:CAS(Compare and Swap)和版本号控制。乐观态度+数据更新)

  1. CAS: CAS是实现乐观锁的核心算法,它通过比较内存中的值是否和预期的值相等来判断是否存在冲突。如果存在,则返回失败;如果不存在,则执行更新操作。CAS 它包含了 3 个参数:V(需要更新的变量)、E(预期值)和 N(最新值)。只有当需要更新的变量等于预期值时,需要更新的变量才会被设置为最新值,如果更新值和预期值不同,则说明已经有其它线程更新了需要更新的变量,此时当前线程不做操作,返回 V 的真实值。
  2. 版本号控制:版本号控制是乐观锁的另一种实现方式。每当一个线程要修改数据时,都会先读取当前的版本号或时间戳,并将其保存下来。线程完成修改后,会再次读取当前的版本号或时间戳,如果发现已经变化,则说明有其他线程对数据进行了修改,此时需要回滚并重试。

10.SpringCloud组件

  1. 服务发现——Netflix Eureka
  2. 客服端负载均衡——Netflix Ribbon
  3. 断路器——Netflix Hystrix
  4. 服务网关——Netflix Zuul
  5. 分布式配置——Spring Cloud Config

11.负载均衡的作用

  1. 当集群里的1台或者多台服务器down的时候,剩余的没有down的服务器可以保证服务的继续使用
  2. 使⽤了更多的机器保证了机器的良性使用,不会由于某一高峰时刻导致系统cpu急剧上升

12.并行和并发的区别

  1. 并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
  2. 并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。
  3. 并行是在一台处理器上“同时”处理多个任务,并发是在多台处理器上同时处理多个任务,并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。

13.HashMap和Hashtable的区别

  1. HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的
  2. HashMap允许null作为key;Hashtable不允许null作为key,Hashtable的value也不允许为null

14.Runnable和Callable的区别

来源:runnable 和 callable 有什么区别?

  1. 方法不同
    Runnable接口只有一个run()方法,该方法不返回任何值,因此无法抛出任何checked Exception。
    Callable接口则有一个call()方法,它可以返回一个值,并且可以抛出一个checked Exception。
  2. 返回值不同
    Runnable的run()方法没有返回值,只是一个void类型的方法。
    Callable的call()方法却必须有一个返回值,并且返回值的类型可以通过泛型进行指定。
  3. 异常处理不同
    在Runnable中,我们无法对run()方法抛出的异常进行任何处理。
    但在Callable中,自定义的call()方法可以抛出一个checked Exception,并由其执行者Handler进行捕获并处理。
  4. 使用场景不同
    Runnable适用于那些不需要返回值,且不会抛出checked Exception的情况,比如简单的打印输出或者修改一些共享的变量。
    Callable适用于那些需要返回值或者需要抛出checked Exception的情况,比如对某个任务的计算结果进行处理,或者需要进行网络或IO操作等。在Java中,常常使用Callable来实现异步任务的处理,以提高系统的吞吐量和响应速度。

15.Spring自动注入

详情查看:Spring自动注入

  1. 在 Spring 配置文件中对象名和 ref=”id”id 名相同使用自动注入,可以不配置
  2. 两种配置办法
    ① 在中通过 autowire=”” 配置,只对这个生效
    ②在中通过 default-autowire=””配置,表当当前文件中所有都是全局配置内容
    ③autowire=”” 可取值
      no: 不自动注入
      byName: 通过名称自动注入.在 Spring 容器中找类的 Id
      byType: 根据类型注入 注意这里如果有两个相同的注入类型会报错 
      constructor: 根据构造方法注入

16.@Autowired和@Resource的区别

来源:【最详细】@Autowired 和 @Resource 的区别

  1. @Autowired 是spring提供的注解,@Resource 是JDK提供的注解
  2. @Autowired 默认的注入方式是ByType(根据类型进行匹配),@Resource 默认的注入方式是 ByName (根据名称进行匹配)
  3. 当一个接口存在多个实现类的情况下,@Autowired 和 @Resource都需要通过名称才能匹配到对应Bean。@Autowired可以通过@Qualifier来显示指定的名称,@Resource 可以通过name来显示指定名称

17.SpringMVC执行流程

来源:SpringMVC执行流程

SpringMVC执行流程:

  1. 用户发送请求至前端控制器DispatcherServlet;
  2. DispatcherServlet收到请求调用处理器映射器HandlerMapping;
  3. 处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet;
  4. DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作
  5. 执行处理器Handler(Controller,也叫页面控制器);
  6. Handler执行完成返回ModelAndView;
  7. HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewReslover视图解析器;
  9. ViewReslover解析后返回具体View;
  10. DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中);
  11. DispatcherServlet响应用户。

18.Java中的异常处理

主要是try-catch-finally和throw、throws关键字。
异常都是派生于Throwable类的一个实例,这个实例可以由JVM产生,也可以再程序中手动创建,用throw手动抛出。throw的对象必须是派生于Throwable类的实例,其他类型无法通过编译。受检异常只有两种选择:要么被捕获处理,要么抛出让调用者处理。而非受检异常没有此强制要求。

  1. throws是用来声明异常,只要是派生于Throwable类的都可以被声明。
  2. try-catch-finally用来捕获异常。
    所有派生于Throwable类都可以通过 catch 捕获,try 中放可能存在异常的方法,如果在 try语句块中的任何代码抛出了⼀个在 catch 子句中说明的异常类,那么程序将跳过 try 语句块的其余代码,并且执行 catch 子句中的处理器代码。如果在 try 语句块中的代码没有拋出任何异常,那么程序将跳过 catch 子句,如果方法中的任何代码拋出了⼀个在 catch 子句中没有声明的异常类型,那么这个方法就会立刻退出。在⼀个 try 语句块中可以捕获多个异常类型,并对不同类型的异常做出不同的处理。可以为每个异常类型使用一个单独的 catch 子句。需要注意,如果多个catch中的异常非继承关系,那么catch顺序不影响结果,如果catch异常存在类继承关系,那么⼦类的catch应该放在前面,父类的在后面。
  3. finally⼀般⽤来关闭所占用的资源。如果代码抛出异常,就会终止剩余代码的处理,并且退出这个方法。这样可能会导致⼀些程序占用的系统并不能被正确的释放。而不管是否有异常被捕获,finally中子句的代码都会被执行,可以在这里正确的释放资源。

19.Spring异常处理

来源:Spring 异常处理

  1. 简单的可以通过抛出特定异常,Spring 会自动转换为对应的 HTTP 状态码,或者自定义异常,添加对应状态码注解
  2. 在同一个文件中编写异常处理器,单独写一个方法,添加 @ExceptionHandler(XXXException.class) 注解
  3. 单独编写一个统一异常处理类
  4. 对于 Rest 等方式中的异常,可以在异常处理方法上面添加 @ResponseStatus、@ResponseBody 注解
  5. 更复杂的情况可以通过返回 ResponseEntity 解决

20.Spring框架中的常用类

来源:spring框架常用的类有哪些
ApplicationContext: 用来管理bean的配置文件并创建bean
BeanFactory: 为创建和管理bean提供基本服务
Configuration: 使用Java配置类来配置bean
Autowired: 用来自动装配bean
Component: 用来标记组件类
Service: 用来标记业务层组件
Repository: 用来标记数据访问层组件
Controller: 用来标记控制层组件
RestController: 用来标记RESTful风格的控制层组件
RequestMapping: 用来处理请求映射
RequestBody: 用来处理请求体
ResponseBody: 用来处理响应体
AOP:用来提供面向切面编程(AOP)的功能


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/701420.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

合并报表系统

系统是由一系列不同机能的部件&#xff0c;经过有机组合以后完成特定功能&#xff0c;具有独特特性的产品 对于合并报表系统&#xff0c;其功能就是合并报表&#xff0c;那拆分下&#xff0c;合并报表需要什么组件呢 1.数据集成&#xff0c;合并是把一系列分子公司数据集成到…

React18源码: Fiber树中的优先级与帧栈模型

优先级{#lanes} 在全局变量中有不少变量都以Lanes命名 如workInProgressRootRenderLanes, subtreeRenderLanes其作用见上文注释它们都与优先级相关 React中有3套优先级体系&#xff0c;并了解了它们之间的关联关系现在来看下fiber树构造过程中&#xff0c;车道模型Lane的具体应…

18个惊艳的可视化大屏(第六辑):地图焦点

本期带来的都是以地图作为视觉焦点的可视化大屏页面。

动态规划课堂1-----斐波那契数列模型

目录 动态规划的概念&#xff1a; 动态规划的解法流程&#xff1a; 题目: 第 N 个泰波那契数 解法&#xff08;动态规划&#xff09; 代码&#xff1a; 优化&#xff1a; 题目&#xff1a;最小花费爬楼梯 解法&#xff08;动态规划&#xff09; 解法1&#xff1a; 解…

独立站建站全攻略:从0到1打造专属在线商业平台

独立站建站全攻略&#xff1a;从0到1打造专属在线商业平台 随着互联网的普及和发展&#xff0c;越来越多的企业和个人开始认识到拥有一个独立站的重要性。独立站不仅可以提升品牌形象&#xff0c;还能为企业带来更多的流量和潜在客户。本文将为大家详细介绍独立站建站的全过程…

如何实现不同 Vue 项目的 npm 和 Node.js 环境进行隔离

方法一&#xff1a;使用 nvm&#xff08;Node Version Manager&#xff09; nvm 是一个用于管理多个 Node.js 版本的工具。通过 nvm&#xff0c;你可以为每个 Vue 项目安装和使用不同版本的 Node.js 和 npm。首先&#xff0c;安装 nvm&#xff1a;对于 macOS 和 Linux&#xf…

【深度学习笔记】卷积神经网络——汇聚层(池化层)

汇聚层&#xff08;池化层&#xff09; 通常当我们处理图像时&#xff0c;我们希望逐渐降低隐藏表示的空间分辨率、聚集信息&#xff0c;这样随着我们在神经网络中层叠的上升&#xff0c;每个神经元对其敏感的感受野&#xff08;输入&#xff09;就越大。 而我们的机器学习任…

VsCode的leetcode插件无法登录

前提 想使用VsCode的leetcode插件进行刷题&#xff0c;然后按照网上的教程进行安装下载&#xff0c;但是到了登录这一步&#xff0c;死活也登录不了&#xff0c;然后查看log一直报的错误是invalid password。 解决方法 首先确定在插件中设置的站点是Leetcode中国&#xff0c…

图像处理新框架 | 语义与复原指令双引擎,谷歌研究院提出文本驱动图像处理框架TIP

本文首发: AIWalker 欢迎关注AIWalker&#xff0c;底层视觉与基础AI技术 https://arxiv.org/abs/2312.14091 https://github.com/Picsart-AI-Research/HD-Painter 基于文本到图像扩散模型的空前成功&#xff0c;文本引导图像修复的最新进展已经可以生成非常逼真和视觉上合理的结…

C++面试:linux系统性能监控命令的使用

目录 1. top 2. vmstat 3. iostat 4. mpstat 5. netstat 6. sar 7. htop 8. dstat 9. free 10. lsof 11. pidstat 12. nmon 13. iftop 14. glances 面试准备小贴士 在Linux系统管理和故障排查中&#xff0c;使用性能监控工具是非常重要的。这些工具可以帮助你理…

centos7部署单机项目和自启动

centos7部署单机项目和服务器自启动 1.安装jdk和tomact1.1上传jdk、tomcat安装包1.2解压两个工具包1.3.配置并且测试jdk安装1.4.启动tomcat1.5.防火墙设置1.6配置tomcat自启动 2.安装mysql2.1卸载mariadb&#xff0c;否则安装MySql会出现冲突(先查看后删除再查看)2.2在线下载My…

【爬虫逆向实战篇】定位加密参数、断点调试与JS代码分析

文章目录 1. 写在前面2. 确认加密参数3. 加密参数定位4. XHR断点调试 【作者主页】&#xff1a;吴秋霖 【作者介绍】&#xff1a;Python领域优质创作者、阿里云博客专家、华为云享专家。长期致力于Python与爬虫领域研究与开发工作&#xff01; 【作者推荐】&#xff1a;对JS逆向…

python-分享篇-用python制作九宫格切图器

文章目录 代码效果 代码 import tkinter as tk from PIL import Image,ImageTk import sys import tkinter.filedialog#先将图片填充为正方形 def fill_image(image): width, height image.size #比较图片的宽和高&#xff0c;选取值较大的作为新图的宽 newImage_width wid…

仿12306校招项目-项目业务和架构

目录 业务图 用户管理 业务难点 1. 如何确定用户注册信息的真实性 2. 面对亿级用户量 3. 支持多种登录方式会造成读请求扩散&#xff0c;需要解决用户定位问题 4. 高并发场景下缓存穿透问题需要有效解决&#xff0c;避免数据库压力过大 5. 明文存储用户敏感信息会造成安…

抽象的java

Consider defining a bean of type org.springframework.mail.MailSender in your configuration. 报错原因&#xff1a; 第一个&#xff1a;未安装对应的依赖 第二个&#xff1a;对应配置问题 背景&#xff1a;用springboot-java完成邮箱发送 第一个问题解决方法&#xff1…

实战一个 Jenkins 构建 CI/CD流水线 的简单配置过程哈

引言&#xff1a;上一期我们讲述了gitlabCI/CD工具的介绍&#xff0c;工具之争&#xff0c;本期我们介绍Jenkins CI/CD 目录 一、Jenkins介绍 1、Jenkins概念 2、Jenkins目的 3、特性 4、产品发布流程 二、安装Jenkins 1、安装JDK 2、安装Jenkins 1、上传压缩包 2、…

Spark之【数据倾斜】

Spark程序运行变慢&#xff0c;十有八九出现了数据倾斜。那么什么是数据倾斜、导致数据倾斜的原因以及如何克服它以保持Spark应用程序的最佳性能呢&#xff1f; 什么是数据倾斜&#xff1f; Apache Spark中的数据倾斜指的是&#xff0c;在处理的数据其在不同分区之间分布不均…

基于django的购物商城系统

摘要 本文介绍了基于Django框架开发的购物商城系统。随着电子商务的兴起&#xff0c;购物商城系统成为了许多企业和个人创业者的首选。Django作为一个高效、稳定且易于扩展的Python web框架&#xff0c;为开发者提供了便捷的开发环境和丰富的功能模块&#xff0c;使得开发购物商…

spring security 防止已经完成认证的会话再次访问login页面

版本 spring-security:6.2.1 方案 添加过滤器检查会话认证信息&#xff0c;如果包含非匿名用户的认证信息则调用认证成功处理器 final static String URL_LOGIN "/login"; final AuthenticationSuccessHandler authenticationSuccessHandler new SavedRequestA…

GEE入门篇|遥感专业术语(实践操作3):时间分辨率(Temporal Resolution)

目录 时间分辨率&#xff08;Temporal Resolution&#xff09; 1.Landsat 2.Sentinel-2 时间分辨率&#xff08;Temporal Resolution&#xff09; 时间分辨率是指特定传感器图像流的重访时间或时间节奏&#xff0c;重访时间是指卫星连续访问地球表面同一位置…