SoapEye

SoapEye 查看完整档案

南京编辑青岛理工大学  |  计算机 编辑Soap  |  Eye 编辑 www.soapeye.top 编辑
编辑

历史就是历史,它是客观存在的。

个人动态

SoapEye 发布了文章 · 2020-03-24

Docker

Docker

Docker: 开源的容器虚拟化平台

Docker Hub: 用于分享、管理 Docker 容器的 Docker SaaS 平台
Docker 使用客户端-服务器 (C/S) 架构模式。Docker 客户端会与 Docker 守护进程进行通信。Docker 守护进程会处理复杂繁重的任务,例如建立、运行、发布你的 Docker 容器。Docker 客户端和守护进程可以运行在同一个系统上,当然你也可以使用 Docker 客户端去连接一个远程的 Docker 守护进程。Docker 客户端和守护进程之间通过 socket 或者 RESTful API 进行通信。
Docker守护进程:运行在一台主机上。用户并不直接和守护进程进行交互,而是通过 Docker 客户端间接和其通信。
Docker 客户端:实际上是 docker 的二进制程序,是主要的用户与 Docker 交互方式。它接收用户指令并且与背后的 Docker 守护进程通信,如此来回往复。
Docker 内部

要理解 Docker 内部构建,需要理解以下三种部件:

  • Docker 镜像 - Docker images
  • Docker 仓库 - Docker registeries
  • Docker 容器 - Docker containers
Docker 镜像
       Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。
UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。
当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新 的层被添加或升级了。
现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。

Docker 仓库
       Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。
      这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。

Docker 容器
      Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。
      每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
Docker使用场景

docker为了解决:

1、软件更新发布及部署低效,过程繁琐且需要人工介入   
2、环境一致性难以保证   
3、不同环境之间迁移成本太高

docker的使用场景:

1. 本地依赖(Local Dependency)
2. 搭建环境(Build Environment)
3. 微服务(Microservices)
4. 自动测试(Automated testing)
5. 部署过程(Deployment process)
6. 持续部署(Continuous Deployment)
7. 扩容 QPS(Scaling QPS)
Docker生态概览

em..

Docker安装

查看原文

赞 0 收藏 0 评论 0

SoapEye 发布了文章 · 2020-03-24

Linux

Linux概览

一:Linux学习路径

  1. 第一个坡:抛弃旧的思维习惯,熟练使用 Linux 命令行.《鸟哥的 Linux 私房菜》《Linux 系统管理技术手册
  2. 第二个坡:通过系统调用或者 glibc,学会自己进行程序设计.《UNIX 环境高级编程》
  3. 了解 Linux 内核机制,反复研习重点突破.《深入理解 LINUX 内核
  4. 第四坡:阅读 Linux 内核代码,聚焦核心逻辑和场景.《LINUX 内核源代码情景分析
  5. 第五坡:实验定制化 Linux 组件,成为内核开发工程师.
  6. 最后一坡:面向真实场景的开发,实践开发.

二:内核体系结构

xit.jpg

三:各系统模块简析

1.进程管理

创建进程的系统调用叫fork.中文叫"分支".创建进程fork.
在 Linux 里,要创建一个新的进程,需要一个老的进程调用 fork 来实现,其中老的进程叫作父进程,新的进程叫作子进程
运行新二进制文件execve,等待子进程结束waitpid.

2.内存管理

放程序代码的这部分,称为代码段(Code Segment)
放进程运行中产生数据的这部分,称为数据段(Data Segment)。

3.文件管理

  • 对于已经有的文件,可以使用open打开这个文件,close关闭这个文件;
  • 对于没有的文件,可以使用creat创建文件;
  • 打开文件以后,可以使用lseek跳到文件的某个位置;
  • 可以对文件的内容进行读写,读的系统调用是read,写是write。

4.信号处理

发送信号kill,信号处理sigaction

  • 在执行一个程序的时候,在键盘输入“CTRL+C”,这就是中断的信号,正在执行的命令就会中止退出;
  • 如果非法访问内存,例如你跑到别人的会议室,可能会看到不该看的东西;
  • 硬件故障,设备出了问题,当然要通知项目组;
  • 用户进程通过kill函数,将一个用户信号发送给另一个进程。

5.进程间通信

信号量的机制Semaphore
消息队列:创建队列msgget,发送消息msgsnd,接收消息msgrcv
共享内存:创建共享内存shmget,将共享内存映射到内存空间shmat.
信号量:抢占信号量sem_wait,释放信号量sem_post

6.网络通信

创建套接字socket 绑定端口bind 发起连接connect 接收连接accept 监听listen

