MongoDB高手课笔记
前言
这是极客时间的《MongoDB高手课》视频课程做的笔记。中间件会持续更新。视频课程可以自己搜一下,极客时间的山寨课很多,就是声画不同步看着有点不舒服而已,正版也不贵,新人首单是59。课程介绍说看完这个可以说自己精通MongoDB,欢迎大家在评论区反馈。
MongoDB再入门
关于MongoDB
Question
Answer
什么是 MongoDB?
一个以 JSON 为数据模型的 文档数据库
为什么叫 文档数据库?
文档来自于 JSON Document,并非我们一般理解的 PDF,WORD文档
谁开发的 MongoDB?
上市公司 MongoDB Inc. ,总部位于美国纽约
主要用途
1. 应用数据库,类似于Oracle,MySQL2. 海量数据处理,数据平台
主要特点
1. 建模为可选2. JSON数据模型比较适合开发者3. 支持横向扩展,支持大数据量和并发4. 从4.0版本开始支持ACID事务
MongoDB VS 关系型数据库
MongoDB
RDBMS
数据模型
文档类型
关系模型
数据库类型
OLTP(On ...
dubbo篇
Dubbo 是什么?RPC 又是什么?
Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案。
RPC是远程调用,就是本地机器调用远程机器的一个方法,远程机器返回结果的过程。
主要原因是由于单台服务的性能已经无法满足我们了,在这个流量剧增的时代,只有多台服务器才能支撑起来现有的用户体系,
而在这种体系下,服务越来越多,逐渐演化出了现在这种微服务化的 RPC 框架。
Dubbo 能做什么?
Dubbo 的核心功能主要包含:
远程通讯: dubbo-remoting模块, 提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
能说下 Dubbo 的总体的调用过程吗?
调用过程图:
Proxy 持有一个 Invoker 对象 ...
23种设计模式
设计模式相关视频,讲得挺好的,至少比马士兵的好,不足的是选集没有排好序,不能自动连播,而且还在连载中
TuringPlanet的设计模式
视频配套代码
七大原则
设计模式七大原则
设计模式六大原则分别为:
单一职责原则(SRP): 一个类只应该有一个引起它变化的原因,即一个类只负责一项职责。(有点DDD那味儿)
高内聚:避免大而全,避免不相关功能的耦合
低耦合:减少所需要依赖和被依赖的类
开放封闭原则(OCP):对扩展开放,对修改关闭。当需要改变一个程序的功能或给它增加新功能时,可以通过增加代码来实现,而不是修改已有的代码。
测试简单
可复用性变强
稳定性变高
里氏替换原则(LSP):子类可以替换其父类并且仍然产生正确的结果。这表明在使用继承时需要非常小心,子类和父类之间的关系应该是is-a。
接口隔离原则(ISP):客户端不应该依赖那些它不需要使用的接口。一个类对另一个类的依赖性应该是建立在最小的接口上。
依赖倒置原则(DIP):高层模块不应该依赖于低层模块,两者都应该依赖于抽象。抽象不应该依赖于具体实现,具体实现应该依赖于抽象。这个原则的目的是为了减少类之间 ...
kafka核心技术与实战
引论
Kafka 属于分布式的消息引擎系统,它的主要功能是提供一套完备的消息发布与订阅解决方案。在 Kafka 中,发布订阅的对象是主题(Topic),你可以为每个业务、每个应用甚至是每类数据都创建专属的主题。同时,它也是一个分布式流处理平台(Distributed Streaming Platform)
点击获取《kafka核心技术与实战》
点击获取《Kafka多维度系统精讲,从入门到实战开发》
术语
生产者(Producer)、消费者(Consumer)和服务进程Broker
生产者:向主题发布消息的客户端应用程序称为生产者(Producer),生产者程序通常持续不断地向一个或多个主题发送消息
消费者:订阅这些主题消息的客户端应用程序就被称为消费者(Consumer)
服务进程:Kafka 的服务器端由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成,Broker 负责接收和处理客户端发送过来的请求,以及对消息进行持久化。
虽然多个 Broker 进程能够运行在同一台机器上,但更常见的做法是将不同的 Broker 分散运行在不 ...
HashMap精选13问
转载
本文转自 沉默王二
HashMap的底层数据结构是什么?
JDK 7 中,HashMap 由“数组+链表”组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的。
在 JDK 8 中,HashMap 由“数组+链表+红黑树”组成。链表过长,会严重影响 HashMap 的性能,而红黑树搜索的时间复杂度是 O(logn),而链表是糟糕的 O(n)。因此,JDK 8 对数据结构做了进一步的优化,引入了红黑树,链表和红黑树在达到一定条件会进行转换:
当链表超过 8 且数据总量超过 64 时会转红黑树。
将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树,以减少搜索时间。
链表长度超过 8 体现在 putVal 方法中的这段代码:
123//链表长度大于8转换为红黑树进行处理if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash);
table 长度为 64 体现在 treeifyBin 方法中的这段代码::
123 ...
kafka篇
引论
Kafka 属于分布式的消息引擎系统,它的主要功能是提供一套完备的消息发布与订阅解决方案。在 Kafka 中,发布订阅的对象是主题(Topic),你可以为每个业务、每个应用甚至是每类数据都创建专属的主题。同时,它也是一个分布式流处理平台(Distributed Streaming Platform)
点击获取《kafka核心技术与实战》
点击获取《Kafka多维度系统精讲,从入门到实战开发》
Kafka 的设计
Kafka 将消息以 topic 为单位进行归纳,发布消息的程序称为 Producer,消费消息的程序称为 Consumer。它是以集群的方式运行,可以由一个或多个服务组成,每个服务叫做一个 Broker,Producer 通过网络将消息发送到 kafka 集群,集群向消费者提供消息,broker 在中间起到一个代理保存消息的中转站。
Kafka 中重要的组件
1)Producer:消息生产者,发布消息到Kafka集群的终端或服务
2)Broker:一个 Kafka 节点就是一个 Broker,多个Broker可组成一个Kafka 集群。
如果某个 Topic 下有 ...
操作系统(修正版)
引论
什么是操作系统?
可以这么说,操作系统是一种运行在内核态的软件。
它是应用程序和硬件之间的媒介,向应用程序提供硬件的抽象,以及管理硬件资源。
操作系统主要有哪些功能?
操作系统最主要的功能:
处理器(CPU)管理:CPU的管理和分配,主要指的是进程管理。
内存管理:内存的分配和管理,主要利用了虚拟内存的方式。
外存管理:外存(磁盘等)的分配和管理,将外存以文件的形式提供出去。
I/O管理:对输入/输出设备的统一管理。
除此之外,还有保证自身正常运行的健壮性管理,防止非法操作和入侵的安全性管理。
操作系统结构
什么是内核?
可以这么说,内核是一个计算机程序,它是操作系统的核心,提供了操作系统最核心的能力,可以控制操作系统中所有的内容。
什么是用户态和内核态?
内核具有很⾼的权限,可以控制 cpu、内存、硬盘等硬件,出于权限控制的考虑,因此⼤多数操作系统,把内存分成了两个区域:
内核空间,这个内存空间只有内核程序可以访问;
⽤户空间,这个内存空间专⻔给应⽤程序使⽤,权限比较小;
⽤户空间的代码只能访问⼀个局部的内存空间,⽽内核空间的代码可以访问所有内存空间。因此,当程序使 ...
计算机网络(修正版)
计算机网络基础是面试中经常会问到的问题。例如Https是用了几种加密,TCP三次握手和四次挥手等
mysql篇(修正版)
基础
什么是内连接、外连接、交叉连接、笛卡尔积呢?
内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
外连接(outer join):不只取得两张表中满足存在连接匹配关系的记录,还包括某张表(或两张表)中不满足匹配关系的记录。
交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,它是笛卡尔积在 SQL 中的实现,如果 A 表有 m 行,B 表有 n 行,那么 A 和 B 交叉连接的结果就有 m*n 行。
笛卡尔积:是数学中的一个概念,例如集合 A={a,b},集合 B={1,2,3},那么 A✖️B={<a,o>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}。
那 MySQL 的内连接、左连接、右连接有有什么区别?
MySQL 的连接主要分为内连接和外连接,外连接常用的有左连接、右连接。
MySQL-joins-来源菜鸟教程
inner join 内连接,在两张表进行连接查询时,只保留两张表中完全匹配的结果集
le ...
mybatis篇(修正版)
基础
说说什么是MyBatis?
先吹一下:
Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性能,灵活度高。
MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
再说一下缺点
SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
ORM是什么?
ORM(Object Relational Mapping),对象关系映射,是一种为了解决关系型数据库数据与简单Java对象(POJO)的映射关系的技术。简单来说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系型数据库中。
为什么说Mybatis是半自动ORM映射工具?它与全自动的 ...
RocketMq篇(修正版)
点击获取《RocketMq大白话讲解》
基础
为什么要使用消息队列呢?
消息队列主要有三大用途,我们拿一个电商系统的下单举例:
解耦:引入消息队列之前,下单完成之后,需要订单服务去调用库存服务减库存,调用营销服务加营销数据……引入消息队列之后,可以把订单完成的消息丢进队列里,下游服务自己去调用就行了,这样就完成了订单服务和其它服务的解耦合。
异步:订单支付之后,我们要扣减库存、增加积分、发送消息等等,这样一来这个链路就长了,链路一长,响应时间就变长了。引入消息队列,除了更新订单状态,其它的都可以异步去做,这样一来就来,就能降低响应时间。
削峰:消息队列合一用来削峰,例如秒杀系统,平时流量很低,但是要做秒杀活动,秒杀的时候流量疯狂怼进来,我们的服务器,Redis,MySQL各自的承受能力都不一样,直接全部流量照单全收肯定有问题啊,严重点可能直接打挂了。
我们可以把请求扔到队列里面,只放出我们服务能处理的流量,这样就能抗住短时间的大流量了。
解耦、异步、削峰,是消息队列最主要的三大作用。
为什么要选择RocketMQ?
市场上几大消息队列对比如下:
总结一下:
选择中间 ...
分布式系统(修正版)
分布式理论
说说CAP原则?
CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性)这3个基本需求,最多只能同时满足其中的2个。
选项
描述
Consistency(一致性)
指数据在多个副本之间能够保持一致的特性(严格的一致性)
Availability(可用性)
指系统提供的服务必须一直处于可用的状态,每次请求都能获取到非错的响应(不保证获取的数据为最新数据)
Partition tolerance(分区容错性)
分布式系统在遇到任何网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务,除非整个网络环境都发生了故障
为什么CAP不可兼得呢?
首先对于分布式系统,分区是必然存在的,所谓分区指的是分布式系统可能出现的字区域网络不通,成为孤立区域的的情况。
那么分区容错性(P)就必须要满足,因为如果要牺牲分区容错性,就得把服务和资源放到一个机器,或者一个“同生共死”的集群,那就违背了分布式的初衷。
那么满足分区容错的基础上,能不能 ...
redis篇(修正版)
基础
说说什么是Redis?
Redis是一种基于键值对(key-value)的NoSQL数据库。
比一般键值对数据库强大的地方,Redis中的value支持string(字符串)、hash(哈希)、 list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)、 HyperLogLog、GEO(地理信息定位)等多种数据结构,因此 Redis可以满足很多的应用场景。
而且因为Redis会将所有数据都存放在内存中,所以它的读写性能非常出色。
不仅如此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,这样在发生类似断电或者机器故障的时候,内存中的数据不会“丢失”。
除了上述功能以外,Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等附加功能。
总之,Redis是一款强大的性能利器。
Redis可以用来干什么?
缓存
这是Redis应用最广泛地方,基本所有的Web应用都会使用Redis作为缓存,来降低数据源压力,提高响应速度。
计数器
Redis天然支持计数功能,而且计数性能非常好,可以用来记录浏览量、点赞量等等。
排行榜
Redi ...
spring框架篇(修正版)
基础
Spring 是什么?特性?有哪些模块?
一句话概括:Spring 是一个轻量级、非入侵式的控制反转 (IoC) 和面向切面 (AOP) 的框架。
2003 年,一个音乐家 Rod Johnson 决定发展一个轻量级的 Java 开发框架,Spring作为 Java 战场的龙骑兵渐渐崛起,并淘汰了EJB这个传统的重装骑兵。
到了现在,企业级开发的标配基本就是 Spring5 + Spring Boot 2 + JDK 8
Spring 有哪些特性呢?
Spring 有很多优点:
IOC 和 DI 的支持
Spring 的核心就是一个大的工厂容器,可以维护所有对象的创建和依赖关系,Spring 工厂用于生成 Bean,并且管理 Bean 的生命周期,实现高内聚低耦合的设计理念。
AOP 编程的支持
Spring 提供了面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等切面功能。
声明式事务的支持
支持通过配置就来完成对事务的管理,而不需要通过硬编码的方式,以前重复的一些事务提交、回滚的 JDBC 代码,都可以不用自己写了。
快捷测试的支持
Sprin ...
JVM篇(修正版)
JVM推荐马士兵的这套课,虽然对培训机构推销卖课非常反感,但是不可否认,这套讲得非常清楚。
点击跳转
引言
什么是 JVM?
JVM——Java 虚拟机,它是 Java 实现平台无关性的基石。
Java 程序运行的时候,编译器将 Java 文件编译成平台无关的 Java 字节码文件(.class),接下来对应平台 JVM 对字节码文件进行解释,翻译成对应平台匹配的机器指令并运行。
同时 JVM 也是一个跨语言的平台,和语言无关,只和 class 的文件格式关联,任何语言,只要能翻译成符合规范的字节码文件,都能被 JVM 运行。
内存管理
能说一下 JVM 的内存区域吗?
JVM 内存区域最粗略的划分可以分为堆和栈,当然,按照虚拟机规范,可以划分为以下几个区域:
JVM 内存分为线程私有区和线程共享区,其中方法区和堆是线程共享区,虚拟机栈、本地方法栈和程序计数器是线程隔离的数据区。
1)程序计数器
程序计数器(Program Counter Register)也被称为 PC 寄存器,是一块较小的内存空间。
它可以看作是当前线程所执行的字节码的行号指示器。
2)Java 虚拟机栈 ...
集合框架篇(修正版)
引言
说说有哪些常见集合?
集合相关类和接口都在java.util中,主要分为3种:List(列表)、Map(映射)、Set(集)。
其中Collection是集合List、Set的父接口,它主要有两个子接口:
List:存储的元素有序,可重复。
Set:存储的元素无序,不可重复。
Map是另外的接口,是键值对映射结构的集合。
List
List,也没啥好问的,但不排除面试官剑走偏锋,比如面试官也看了我这篇文章。
ArrayList和LinkedList有什么区别?
(1)数据结构不同
ArrayList基于数组实现
LinkedList基于双向链表实现
(2) 多数情况下,ArrayList更利于查找,LinkedList更利于增删
ArrayList基于数组实现,get(int index)可以直接通过数组下标获取,时间复杂度是O(1);LinkedList基于链表实现,get(int index)需要遍历链表,时间复杂度是O(n);当然,get(E element)这种查找,两种集合都需要遍历,时间复杂度都是O(n)。
ArrayList增删如果是数组末尾的 ...
并发编程(修正版)
基础
并行跟并发有什么区别?
从操作系统的角度来看,线程是CPU分配的最小单位。
并行就是同一时刻,两个线程都在执行。这就要求有两个CPU去分别执行两个线程。
并发就是同一时刻,只有一个执行,但是一个时间段内,两个线程都执行了。并发的实现依赖于CPU切换线程,因为切换的时间特别短,所以基本对于用户是无感知的。
说说什么是进程和线程?
要说线程,必须得先说说进程。
进程:进程是代码在数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位。
线程:线程是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。
操作系统在分配资源时是把资源分配给进程的, 但是 CPU 资源比较特殊,它是被分配到线程的,因为真正要占用CPU运行的是线程,所以也说线程是 CPU分配的基本单位。
比如在Java中,当我们启动 main 函数其实就启动了一个JVM进程,而 main 函数在的线程就是这个进程中的一个线程,也称主线程。
一个进程中有多个线程,多个线程共用进程的堆和方法区资源,但是每个线程有自己的程序计数器和栈。
说说线程有几种创建方式?
Java中创建线程主要有三 ...
基础知识(修正版)
Java 概述
什么是 Java?
PS:碎怂 Java,有啥好介绍的。哦,面试啊。
Java 是一门面向对象的编程语言,不仅吸收了 C++语言的各种优点,还摒弃了 C++里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
Java 语言有哪些特点?
Java 语言有很多优秀(可吹)的特点,以下几个是比较突出的:
面向对象(封装,继承,多态);
平台无关性,平台无关性的具体表现在于,Java 是“一次编写,到处运行(Write Once,Run any Where)”的语言,因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 的虚拟机机制。在引入虚拟机之后,Java 语言在不同的平台上运行不需要重新编译。
支持多线程。C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持;
编译与解释并存;
JVM、JDK 和 JRE 有什么区 ...
ElementUI表格组件合并单元格(纵向)
我是一个后端开发,所以我知道对于一个后端来说,去写这种东西是有多烦。所以把这个纵向合并单元格的功能,封装成一个通用方法,希望能起到抛砖引玉的作用。
ElementUI表格是提供单元格合并的功能的,笔者在实际开发过程中,有遇到业务场景,要求纵向同值合并。以下是代码示例。
util.js
1234567891011121314151617181920212223242526272829303132333435363738394041424344/** * 生成el-table纵向合并相同值单元格的对象 * @param rows 表格数据 * @param prop 判断相同值的属性 * @param obj el-table调用合并方法的回调 */export const calcMergeObj = function(rows, props, { row, column, rowIndex, columnIndex}) { if (row['merge_mark_' + props.join('#') ...