目录
昨日总结
- 米粒商城项目(在docker部署了mysql、redis),docker学习,学习函数式编程(完结)
- cv(停滞中)
- 小林coding--MySQL面试篇(1/7)
- 码随想录——二叉所搜树的最小绝对差
今日计划
- JVM底层原理学习,米粒商城项目ing
- cv(停滞中)
- 小林coding--MySQL面试篇(2/7)
算法——二叉所搜树的最小绝对差
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 :
输入:root = [4,2,6,1,3] 输出:1
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
int min,last;
public int getMinimumDifference(TreeNode root) {
min = Integer.MAX_VALUE;
last = -100000;
dg(root);
return min;
}
public void dg(TreeNode root) {
if(root == null)
return;
dg(root.left);
min = Math.min(min, root.val - last);
last = root.val;
dg(root.right);
}
}
Docker
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题。如下
Docker解决的问题
1.依赖关系复杂,容易出现兼容性问题
- Docker将应用的函数库(Libs)、依赖(Deps配置和应用一起打包
- Docker将每个应用放到一个隔离容器(沙箱)去运行,避免互相干扰
2.开发、测试生产环境都有差异
- Docker将用户程序与所需要调用的系统函数库一起打包
- Docker运行到不同OS时,直接基于打包的库函数,借助于OS的Linux内核来运行
Docker和虚拟机的差异
- Docker是一个系统进程;虚拟机是在OS中的操作系统
- docker体积小、启动速度快、性能好;虚拟机体积大,启动速度慢,性能一般
镜像和容器
镜像:Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。(只读)
容器:镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
Docker架构
Docker是一个CS架构的程序,由两部分组成
- 服务端:DOcker守护进程,负责处理DOcker指令,管理镜像、容器等
- 客户端:通过命令向Docker服务端发送指令
DockerHub
一个镜像托管的服务器,类似的还有阿里云镜像服务
镜像操作命令

拉取镜像去Docker镜像网站
hub.docker.com
容器相关命令

自定义镜像
镜像是分层结构,每一层称为一个layer
- BaseImage层:包含基本的系统函数库、环境变量、文件系统
- Entrypoint:入口,是镜像中应用启动的命令
- 其他:在BaseImage基础上添加依赖、安装程序、完成整个应用的安装和配置
DockerCompose
基于Compose文件来快速的部署分布式应用,无需手动一个个创建和运行容器。
Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行
昨日八股答案
- 数据库三大范式
第一范式:原子性。要求数据表的每一列都是不可分割的原子数据项。
第二范式:完全依赖。在一范式的基础上消除非主属性对主码的部分函数依赖。需要确保数据表中的每一列都与主键相关,而不能只与主键的某一部分相关。
第三范式:消除传递依赖。在二范式的基础上,任何非主属性不依赖与其他主属性。确保数据表中的每一列数据都和主键注解相关,而不能间接相关。
- MySQL的连表查询
- 内连接:返回两个表中有匹配关系的行。
selete employees.name , departments.name
from employees inner join departments
on employees.department_id = departments.id
返回员工和所在部门的名称
2. 左外连接:返回左表中的所有行,及时在右表中没有匹配的行
selete employees.name , depatrments.name
from employees
left join departments
on employees.department_id = department.id
查询所有员工(包括没有分配部门的员工)及其部门名称
3.右外连接(与左外类似)
4.全外连接
selete employees.name , departments.name
from employees
left join departments
on employees.deprtment_id = department.id
union
selete employees.name , departments.name
from employees
right join departments
on employees.deprtment_id = department.id
- 如何避免重复插入数据
- 使用unique约束,在创建表的时候在相关列上添加unique约束,确保每个值的唯一性
- 使用insert ... on duplicate key update.这种语句在插入记录时,如果与现有的记录冲突,会选择更新现有记录
- 使用insert ignore:该语句会在插入记录时忽略因重复建而导致的插入错误
- char和varchar的区别
- char是固定长度的字符串类型,存储时会在末尾补足空格。
- varchar是可变长度的字符串类型,定义时需要指定最大长度
今日八股
- MySQl的关键字in和exist
- mysql的基本函数
- SQL查询语句的执行顺序
- 如何用MySQL实现一个可重入的锁