查看原文

赞 0 收藏 0 评论 0

SoapEye 发布了文章 · 2020-03-22

Java

Java概览

环境搭建和工具的使用
  1. 下载安装JDK且检测安装是否成功.
  2. 系统环境变量–>环境变量–>新建环境变量,JAVA_HOME,请注意 :选择自己安装jdk的路径.
  3. 新建环境变量: CLASSPATH,变量值:.;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar; 请注意:_._是当前路径,不要省略。
  4. 新建环境变量,点击path: %JAVA_HOME%bin %JAVA_HOME%jrebin
  5. 在cmd中输入java –version 查看安装是否成功.
  6. IDE:选IntelliJ IDEA,在果壳破壳下载破解版.直接运行.

7.

基础

面向对象编程

异常处理

常用的工具类和新语法

线程

实战

查看原文

赞 0 收藏 0 评论 0

SoapEye 发布了文章 · 2020-03-22

后端_服务器_Nginx

Nginx


概览

主流服务器:Nginx,Apache,Tomcat.
初始Nginx,Nginx架构基础,详解HTTP模块,反向代理与负载均衡,Nginx的系统层性能优化,从源码视角深入使用Ngixn和OpenResty.
Nginx的主要应用场景:
Nginx应用场景.png
Nginx的出现:
互联网数据快速增长,全球化,性能提升,抵消的Apache,一个进程只能服务一个连接.
Nginx的优点:
高并发,高性能,可扩展性好(模块化设计,生态圈非常丰富),高可靠性(可以运行很长时间一年等不重启),热部署(可以不停止服务下升级nginx),BSD许可证(开源,免费).

Nginx的组成:

  1. Nginx二进制可执行文件:由各模块源码编译出的一个文件.
  2. Nginx.conf:控制Nginx的行为.
  3. access.log访问日志:记录每一天http请求信息.
  4. error.log错误日志:定位问题.

Nginx的发行版本:
官网版本:单数版号是主干版本,相对不稳定.双数版本号是稳定版本,相对稳定.
官网商业版本,阿里巴巴的Tengine, 免费版本OpenResty与商业版本的OpenResty.

编辑Nginx

下载nginx,介绍各目录.configure,中间文件介绍,编译,安装.

  1. 官网download,复制稳定版本连接,在linux中$wget http://nginx.org/download/ngi...
  2. $tar -xzf nginx.1.16.1.tar.gz 再$cd nginx.1.16.1
  3. 目录介绍:
auto
   cc:用于编译.
   lib
   os
   types
CHANGES:nginx每个版本提供的特性.
CHANGES.ru:CHANGES的俄文版本
conf:示例文件(?)
configure:生成中间文件,进行编译的准备.
contrib:提供两个脚本,
html:提供两个标准html文件,50x.html和index.html
man:帮助文件
src:nginx源代码.
   --with是默认不会编译到nginx.
   --without是默认编译到ngixn.

4.指定安装目录./configure --prefix=/home/soapeye/nginx
c compiler cc is not found,安装nginx提示的错误:yum -y install wget
5.Nginx配置语法

1.配置文件由指令与指令块构成.
2.每条指令以;分号结尾,指令与参数间以空格符分隔.
3.指令块以{}大括号将多条指令组织在一起.
4.include语句允许组合多个配置文件以提升可维护性.
5.使用$符合使用变量.
6.使用#符号添加注释,提高可读性.
7.部分指令的参数支持正则表达式.
配置参数:ms毫秒,s秒,m分钟,h小时,d天,w周,m月,y年 
k/K m/M g/G
http配置的指令块:server,http,location,upstream

命令行:重载配置文件,热部署,切割日志文件

Nginx命令行:
格式: nginx -s reload
帮助: -?  -h
#修改配置文件,重新加载
$./nginx -s reload
#热部署
$略
查看原文

赞 0 收藏 0 评论 0

SoapEye 收藏了文章 · 2020-03-22

阿里前端攻城狮们写了一份前端面试题答案

话说一周前,我发了这样一条沸点:

于是我真的就建群收集了题目,和团队的同事一起写答案,我们也不图什么,就是想做一件有意义的事情,现在我整理了下我们的回答,有的不一定就是非常具体的回答,但也提供了思路和参考资料,大家看看是否还有什么补充的,或者面试时遇到的问题,也欢迎补充

[高德一面]一个 tcp 连接能发几个 http 请求?(LVYOU)

