自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 收藏
  • 关注

原创 Mysql面试之索引

一、啥是索引一种高效获取数据的数据结构。通俗的说,数据库索引像一本书的目录,能加快数据的查询速度。一般来说索引本身很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。通常所说的索引,包括聚集索引、组合索引、唯一索引等等,默认都是使用 B+ 树结构组织的。 二、索引有啥优点和缺点优点:提高数据检索的效率,降低数据库的 IO 成本。通过索引列对数据进行排序,降低了数据排序成本,降低 CPU 消耗。(1)被

2022-01-14 16:22:28 5029

原创 Mysql面试之三大log

快,开篇大伙先思考一个问题,MySQL 是怎么保证数据不丢失的呢?其实要保证数据不丢失,说白了要具有下面两种能力:(1)能恢复到任何时间点的状态;(2)能保证 MySQL 在任何时间段突然宕机重启,已提交的数据不会丢失,未提交完整的数据也会自动回滚;这不就引出来今天要聊的主题了么,实现第一点需要用 bin log,实现第二点需要用 redo log 和 undo log。 了解三大log之前,我们先看一下Mysql数据更新的流程:上面这张图包含了 redo log、bin log、

2021-12-14 11:35:14 12249 2

原创 剑指offer栈、队列、位运算题目汇总(面试必备)

剑指 offer 栈、队列题目汇总(C++版) 1、用两个栈实现队列用两个栈实现一个队列。队列的声明如下,实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 返回 -1 )思路:我们知道队列特点是先进先出,而栈的特点是先进后出。因此我们使用栈1来存储数据,栈2来模拟队列弹出数据。栈2如果为空,就需要把栈1的数据全都 push 过来,否则如果栈2不为空,取出栈顶元素即可。

2021-11-18 10:15:33 4768

原创 剑指offer数组题目汇总(面试必备)

剑指 offer 数组题目汇总(C++版) 1、数组中重复的数字一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。找出数组中任意一个重复的数字。思路1:先排序,在遍历。 时间复杂度:O(nlog(n)) ,空间复杂度:O(1)思路2:遍历数组时查询哈希表是否已有这个数,有就返回,没有就添加。时间复杂度:O(n), 空间复杂度:O(n)思路1和2比较简单,代码就不贴了。主要说一下下面的方

2021-11-05 10:56:33 327

原创 二分查找算法模板(太强了吧)