如果是 HTTP 1.0 版本协议,一般情况下,不支持长连接,因此在每次请求发送完毕之后,TCP 连接即会断开,因此一个 TCP 发送一个 HTTP 请求,但是有一种情况可以将一条 TCP 连接保持在活跃状态,那就是通过 Connection 和 Keep-Alive 首部,在请求头带上 Connection: Keep-Alive,并且可以通过 Keep-Alive 通用首部中指定的,用逗号分隔的选项调节 keep-alive 的行为,如果客户端和服务端都支持,那么其实也可以发送多条,不过此方式也有限制,可以关注《HTTP 权威指南》4.5.5 节对于 Keep-Alive 连接的限制和规则。

而如果是 HTTP 1.1 版本协议,支持了长连接,因此只要 TCP 连接不断开,便可以一直发送 HTTP 请求,持续不断,没有上限; 同样,如果是 HTTP 2.0 版本协议,支持多用复用,一个 TCP 连接是可以并发多个 HTTP 请求的,同样也是支持长连接,因此只要不断开 TCP 的连接,HTTP 请求数也是可以没有上限地持续发送

[腾讯一面]Virtual Dom 的优势在哪里?(B_Cornelius)

「Virtual Dom 的优势」其实这道题目面试官更想听到的答案不是上来就说「直接操作/频繁操作 DOM 的性能差」,如果 DOM 操作的性能如此不堪,那么 jQuery 也不至于活到今天。所以面试官更想听到 VDOM 想解决的问题以及为什么频繁的 DOM 操作会性能差。

首先我们需要知道:

DOM 引擎、JS 引擎 相互独立,但又工作在同一线程(主线程) JS 代码调用 DOM API 必须 挂起 JS 引擎、转换传入参数数据、激活 DOM 引擎,DOM 重绘后再转换可能有的返回值,最后激活 JS 引擎并继续执行若有频繁的 DOM API 调用,且浏览器厂商不做“批量处理”优化, 引擎间切换的单位代价将迅速积累若其中有强制重绘的 DOM API 调用,重新计算布局、重新绘制图像会引起更大的性能消耗。

其次是 VDOM 和真实 DOM 的区别和优化:

  1. 虚拟 DOM 不会立马进行排版与重绘操作
  2. 虚拟 DOM 进行频繁修改,然后一次性比较并修改真实 DOM 中需要改的部分,最后在真实 DOM 中进行排版与重绘,减少过多DOM节点排版与重绘损耗
  3. 虚拟 DOM 有效降低大面积真实 DOM 的重绘与排版,因为最终与真实 DOM 比较差异,可以只渲染局部

[字节跳动] common.js 和 es6 中模块引入的区别? (霍小叶)

CommonJS 是一种模块规范,最初被应用于 Nodejs,成为 Nodejs 的模块规范。运行在浏览器端的 JavaScript 由于也缺少类似的规范,在 ES6 出来之前,前端也实现了一套相同的模块规范 (例如: AMD),用来对前端模块进行管理。自 ES6 起,引入了一套新的 ES6 Module 规范,在语言标准的层面上实现了模块功能,而且实现得相当简单,有望成为浏览器和服务器通用的模块解决方案。但目前浏览器对 ES6 Module 兼容还不太好,我们平时在 Webpack 中使用的 export 和 import,会经过 Babel 转换为 CommonJS 规范。在使用上的差别主要有:

  1. CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
  2. CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
  3. CommonJs 是单个值导出,ES6 Module可以导出多个
  4. CommonJs 是动态语法可以写在判断里,ES6 Module 静态语法只能写在顶层
  5. CommonJs 的 this 是当前模块,ES6 Module的 this 是 undefined

[未知] cookie token 和 session 的区别(Roxannej)

这道题绝对不是你回答的点越多就越好。这道题考察的是你对浏览器缓存知识的理解程度,所以你应该回答的是 Cookie、 Session、Token 的产生背景、原理、有什么问题,在回答这个的基础上把差别讲出来。把这些东西答出本质,再加点装逼的东西,再故意拓展讲到你准备的其他内容才是答好这道题的关键,而要理解好这些东西,其实一两天就够了。关于 Cookie,最近还发生了 Chrome80 屏蔽第三方 Cookie 的事件,如果真的问到这个问题,讲到这件事情妥妥的加分项,前提是你对这件事情也有比较深入的了解。关于 Cookie 和这件事情 我写了篇文章 github.com/mqyqingfeng… 可以看一下。

[头条]如何选择图片格式,例如 png, webp(B_Cornelius)

图片格式

压缩方式

透明度

动画

浏览器兼容

适应场景

JPEG

有损压缩

不支持

不支持

所有

复杂颜色及形状、尤其是照片

GIF

无损压缩

支持

支持

所有

简单颜色,动画

PNG

无损压缩

支持

不支持

所有

需要透明时

APNG

无损压缩

支持

支持

FirefoxSafariiOS Safari

需要半透明效果的动画

WebP

有损压缩

支持

支持

ChromeOperaAndroid ChromeAndroid Browser

复杂颜色及形状浏览器平台可预知

SVG

无损压缩

支持

支持

所有(IE8以上)

简单图形,需要良好的放缩体验需要动态控制图片特效

[未知]首屏和白屏时间如何计算?(jhinnn)

首屏时间的计算,可以由 Native WebView 提供的类似 onload 的方法实现,在 ios 下对应的是 webViewDidFinishLoad,在 android 下对应的是onPageFinished事件。

白屏的定义有多种。可以认为“没有任何内容”是白屏,可以认为“网络或服务异常”是白屏,可以认为“数据加载中”是白屏,可以认为“图片加载不出来”是白屏。场景不同,白屏的计算方式就不相同。

方法1:当页面的元素数小于x时,则认为页面白屏。比如“没有任何内容”,可以获取页面的DOM节点数,判断DOM节点数少于某个阈值X,则认为白屏。 方法2:当页面出现业务定义的错误码时,则认为是白屏。比如“网络或服务异常”。 方法3:当页面出现业务定义的特征值时,则认为是白屏。比如“数据加载中”。

[未知]小程序和 H5 有什么区别?(张慈仁)

  1. 渲染方式与 H5 不同,小程序一般是通过 Native 原生渲染的,但是小程序同时也支持 web 渲染,如果使用 web 渲染的方式,我们需要初始化一个WebView 组件,然后在 WebView 中加载 H5 页面;

所以当我们开发一个小程序时,通常会使用 hybrid 的方式,即会根据具体情况选择部分功能用小程序原生的代码来开发,部分功能通过 WebView 加载 H5 页面来实现。Native 与 Web 渲染混合使用,以实现项目的最优解;

这里值得注意的是,小程序下,native 方式通常情况下性能要优于 web 方式。

  1. 小程序特有的双线程设计。 H5 下我们所有资源通常都会打到一个 bundle.js 文件里(不考虑分包加载),而小程序编译后的结果会有两个bundle,index.js封装的是小程序项目的 view 层,以及 index.worker.js 封装的是项目的业务逻辑,在运行时,会有两条线程来分别处理这两个bundle,一个是主渲染线程,它负责加载并渲染 index.js 里的内容,另外一个是 Service Worker线 程,它负责执行 index.worker.js 里封装的业务逻辑,这里面会有很多对底层api调用。

[未知]如何判断 0.1 + 0.2 与 0.3 相等?(红白)

作为一道面试题,我觉得重要的是要讲出一点其他人一般不会答出来的深度。像这道题,可以从原理和解决方案两个地方作为答题点,最好在编一个案例。大致讲自己遇到过这个问题,于是很好奇深入研究了一下,发现是浮点数精度导致……原理怎样怎样……然后又看了业界的库的源码,然后怎样怎样解决。

关于原理,我专门写了一篇文章 github.com/mqyqingfeng… 来解释,实际回答的时候,我觉得答出来

  1. 非是 ECMAScript 独有
  2. IEEE754 标准中 64 位的储存格式,比如 11 位存偏移值
  3. 其中涉及的三次精度丢失

就已经 OK 了。

再讲解决方案,这个可以直接搜索到,各种方案都了解一下,比较一下优劣,还可以参考业界的一些库的实现,比如 math.js,不过相关的我并没有看过……

如果还有精力的话,可以从加法再拓展讲讲超出安全值的数字的计算问题。

所以我觉得一能回答出底层实现,二能回答出多种解决方案的优劣,三能拓展讲讲 bignum 的处理,就是一个非常不错的回答了。

[腾讯二面]了解v8引擎吗,一段js代码如何执行的(B_Cornelius)

在执行一段代码时,JS 引擎会首先创建一个执行栈

然后JS引擎会创建一个全局执行上下文,并push到执行栈中, 这个过程JS引擎会为这段代码中所有变量分配内存并赋一个初始值(undefined),在创建完成后,JS引擎会进入执行阶段,这个过程JS引擎会逐行的执行代码,即为之前分配好内存的变量逐个赋值(真实值)。

如果这段代码中存在function的声明和调用,那么JS引擎会创建一个函数执行上下文,并push到执行栈中,其创建和执行过程跟全局执行上下文一样。但有特殊情况,即当函数中存在对其它函数的调用时,JS引擎会在父函数执行的过程中,将子函数的全局执行上下文push到执行栈,这也是为什么子函数能够访问到父函数内所声明的变量。