二分查找算法模板 模板1当将区间 [l, r] 划分成 [l, mid] 和 [mid + 1, r] 时,其更新操作是 r = mid 或 l = mid + 1,计算 mid 时不需要加1,即 mid = (l + r)/2。C++代码模板:int bsearch_1(int l, int r){ while (l < r) { int mid = (l + r) / 2; if (check(mid)) r = mid;

2021-10-19 17:58:06 223

原创 剑指offer二叉树题目汇总(面试必备)

1、二叉树的镜像输入一个二叉树,该函数输出它的镜像。举例:思路1:递归对于样例来说,先改变根结点8的左指针指向的值,左边指向的值换到右边,右边指向的值换到左边。接下来,递归处理,将左子树的根结点作为新的 root,进行上面相同的操作。右子树同理。时间复杂度:O(n) 空间复杂度:O(n)TreeNode* Mirror(TreeNode* pRoot) { if(!pRoot) return pRoot; //特判:如果pRoot为空,返回空 swap(pRoot

2021-10-18 18:40:48 211

原创 正向代理、反向代理和负载均衡

要理解正向和反向代理,简单说就是要整明白到底代理服务器代理了谁后者说代理服务器为谁服务?别急,一点点往下看。 一、正向代理1、啥是正向代理就是一个在客户端和目标服务器之间的服务器(称为代理服务器),帮助客户端从目标服务器获取内容。此时目标服务器是不知道访问自己的是真实的客户端还是客户端找的代理。比如要访问国外网站,直接访问不通,那么就可以找一个代理服务器为我们服务,客户端发请求到代理服务器,代理服务器把请求转发到目标服务器让后把结果拿回来返回给客户端。我靠,原来正向代理说白了就是

2021-10-08 10:15:58 4106 4

原创 Mysql面试之体系结构简介

一图降十会,先上结构图瞅瞅 下面从上到下依次介绍:自顶向下一共有四层,分别是网络连接层,服务层(核心层),存储引擎层,系统文件层。1、网络连接层:主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都对线程进行创建和销毁。当客户端连接到 MySQL 服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过 SSL 证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。这一层并不是 MyS

2021-09-30 11:24:12 149

原创 Mysql面试之主从复制(同步)

一、为什么需要 Mysql 主从复制1、在业务复杂的系统中,有这样一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就会影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样即使主库出现了锁表,通过读从库也可以保证业务的正常运作。2、做数据的热备冷备:读写操作均不可进行温备:读操作可执行;但写操作不可执行热备:读写操作均可执行3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。&nbsp

2021-09-30 10:51:39 516

原创 Redis面试之过期策略及内存淘汰机制

Redis过期策略主要有两个:定期删除+惰性删除1、定期删除Redis 将每个设置了过期时间的 key 放到独立的字典中,默认每 100ms 扫描一次,大致流程为:随机选择 20 个 key删除 20 个 key 中过期的 key判断过期的 key 比例,如果超过总过期 key 数量的 1/4,再从步骤 1开始执行继续删除知道满足条件那么问题来了,定期删除策略中为什么只随机扫描一些 key 而不是扫描所有的 key?Redis 是单线程啊,设想一下,如果 key 都有过期时间,全部扫一遍

2021-09-29 17:18:19 115

原创 Redis面试之单机、主从、哨兵、集群模式

一、单机模式就是安装一个 redis 供业务方调用,没什么好说的,适用于对高可用要求低的场景。优点:部署简单,成本低,不需要同步数据缺点:1、可靠性差,宕机数据可能丢失2、性能受限于CPU的处理能力,容量不能水平扩展 二、主从同步(复制)不是单机了,至少得有两个redis服务器,将一台 redis 服务器当做主节点(master),其他 redis 服务器作为主节点的从节点(slave),可以将 master 的数据复制到其他 slave 节点(数据的复制是单向的,只能由主节点到

2021-09-29 11:26:40 268

原创 Redis面试之持久化机制(RDB、AOF)

所谓知其然知其所以然,开篇咱们先考虑一个问题,那就是Redis为什么需要将数据持久化呢,快,先思考一分钟!好了,大家都知道 redis 将数据存储在内存里,但是不怕一万就怕万一,万一哪天机器咔嚓一下宕机了,那么后果可能很操蛋,数据可能会全部丢失,为了避免这种糟糕的情况就需要持久化机制来保证数据不会因为某些故障而丢失。下面进入正题Redis 的持久化机制主要有两种:一是RDB快照,二是AOF日志。一、RDB快照这种机制是将内存中数据以快照的方式写入到二进制文件里,默认的文件是 dump.rdb。

2021-09-23 14:40:33 302

原创 Redis面试之杂七杂八

1、redis五种数据类型String(字符串)介绍:redis 最基本的类型,可以包含任何数据,比如jpg图片或者序列化的对象,规定字符串的长度不得超过512MB,此类型和memcache相似,作为常规的key-value缓存应用。。Redis的字符串有两种存储方式,在长度特别短时,使用embstr形势存储,而长度超过44字节时候,使用raw形势存储。场景:访问量统计:例如微博数、粉丝数等Hash(哈希)介绍:hash 是一个键值(key=>value)对集合,是一个 string 类

2021-09-22 10:30:56 143

原创 缓存穿透、缓存击穿和缓存雪崩

1、缓存穿透缓存和数据库中都没有的数据,但是用户不断发起请求,如发起为 id 为“-1”的数据或id为特别大不存在的数据。此时所有的请求都会打到数据库上,导致数据库压力过大。解决方案:(1)接口层增加校验,如用户鉴权校验,id做基础校验,id<=0 的直接拦截(2)如果从缓存和数据库中都没有取到数据,也可以将 key-value 对写为 key-null,然后将缓存有效时间设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个 id 暴力攻击(3)布隆过滤器

2021-09-16 17:23:02 268

原创 剑指offer链表题目汇总(面试必备)

1、反转链表输入一个链表,反转链表后,输出新链表的表头。比较简单,直接上代码。时间复杂度:O(n) 空间复杂度:O(1)ListNode* ReverseList(ListNode* pHead) { if(!pHead) return pHead; ListNode* pre = nullptr; while(pHead) { ListNode* temp = pHead->next;

2021-09-13 11:37:29 255

原创 面试中常考排序算法总结(不看后悔)

面试中常见的排序算法(C++版) 前置基础知识:稳定:a=b且a在b前面,排序之后a仍然在b的前面不稳定:a=b且a在b前面,排序之后 a 可能会出现在 b 的后面时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现的规律空间复杂度:算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数 1、冒泡排序流程:比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该

2021-09-03 10:59:06 404

原创 二叉树遍历算法总结(递归+非递归)

二叉树的前序中序后序层序遍历总结(C++版) 1、前序遍历(根左右)递归:没什么好说的void preOrder(TreeNode* root){ if (!root) return; cout << root->val << " "; preOrder(root->left); preOrder(root->right);} 非递归:借助栈前序遍历根左右,先将当前节点打印,并将其进栈,节点指向

2021-09-02 18:55:47 271

原创 golang的GMP原理

在学习 golang 的 GMP 原理前,你可能需要了解一下关于进程、线程以及协程的知识,可以先瞅瞅这篇之前的这篇文章。文章地址:golang的并发编程 1、G、M、P都代表什么意思Processor处理器,其中包含了运行 goroutine 的资源,如果线程想运行 goroutine,那必须先获取 P,P 中还包含了可运行的 G 队列。 2、GMP模型golang 中线程是运行 goroutine 的实体,调度器的作用是把可运行的 goroutine 分配到工作线程上。

2021-07-26 16:44:46 4846

原创 golang的并发编程

一、进程、线程、协程、并发、并行1、进程、线程、协程1.1 进程:对操作系统来说,进程是资源分配的最小单位,程序启动时,操作系统就会给这个程序分配一块内存空间,对于程序本身而言它认为这是一整块连续的内存空间,称为虚拟内存空间,而实际上落实到操作系统内核时通常是一块块的内存碎片。一个进程大小可能是几个G,进程之间切换开销较大,进程可以实现操作系统的并发。这片虚拟内存空间,可以划分为内核空间和用户空间,它们相互隔离,程序即使崩溃了,内核空间也不会受到影响。进程运行在内核空间时称为内核态,运行在用户空间

2021-07-26 15:54:34 2979

原创 golang的接口

一、接口是什么、为什么需要接口是什么:接口(interface)是一组仅包含方法名、参数、返回值的未具体实现的方法的集合。接口只定义规范而不去实现,细节由具体的对象来实现。golang中接口是一种抽象的类型。为什么:大多情况下,一些数据可能包含不同的类型,但是可能会有一个或者多个共同点,这些共同点就是抽象的基础。Go的接口类似c++的多态,接口相当于实现一个父类,然后派生类具体实现父类的虚函数,最后通过父类指针指向不同的派生类对象去调用那个派生类对象的虚函数,从而实现多态。举例说明一下,比如三角形,四边

2021-07-15 16:33:45 9645 2

原创 如何通过GoLand进行Debug

如何通过GoLand调试go程序?可以分两种情况:第一种是普通不需要传参数的程序的调试第二种是需要传一些参数才能运行的程序的调试  1、不需要传参数的程序如何Debug先随便写一个简单的程序如下:func main() { a := 1 b := 2 val := a + b fmt.Println(val)}假设我们现在要调试这个程序,如何搞呢?首先先打个断点然后点击一下绿色箭头会出现下面这样接着点击那个绿色小虫子就可以开启

2021-07-07 11:41:06 19197 4

原创 golang的方法

1、方法定义及使用go中的方法是一个包含了接受者的函数,接受者可以是命名类型或结构体类型的一个值或者一个指针,语法格式如下:func (variable_name variable_data_type) function_name() [return_type]{ /* 函数体*/} 示例:type User struct { Name string Email string} //定义一个方法func (u User) Notify() {

2021-07-05 18:42:19 326

原创 golang的函数

1、函数定义及调用格式:func function_name( [parameter list] ) [return_types] {        函数体} 定义解析:func: func 声明一个函数function_name:函数名称,函数名和参数列表一起构成了函数的签名parameter list:参数列表。参数列表指定的是参数类型、顺序、及参数个数。参数可选,函数可以不包含参数return_types:返回类型

2021-06-30 15:14:52 557

原创 ASCII、GBK、Unicode及UTF-8

背景我们知道,计算机是基于二进制来运算的,所以是不能直接让计算机运行或者保存我们人类的文字信息的,一定是把我们输入的文字变成二进制数来保存。这样就有一个问题了,一个英文字母A 应该用哪个二进制数来表式呢? 假设我在计算机上设置了 A=“00”,你在计算机上设置了A=“01”,甚至每个人都可以约定自己的A是任意一个二进制数,那当我通过网络或者硬盘将我的"00"发送给你,你的计算机是无法判断"00"表示哪个字母或者你正好也有一个字母定义成"00"但是却不是A,所以我们势必要有一个通用的标准,来让所有的计算机统

2021-06-28 14:23:25 307

原创 golang的流程控制之range

range 用于在循环中迭代数组(array)、切片(slice)、通道(channel)或集合(map)中的元素。数组、切片中 range 返回元素的索引和索引对应的值,集合中返回 key-value 对。格式:for key, value := range data { } 可以忽略不想要的返回值,也可以用 “_” 这个特殊变量。func main() { m := map[string]int{"a": 1, "b": 2} for k, v := ra

2021-06-28 11:37:53 266

原创 golang的流程控制之switch

switch 语句中的每一个 case 分支都是唯一的,从上至下逐一测试,直到匹配为止。Go中 switch 语句case匹配项后面不需要加 break。默认 case 最后自带 break ,匹配成功后不会执行其他 case,如果需要执行后面的 case,可以用 fallthrough 。golang中的switch语句能干嘛?1、用作等值判断switch var1 { case val1: ... case val2: ... defaul

2021-06-24 19:49:24 788

原创 golang的结构体struct

Go语言中基础数据类型可以表示事物的基本属性,但是当要表达事物的全部或部分属性时,用单一的基本数据类型无法满足需求,Go中提供了一种自定义数据类型,可以封装多个基本数据类型,该数据类型叫结构体,英文名struct。Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。不过 Go语言可以通过struct来实现面向对象。 1、结构体的定义使用type和struct关键字定义结构体,具体如下:type 类型名 struct { 字段名 字段类型 字段名 字

2021-06-22 15:42:50 810

原创 golang的byte、rune和字符串

1、byte和rune类型byte,占用1个字节,即8 个比特位,它和 uint8 类型本质上没有区别,它表示的是 ACSII 表中的一个字符先定义两个 byte 类型和 uint8 类型的变量 a 和 bfunc main() { var a byte = 65 var b uint8 = 66 fmt.Printf("a 的值: %c \nb 的值: %c", a, b)}在 ASCII 表中,字母 A 的ASCII 的为 65 ,字母 B 的ASCII 为 66,

2021-06-21 15:12:18 1428

原创 golang的map

map是一种无序的基于key-value的数据结构,Go语言中map是引用类型,必须初始化才能使用。1、map的定义定义: map[KeyType]ValueType其中,KeyType表示键的类型,ValueType表示对应值的类型。map类型变量默认初始值为 nil,要使用make()函数分配内存。语法 : make(map[KeyType]ValueType, [cap])其中,cap为map的容量,参数不是必须给的。2、map的基本用法func main() { var m

2021-06-21 14:49:19 22898

原创 golang的new和make

Go中对于引用类型的变量,在使用的时候既要声明它,也要为它分配内存空间,否则值就没办法存储。对于值类型的声明不需要分配内存空间,因为在声明的时候已经默认分配好了。Go语言中 new 和 make 是内建的两个函数,主要用来分配内存。go中的值类型和引用类型:值类型分别有:int系列、float系列、bool、string、数组和结构体引用类型有:指针、slice切片、管道channel、接口interface、map、函数等值类型的特点是:变量直接存储值,内存通常在栈中分配引用类型的特点是:变

2021-06-07 20:32:56 751

原创 golang的切片和数组

一、golang数组数组的定义var a [len]int,如:var a [5]int,数组长度必须是常量,且是类型的组成部分。一旦定义,长度不能变。数组可以通过下标进行访问,下标是从0开始,最后一个元素下标是:len-1,遍历数组一般有以下两种方式:for i := 0; i < len(a); i++ {}for index, v := range a {}ps:数组支持比较,支持 “==”、"!=" 操作符,比较数组类型以及数组中的每一个元素,类型不同不能进行比较。func

2021-06-04 20:05:52 1962 3

原创 Kafka高频面试题(消息中间件)

一、什么是消息中间件    可以看成是在消息的传输过程中保存消息的容器(只保存但不做修改,把他看做日志级别的)。    消息中间件在将消息从它的源中继到他的目标时充当中间人的作用。通过提供消息队列模型和消息传递机制,可以在分布式环境下进行扩展进程间的通信。开发人员不需要考虑网络协议和远程调用的问题,只需要通过各消息中间件所提供的api,就可以简单的完成消息推送和消息接收的业务功能。 二、组成Broker

2021-04-08 18:30:19 624 1

原创 一文读懂vue的生命周期

1、啥是vue的生命周期每个 Vue 实例都有一个完整的生命周期,就好像每个人从呱呱坠地,要经历从儿童、少年、青年、成年到老年等生命阶段一样。一个vue实例要经历从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,这个过程就是其生命周期。简单来说就是vue实例的生命周期就是从实例创建到销毁的整个过程。2、啥是生命周期钩子函数在vue实例的生命过程中会运行一些叫做生命周期钩子的函数,用户可以通过这些钩子函数在不同阶段添加自己的代码的。简单理解,钩子嘛,就是在某个阶段给你一个

2021-03-24 16:25:08 212 1

原创 vue实例中data属性三种写法的区别

有哪三种写法啊?话不多说,先上代码: <!--第一种 --><script> let app = new Vue({ el:'#app', data:{ checked: false } })</script><!--第二种 --><script> let app = new Vue({ el:'#app',

2021-03-11 16:02:47 517 3

原创 vue中方法名:function() {} 和 方法名() {}区别

没有本质区别,后者可以说是前者的简写。methods: { name:function() {}, // ES5写法 name() {} // ES6写法}以上两种写法功能是一样的。

2021-03-11 15:50:01 2297

原创 vue中methods和computed有什么区别

这里先给出结论:    可以将同一函数定义为一个methods方法,亦可以定义为一个computed计算属性,两种方式的最终结果是完全相同的。不同之处在于:计算属性 computed 是基于它们的依赖缓存,只在相关响应式依赖发生改变时才会重新调用求值,否则计算属性会只会直接返回之前的计算结果,而不必再次执。相反,每当触发重新渲染时,methods 函数总会重新调用执行。在调用 methods 方法时需要有括号,而调用 computed 属性则不需要括号。下

2021-03-11 15:36:00 551

原创 两分钟了解什么是CDN

什么是CDN    内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。CDN应用广泛,支持多种行业、多种场景内容加速,例如:图片小文件、大文件下载、视音频点播、直播流媒体、全站加速、安全加速。  CDN工作原理请看下图: 假设通过 CDN 加速的域名为 www.a.com,接入 CDN 网络,开始使用加速服务后,当终端用

2021-03-09 16:47:54 1181

原创 npm install 在下载某个包时卡住不动

问题:    在启动一个vue项目之前,需要执行 npm install 命令安装依赖,本地执行该命令过程中出现一个问题,就是在下载某个包的地方卡住不动了,显示类似 extract:core-js: sill extract source-map@xxx 的字眼。  原因:可能有以下两种原因:1.版本问题导致。node版本或者npm版本太旧,此时需更新版本;2.下载源问题导致。可以使用国内淘宝镜像作为下载源。  解决方法:1.解决版本问题更新node:node官网下载安装包覆盖之前

2021-02-20 19:06:51 43780 4

原创 HTTP的认证方式

什么是认证?    可以这样理解,服务器为了弄清楚究竟是谁在访问服务器,就得让对方的客户端自报家门,这个判断客户端身份的过程就是认证。 HTTP/1.1 使用的认证方式主要有哪些?1、BASIC 认证(基本认证)2、DIGEST 认证(摘要认证)3、SSL 客户端认证4、FormBase 认证(基于表单认证) 1、BASIC 认证(基本认证)    BASIC认证采用Base64编码方式对用户名和密码进行处理,但这不是加密,因为明文解码后就是用户 ID和密码。因此安全风险较高。2、DI

2021-02-20 16:19:53 816

原创 git 查看和修改用户名及邮箱地址

1、git 查看用户名和邮箱:$ git config user.name$ git config user.email2、git 修改用户名和邮箱:$ git config --global user.name "username"$ git config --global user.email "email"

2020-12-03 16:42:20 236

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除