还有一种特殊情况是,在子函数执行的过程中,父函数已经return了,这种情况下,JS引擎会将父函数的上下文从执行栈中移除,与此同时,JS引擎会为还在执行的子函数上下文创建一个闭包,这个闭包里保存了父函数内声明的变量及其赋值,子函数仍然能够在其上下文中访问并使用这边变量/常量。当子函数执行完毕,JS引擎才会将子函数的上下文及闭包一并从执行栈中移除。

最后,JS引擎是单线程的,那么它是如何处理高并发的呢?即当代码中存在异步调用时JS是如何执行的。比如setTimeout或fetch请求都是non-blocking的,当异步调用代码触发时,JS引擎会将需要异步执行的代码移出调用栈,直到等待到返回结果,JS引擎会立即将与之对应的回调函数push进任务队列中等待被调用,当调用(执行)栈中已经没有需要被执行的代码时,JS引擎会立刻将任务队列中的回调函数逐个push进调用栈并执行。这个过程我们也称之为事件循环。

附言:需要更深入的了解JS引擎,必须理解几个概念,执行上下文,闭包,作用域,作用域链,以及事件循环。建议去网上多看看相关文章,这里推荐一篇非常精彩的博客,对于JS引擎的执行做了图形化的说明,更加便于理解。

查看原文

SoapEye 发布了文章 · 2020-03-21

Python_框架&&操作数据库

Django

Django介绍,视图操作,模型,模板,MVC模式,mtv模式,URLS配置,数据库配置,数据库增删改.URL分发器.

Django

Django 是使用 Python 开发的开源 Web 开发框架。

设计模型 Model

Django 无需数据库就可以使用,通过对象关系映射器(Object-relational mapping),仅使用 Python 代码就可以描述数据结构。

from django.db import models
class book(models.Model):
    name = models.CharField(max_length=100)
    pub_date = models.DateField()

models.py文件主要用一个 Python 类来描述数据表。 称为 模型(model) 。 运用这个类,你可以通过简单的 Python 代码来创建、检索、更新、删除 数据库中的记录而无需写一条又一条的 SQL 语句。 在这里我们创建了一个 book 模型,并定义了 name 和 pub_date 属性。

MySQL

Linux安装Mysql

Ubuntu18.04 安装MySQL
===================
环境信息:  OS:Ubuntu18.04   MySQL: 5.7.22
1.更新服务器上的包索引并安装默认包`apt-get`。
sudo apt-get update
sudo apt-get install mysql-server
2.初始化配置
sudo mysql_secure_installation
3.检查mysql服务状态
systemctl status mysql.service
4.配置原创访问
#进入  sudo mysql -uroot -p
输入密码
GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY "123456";

#Navicat连接错误
1.  阿里云没有开放3306端口,在阿里云管理平台添加mysql-3306的端口。
2.  服务器的防火墙没有开放3306端口,
 systemctl start firewalld
 firewall-cmd --zone=public --add-port=3306/tcp --permanent
 firewall-cmd --reload
3.  mysql 用户连接受限制-见4.
#!!!注意链接时,采用ssh方式,写公网但常规的主机写127.0.0.1 3306 mysql用户名 mysql密码

# 7.注意:高版本的MySQL存在简单密码无法设置成功的安全限制,但是可以修改限制
mysql> SET GLOBAL validate\_password\_policy=0; 
mysql> SET GLOBAL validate\_password\_mixed\_case\_count=0; 
mysql> SET GLOBAL validate\_password\_number\_count=3; 
mysql> SET GLOBAL validate\_password\_special\_char\_count=0; 
mysql> SET GLOBAL validate\_password\_length=3;
mysql> UPDATE mysql.user SET authentication\_string=PASSWORD('123'), plugin='mysql\_native\_password' WHERE user='root'; 
mysql> FLUSH PRIVILEGES; 
mysql> exit; -- 然后再登录即可。

PyMySQL(原生模块API)


在Python3.x中用于连接MySQL数据库的库;在Python2.x中连接MySQL数据库使用的是MySQLDB库。
安装pymysql库:

pip install pymysql
查看原文

赞 0 收藏 0 评论 0

SoapEye 发布了文章 · 2020-03-21

互联网_数据结构

算法基础

程序设计 = 数据结构 + 算法

算法时为了解决实际问题而设计的,数据结构是算法需要处理的问题载体,数据结构只是静态的描述呢数据元素之间的关系,高效的程序需要再数据结构的基础上设计和选择算法

数据结构

数据元素相互之间存在的一种或多种特定关系的集合(数据结构指数据对象中数据元素之间的关系)。数据结构分为逻辑结构和物理结构。

逻辑结构:是指数据对象中数据元素之间的相互关系。

    (1)集合结构:数据元素除了同属于一个集合外,没有什么其他关系
    (2)线性结构:线性结构中的数据元素之间是一对一的关系
    (3)树形结构:元素之间存在一种一对多的层次关系
    (4)图形结构:元素是多对多的关系
    
物理结构:是指数据的逻辑结构在计算机中的存储形式。
    
    (1)顺序存储:把数据元素存放在地址连续的存储单元你,其数据间的逻辑关系和物理关系是一致的
    (2)链式存储:把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。链式存储结构的数据元素存储关系不能反映其逻辑关系,需要用一个指针存放数据元素的地址,这样通过地址就可以找到相关数据元素的位置.
Python的数据结构
内置数据结构:列表、元组、字典等
扩展数据结构:Python系统里面没有直接定义,需要我们自己取定义实现这些数据的组织方式,如栈、队列等
抽象数据类型(Abstract Data Type):

把数据类型和数据类型上的运算捆在一起,进行封装。如插入,删除,修改,查找,排序等.

算法

算法:是独立存在(不依赖特定的编程语言)的一种解决问题的方法和思想。算法有五大特性:

(1)输入:算法有0个或多个输入
(2)输出:算法至少有一个或多个输出
(3)有穷性:算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
(4)确定性:算法中的每一步都有确定的含义,不会出现二义性
(5)可行性:算法的每一步都是能够执行有限次数完成的
时间复杂度

假设存在函数g,使得算法A处理规模为n的问题所用时间为T(n)=O(g(n)),则O(g(n))为算法A的奖金时间复杂度,简称时间复杂度,记为T(n)

最优时间复杂度:算法完成工作最少需要多少基本操作 --- 没有什么参考价值
* 最坏时间复杂度:算法完成工作做多需要多少基本操作 --- 基本操作都能完成
平均时间复杂度:算法完成工作平均需要多少基本操作

数据结构

  • 数组
  • 栈,先进后出
  • 队列,先进先出
  • 双端队列,双端队列中的元素可以从两端弹出,插入和删除操作限定在队列的两边进行。
  • 环形队列,环形队列是一种特殊的队列结构,保证了元素也是先进先出的,但与一般队列的区别是,他们是环形的,即队列头部的上个元素是队列尾部,通常是容纳元素数固定的一个闭环。
  • 堆,一种特别的树状数据结构。堆总是一棵完全树。即除了最底层,其他层的节点都被元素填满,且最底层尽可能地从左到右填入。
  • 链表
  • 单向链表。
  • 双向链表。
  • 跳表,一种带多级索引的链表。
  • 散列表,是根据键而直接访问在内存存储位置的数据结构。它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。
  • 二叉树,二叉树是一个连通的无环图,并且每一个顶点的度不大于3。
  • 红黑树,是一种自平衡二叉查找树。
  • 字典树(Trie)
  • 图(Graph)是由顶点的有穷非空集合和顶点之间的边的集合组成。
  • TODO
  • 布隆过滤器,一个概率型数据结构,可以用来判断一个元素是否在一个集合中。判断某个元素在,可能会被误判;判断某个元素不在,那么一定不在。

算法思想

分治法

分治法是基于多项分支递归的一种很重要的算法范式。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

例子:快排、归并排序、MapReduce

贪心算法

贪心算法就是在每一步的选择中都按照当前最优的选择,从而希望最终结果得到最优解。贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。
贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。

例子:最小生成树、哈夫曼编码

动态规划(Dynamic Programming)

动态规划通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。常常适用于有重叠子问题和最优子结构性质的问题。
若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。通常许多子问题非常相似,为此动态规划法试图仅仅解决每个子问题一次,从而减少计算量:一旦某个给定子问题的解已经算出,则将其记忆化存储,以便下次需要同一个子问题解之时直接查表。这种做法在重复子问题的数目关于输入的规模呈指数增长时特别有用。

递归+记忆=递推

适用情况:

  1. 具有最优子结构性质。
  2. 无后效性,子问题确定后不会再改变。
  3. 子问题重叠的性质。

例子:背包问题

回溯法(backtracking)

回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:

  1. 找到一个可能存在的正确的答案
  2. 在尝试了所有可能的分步方法后宣告该问题没有答案

在最坏的情况下,回溯法会导致一次复杂度为指数时间的计算。

例子:八皇后问题

分支界限法

与贪婪算法一样,这种方法也是用来为组合优化问题设计求解算法的,所不同的是它在问题的整个可能解空间搜索,所设计出来的算法虽其时间复杂度比贪婪算法高,但它的优点是与穷举法类似,都能保证求出问题的最佳解,而且这种方法不是盲目的穷举搜索,而是在搜索过程中通过限界,可以中途停止对某些不可能得到最优解的子空间进一步搜索(类似于人工智能中的剪枝),故它比穷举法效率更高。

概率算法

例子:
数值随机化算法
蒙特卡罗(Monte Carlo)算法
拉斯维加斯(Las Vegas)算法
舍伍德(Sherwood)算法
https://juejin.im/post/5dabfb...

查看原文

赞 1 收藏 0 评论 0

SoapEye 关注了专栏 · 2020-03-19

前端巅峰

注重前端性能优化和前沿技术,重型跨平台开发,即时通讯技术等。 欢迎关注微信公众号:前端巅峰

关注 20110

SoapEye 关注了专栏 · 2020-03-18

民工哥技术之路

公众号:民工哥技术之路、《Linux系统运维指南 从入门到企业实战》作者。专注系统架构、高可用、高性能、高并发,数据库、大数据、数据分析、Python技术、集群中间件、后端等开源技术分享。

关注 27336

SoapEye 发布了文章 · 2020-03-14

后端_数据库_SQL

SQL基础语法

概览

SQL 的两个标准, SQL92 和 SQL99,分别代表 92 年和 99 年颁布的 SQL 标准,今天依然遵循这些标准。
按照功能划分成以下的 4 个部分:

DDL,英文叫做 Data Definition Language,也就是数据定义语言,它用来定义我们的数据库对象,包括数据库、数据表和列。通过使用 DDL,我们可以创建,删除和修改数据库和表结构。
DML,英文叫做 Data Manipulation Language,数据操作语言,我们用它操作和数据库相关的记录,比如增加、删除、修改数据表中的记录。
DCL,英文叫做 Data Control Language,数据控制语言,我们用它来定义访问权限和安全级别。
DQL,英文叫做 Data Query Language,数据查询语言,我们用它查询想要的记录,它是 SQL 语言的重中之重。

在创建 DBMS 之前:还需要对它进行设计,对于 RDBMS 来说采用的是 ER 图即实体 - 关系图的方式进行设计。ER 图评审通过后,再用 SQL 语句或者可视化管理工具(如 Navicat)创建数据表。
实体 - 关系图: 用来描述现实世界的概念模型,模型中有 3 个要素:实体、属性、关系。实体就是我们要管理的对象,属性是标识每个实体的属性,关系则是对象之间的关系。

DMBS数据库管理系统

数据库管理系统:DataBase Management System,简称DBMS,实际上它可以对多个数据库进行管理,可以理解为DBMS = 多个数据库(DB) + 管理程序。
数据库:DataBase。数据库是存储数据的集合,你可以把它理解为多个数据表。
数据库系统:DataBase System。它是更大的概念,包括了数据库、数据库管理系统以及数据库管理人员DBA。
关系型数据库 绝对是 DBMS 的主流,其中使用最多的 DBMS 分别是 Oracle、MySQL 和 SQL Server。关系型数据库建立在关系模型基础上的数据库,SQL 就是关系型数据库的查询语言。
非关系型数据库:,NoSQL 泛指,包括键值型数据库、文档型数据库、搜索引擎和列存储,图形数据库。

 键值型数据库通过 Key-Value 键值的方式来存储数据,其中 Key 和 Value 可以是简单的对象,也可以是复杂的对象。Key 作为唯一的标识符,优点是查找速度快,在这方面明显优于关系型数据库,同时缺点也很明显,它无法像关系型数据库一样自由使用条件过滤(比如 WHERE),如果你不知道去哪里找数据,就要遍历所有的键,这就会消耗大量的计算。键值型数据库典型的使用场景是作为内容缓存。Redis 是最流行的键值型数据库。
 文档型数据库用来管理文档,在数据库中文档作为处理信息的基本单位,一个文档就相当于一条记录,MongoDB 是最流行的文档型数据库。
 搜索引擎也是数据库检索中的重要应用,常见的全文搜索引擎有 Elasticsearch、Splunk 和 Solr。虽然关系型数据库采用了索引提升检索效率,但是针对全文索引效率却较低。搜索引擎的优势在于采用了全文搜索的技术,核心原理是“倒排索引”。
 列式数据库是相对于行式存储的数据库,Oracle、MySQL、SQL Server 等数据库都是采用的行式存储(Row-based),而列式数据库是将数据按照列存储到数据库中,这样做的好处是可以大量降低系统的 I/O,适合于分布式文件系统,不足在于功能相对有限。
 图形数据库,利用了图这种数据结构存储了实体(对象)之间的关系。最典型的例子就是社交网络中人与人的关系,数据模型主要是以节点和边(关系)来实现,特点在于能高效地解决复杂的关系问题。

Oracle 中的 SQL 是如何执行的:

1.png

语法检查:检查 SQL 拼写是否正确,如果不正确,Oracle 会报语法错误。
语义检查:检查 SQL 中的访问对象是否存在。比如我们在写 SELECT 语句的时候,列名写错,系统就会提示错误。语法检查和语义检查的作用是保证 SQL 语句没有错误。
权限检查:看用户是否具备访问该数据的权限。
共享池检查:共享池(Shared Pool)是一块内存池,最主要的作用是缓存 SQL 语句和该语句的执行计划。Oracle 通过检查共享池是否存在 SQL 语句的执行计划,来判断进行软解析,还是硬解析。
在共享池中,Oracle 首先对 SQL 语句进行 Hash 运算,然后根据 Hash 值在库缓存(Library Cache)中查找,如果存在 SQL 语句的执行计划,就直接拿来执行,直接进入“执行器”的环节,这就是软解析。
如果没有找到 SQL 语句和执行计划,Oracle 就需要创建解析树进行解析,生成执行计划,进入“优化器”这个步骤,这就是硬解析。
优化器:优化器中就是要进行硬解析,也就是决定怎么做,比如创建解析树,生成执行计划。
执行器:当有了解析树和执行计划之后,就知道了 SQL 该怎么被执行,这样就可以在执行器中执行语句。 

软解析 :在共享池中,首先对SQL语句进行Hash运算,然后根据Hash值在库缓存(library cache)中查找,如果存在SQL语句的执行计划,就直接拿来执行。也就是直接进入到执行器的环节。
共享池 :Oracle中的术语,包括了库缓存(library cache),数据字典缓冲区等
硬解析 :如果没有找到SQL语句和执行计划,就需要自己来创建解析树进行解析,生成执行计划。对应的是优化器这个步骤。

MySQL 中的 SQL 是如何执行的

首先 MySQL 是典型的 C/S 架构,即 Client/Server 架构,服务器端程序使用的 mysqld。整体的 MySQL 流程如下图所示:
2.png

连接层:客户端和服务器端建立连接,客户端发送 SQL 至服务器端;
SQL 层:对 SQL 语句进行查询处理;
存储引擎层:与数据库文件打交道,负责数据的存储和读取。

其中 SQL 层与数据库文件的存储方式无关,我们来看下 SQL 层的结构:
1.jpg

查询缓存:Server 如果在查询缓存中发现了这条 SQL 语句,就会直接将结果返回给客户端;如果没有,就进入到解析器阶段。需要说明的是,因为查询缓存往往效率不高,所以在 MySQL8.0 之后就抛弃了这个功能。
解析器:在解析器中对 SQL 语句进行语法分析、语义分析。
优化器:在优化器中会确定 SQL 语句的执行路径,比如是根据全表检索,还是根据索引来检索等。
执行器:在执行之前需要判断该用户是否具备权限,如果具备权限就执行 SQL 查询并返回结果。在 MySQL8.0 以下的版本,如果设置了查询缓存,这时会将查询结果进行缓存。

SQL语句在Oracle和Mysql的运行流程区别

SQL 语句→缓存查询→解析器→优化器→执行器
在这一部分中,MySQL 和 Oracle 执行 SQL 的原理是一样的。与 Oracle 不同的是,MySQL 的存储引擎采用了插件的形式,每个存储引擎都面向一种特定的数据库应用环境。同时开源的 MySQL 还允许开发人员设置自己的存储引擎,如InnoDB 存储引擎,MyISAM 存储引擎,Memory 存储引擎,NDB 存储引擎,Archive 存储引擎。

Oracle 提出了共享池的概念,通过共享池来判断是进行软解析,还是硬解析。而在 MySQL 中,8.0 以后的版本不再支持查询缓存,而是直接执行解析器→优化器→执行器的流程,这一点从 MySQL 中的 show profile 里也能看到。

数据库的设计在于表的设计,而在 MySQL 中每个表的设计都可以采用不同的存储引擎,我们可以根据实际的数据处理需要来选择存储引擎,这也是 MySQL 的强大之处。

查看原文

赞 1 收藏 1 评论 0

认证与成就

  • 获得 12 次点赞
  • 获得 5 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 5 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

注册于 2018-08-18
个人主页被 1.2k 人浏览