- 博客(68)
- 收藏
- 关注
原创 Mysql的MVCC机制分析
InnoDB 首先检查当前行的 trx_id(即最后一次修改该行的事务 ID),如果这个 trx_id 符合 Read View 的可见性规则,则直接返回该行版本给事务。如果当前行的 trx_id 不符合 Read View 规则,InnoDB 会使用行中的 roll_ptr 字段(回滚指针)指向 undo 日志中的旧版本记录。每开启一个事务都会从数据库中获得一个事务 id,一般会使用全局的单调递增的计数器来生成全局唯一的id,可通过 id 大小来判断事务的时间顺序。此时,查询结果中不会包含这条记录。
2025-01-06 19:31:06
676
原创 Mysql事务的特性和隔离级别
上面讨论的事务特性中的隔离性,理论上某个事务对数据进行访问时,其他事务应该排队,当该事务提交后,其他事务才可以继续访问该数据,不过此时并发事务的执行就变成了串行化执行。一组操作要么全部成功,要么全部失败。为解决事务并发带来的上述问题,MySQL 提出事务隔离级别,不同的事务隔离级别可以解决不同的问题。一个事务被视为一个不可分割的最小单元,这个事务中的操作要么都成功,要么都失败,不能只是执行其中的一部分。并发执行的各事务之间不能互相干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的。
2025-01-06 15:02:02
814
原创 Redis的大key和热key问题
结合具体业务场景,将 key:value 这一个热 key 复制写入多份,例如 key1:value, key2:value,访问的时候访问多个 key,但 value 是同一个,以此将 qps 分散到不同实例上,降低负载。大 key:结合具体业务场景,将大 key 进一步拆分为小 key,例如一个 string 大 key 拆分成多个 string 重新写入,但拆分后数据更新需要业务侧控制。:使用限流算法(如令牌桶算法)限制对 hot_key 的请求频率,例如每秒最多允许 1000 次请求。
2025-01-03 15:03:07
1141
原创 Kafka为什么快(高性能的原因)
另外还有个关键操作,就是 kafka 在写数据的时候是以磁盘顺序写的方式来进行落盘的,即将数据追加到文件的末尾,而不是在文件的随机位置来修改数据,对于普通机械磁盘,如果是随机写的话,涉及到磁盘寻址的问题,导致性能极低,但是如果只是按照顺序的方式追加文件末尾的话,这种磁盘顺序写的性能基本可以跟写内存的性能相差无几。每个 segment 文件都是一个独立的文件,它包含一定数量的消息。Kafka内部,消息都是以“批”为单位处理的,Kafka的客户端SDK在实现消息发送逻辑的时候,采用了异步批量发送的机制。
2025-01-03 11:21:01
1297
原创 Kafka的rebalance机制
例如:同一消费者组中,有 3 个消费者 C0、C1 和 C2,他们共订阅了 3 个主题:t0、t1 和 t2,这 3 个主题分别有 1、2、3 个分区(即:t0有1个分区(p0),t1有 2 个分区(p0、p1),t2 有 3 个分区(p0、p1、p2)),即整个消费者所订阅的所有分区可以标识为 t0p0、t1p0、t1p1、t2p0、t2p1、t2p2。举例,有三个消费者 C0,C1,C2。每个主题各有两个分区, t0p0,t0p1,t1p0,t1p1,t2p0,t2p1,t3p0,t3p1。
2025-01-02 11:58:23
1162
原创 Mysql面试之索引
一、啥是索引一种高效获取数据的数据结构。通俗的说,数据库索引像一本书的目录,能加快数据的查询速度。一般来说索引本身很大,不可能全部存储在内存中,因此索引往往是存储在磁盘上的文件中的(可能存储在单独的索引文件中,也可能和数据一起存储在数据文件中)。通常所说的索引,包括聚集索引、组合索引、唯一索引等等,默认都是使用 B+ 树结构组织的。 二、索引有啥优点和缺点优点:提高数据检索的效率,降低数据库的 IO 成本。通过索引列对数据进行排序,降低了数据排序成本,降低 CPU 消耗。(1)被
2022-01-14 16:22:28
5159
原创 Mysql面试之三大log
快,开篇大伙先思考一个问题,MySQL 是怎么保证数据不丢失的呢?其实要保证数据不丢失,说白了要具有下面两种能力:(1)能恢复到任何时间点的状态;(2)能保证 MySQL 在任何时间段突然宕机重启,已提交的数据不会丢失,未提交完整的数据也会自动回滚;这不就引出来今天要聊的主题了么,实现第一点需要用 bin log,实现第二点需要用 redo log 和 undo log。 了解三大log之前,我们先看一下Mysql数据更新的流程:上面这张图包含了 redo log、bin log、
2021-12-14 11:35:14
12499
2
原创 剑指offer栈、队列、位运算题目汇总(面试必备)
剑指 offer 栈、队列题目汇总(C++版) 1、用两个栈实现队列用两个栈实现一个队列。队列的声明如下,实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 返回 -1 )思路:我们知道队列特点是先进先出,而栈的特点是先进后出。因此我们使用栈1来存储数据,栈2来模拟队列弹出数据。栈2如果为空,就需要把栈1的数据全都 push 过来,否则如果栈2不为空,取出栈顶元素即可。
2021-11-18 10:15:33
4919
原创 剑指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
458
原创 二分查找算法模板(太强了吧)
二分查找算法模板 模板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
289
原创 剑指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
272
原创 正向代理、反向代理和负载均衡
要理解正向和反向代理,简单说就是要整明白到底代理服务器代理了谁后者说代理服务器为谁服务?别急,一点点往下看。 一、正向代理1、啥是正向代理就是一个在客户端和目标服务器之间的服务器(称为代理服务器),帮助客户端从目标服务器获取内容。此时目标服务器是不知道访问自己的是真实的客户端还是客户端找的代理。比如要访问国外网站,直接访问不通,那么就可以找一个代理服务器为我们服务,客户端发请求到代理服务器,代理服务器把请求转发到目标服务器让后把结果拿回来返回给客户端。我靠,原来正向代理说白了就是
2021-10-08 10:15:58
4271
4
原创 Mysql面试之体系结构简介
一图降十会,先上结构图瞅瞅 下面从上到下依次介绍:自顶向下一共有四层,分别是网络连接层,服务层(核心层),存储引擎层,系统文件层。1、网络连接层:主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都对线程进行创建和销毁。当客户端连接到 MySQL 服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过 SSL 证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。这一层并不是 MyS
2021-09-30 11:24:12
240
原创 Mysql面试之主从复制(同步)
一、为什么需要 Mysql 主从复制1、在业务复杂的系统中,有这样一个情景,有一句sql语句需要锁表,导致暂时不能使用读的服务,那么就会影响运行中的业务,使用主从复制,让主库负责写,从库负责读,这样即使主库出现了锁表,通过读从库也可以保证业务的正常运作。2、做数据的热备冷备:读写操作均不可进行温备:读操作可执行;但写操作不可执行热备:读写操作均可执行3、架构的扩展。业务量越来越大,I/O访问频率过高,单机无法满足,此时做多库的存储,降低磁盘I/O访问的频率,提高单个机器的I/O性能。 
2021-09-30 10:51:39
666
原创 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
194
原创 Redis面试之单机、主从、哨兵、集群模式
一、单机模式就是安装一个 redis 供业务方调用,没什么好说的,适用于对高可用要求低的场景。优点:部署简单,成本低,不需要同步数据缺点:1、可靠性差,宕机数据可能丢失2、性能受限于CPU的处理能力,容量不能水平扩展 二、主从同步(复制)不是单机了,至少得有两个redis服务器,将一台 redis 服务器当做主节点(master),其他 redis 服务器作为主节点的从节点(slave),可以将 master 的数据复制到其他 slave 节点(数据的复制是单向的,只能由主节点到
2021-09-29 11:26:40
347
原创 Redis面试之持久化机制(RDB、AOF)
所谓知其然知其所以然,开篇咱们先考虑一个问题,那就是Redis为什么需要将数据持久化呢,快,先思考一分钟!好了,大家都知道 redis 将数据存储在内存里,但是不怕一万就怕万一,万一哪天机器咔嚓一下宕机了,那么后果可能很操蛋,数据可能会全部丢失,为了避免这种糟糕的情况就需要持久化机制来保证数据不会因为某些故障而丢失。下面进入正题Redis 的持久化机制主要有两种:一是RDB快照,二是AOF日志。一、RDB快照这种机制是将内存中数据以快照的方式写入到二进制文件里,默认的文件是 dump.rdb。
2021-09-23 14:40:33
420
原创 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
242
原创 缓存穿透、缓存击穿和缓存雪崩
1、缓存穿透缓存和数据库中都没有的数据,但是用户不断发起请求,如发起为 id 为“-1”的数据或id为特别大不存在的数据。此时所有的请求都会打到数据库上,导致数据库压力过大。解决方案:(1)接口层增加校验,如用户鉴权校验,id做基础校验,id<=0 的直接拦截(2)如果从缓存和数据库中都没有取到数据,也可以将 key-value 对写为 key-null,然后将缓存有效时间设置短点,如30秒(设置太长会导致正常情况也没法使用)。这样可以防止攻击用户反复用同一个 id 暴力攻击(3)布隆过滤器
2021-09-16 17:23:02
340
原创 剑指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
370
原创 面试中常考排序算法总结(不看后悔)
面试中常见的排序算法(C++版) 前置基础知识:稳定:a=b且a在b前面,排序之后a仍然在b的前面不稳定:a=b且a在b前面,排序之后 a 可能会出现在 b 的后面时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现的规律空间复杂度:算法在计算机内执行时所需存储空间的度量,它也是数据规模n的函数 1、冒泡排序流程:比较相邻的元素。如果第一个比第二个大,就交换它们两个;对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该
2021-09-03 10:59:06
552
原创 二叉树遍历算法总结(递归+非递归)
二叉树的前序中序后序层序遍历总结(C++版) 1、前序遍历(根左右)递归:没什么好说的void preOrder(TreeNode* root){ if (!root) return; cout << root->val << " "; preOrder(root->left); preOrder(root->right);} 非递归:借助栈前序遍历根左右,先将当前节点打印,并将其进栈,节点指向
2021-09-02 18:55:47
349
原创 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
5130
原创 golang的并发编程
一、进程、线程、协程、并发、并行1、进程、线程、协程1.1 进程:对操作系统来说,进程是资源分配的最小单位,程序启动时,操作系统就会给这个程序分配一块内存空间,对于程序本身而言它认为这是一整块连续的内存空间,称为虚拟内存空间,而实际上落实到操作系统内核时通常是一块块的内存碎片。一个进程大小可能是几个G,进程之间切换开销较大,进程可以实现操作系统的并发。这片虚拟内存空间,可以划分为内核空间和用户空间,它们相互隔离,程序即使崩溃了,内核空间也不会受到影响。进程运行在内核空间时称为内核态,运行在用户空间
2021-07-26 15:54:34
3285
原创 golang的接口
一、接口是什么、为什么需要接口是什么:接口(interface)是一组仅包含方法名、参数、返回值的未具体实现的方法的集合。接口只定义规范而不去实现,细节由具体的对象来实现。golang中接口是一种抽象的类型。为什么:大多情况下,一些数据可能包含不同的类型,但是可能会有一个或者多个共同点,这些共同点就是抽象的基础。Go的接口类似c++的多态,接口相当于实现一个父类,然后派生类具体实现父类的虚函数,最后通过父类指针指向不同的派生类对象去调用那个派生类对象的虚函数,从而实现多态。举例说明一下,比如三角形,四边
2021-07-15 16:33:45
10180
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
23207
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
396
原创 golang的函数
1、函数定义及调用格式:func function_name( [parameter list] ) [return_types] { 函数体} 定义解析:func: func 声明一个函数function_name:函数名称,函数名和参数列表一起构成了函数的签名parameter list:参数列表。参数列表指定的是参数类型、顺序、及参数个数。参数可选,函数可以不包含参数return_types:返回类型
2021-06-30 15:14:52
667
原创 ASCII、GBK、Unicode及UTF-8
背景我们知道,计算机是基于二进制来运算的,所以是不能直接让计算机运行或者保存我们人类的文字信息的,一定是把我们输入的文字变成二进制数来保存。这样就有一个问题了,一个英文字母A 应该用哪个二进制数来表式呢? 假设我在计算机上设置了 A=“00”,你在计算机上设置了A=“01”,甚至每个人都可以约定自己的A是任意一个二进制数,那当我通过网络或者硬盘将我的"00"发送给你,你的计算机是无法判断"00"表示哪个字母或者你正好也有一个字母定义成"00"但是却不是A,所以我们势必要有一个通用的标准,来让所有的计算机统
2021-06-28 14:23:25
366
原创 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
328
原创 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
902
原创 golang的结构体struct
Go语言中基础数据类型可以表示事物的基本属性,但是当要表达事物的全部或部分属性时,用单一的基本数据类型无法满足需求,Go中提供了一种自定义数据类型,可以封装多个基本数据类型,该数据类型叫结构体,英文名struct。Go语言中没有“类”的概念,也不支持“类”的继承等面向对象的概念。不过 Go语言可以通过struct来实现面向对象。 1、结构体的定义使用type和struct关键字定义结构体,具体如下:type 类型名 struct { 字段名 字段类型 字段名 字
2021-06-22 15:42:50
948
原创 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
1667
原创 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
23170
原创 golang的new和make
Go中对于引用类型的变量,在使用的时候既要声明它,也要为它分配内存空间,否则值就没办法存储。对于值类型的声明不需要分配内存空间,因为在声明的时候已经默认分配好了。Go语言中 new 和 make 是内建的两个函数,主要用来分配内存。go中的值类型和引用类型:值类型分别有:int系列、float系列、bool、string、数组和结构体引用类型有:指针、slice切片、管道channel、接口interface、map、函数等值类型的特点是:变量直接存储值,内存通常在栈中分配引用类型的特点是:变
2021-06-07 20:32:56
852
原创 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
2058
3
原创 Kafka高频面试题(消息中间件)
一、什么是消息中间件 可以看成是在消息的传输过程中保存消息的容器(只保存但不做修改,把他看做日志级别的)。 消息中间件在将消息从它的源中继到他的目标时充当中间人的作用。通过提供消息队列模型和消息传递机制,可以在分布式环境下进行扩展进程间的通信。开发人员不需要考虑网络协议和远程调用的问题,只需要通过各消息中间件所提供的api,就可以简单的完成消息推送和消息接收的业务功能。 二、组成Broker
2021-04-08 18:30:19
835
1
原创 一文读懂vue的生命周期
1、啥是vue的生命周期每个 Vue 实例都有一个完整的生命周期,就好像每个人从呱呱坠地,要经历从儿童、少年、青年、成年到老年等生命阶段一样。一个vue实例要经历从开始创建、初始化数据、编译模板、挂载Dom、渲染→更新→渲染、卸载等一系列过程,这个过程就是其生命周期。简单来说就是vue实例的生命周期就是从实例创建到销毁的整个过程。2、啥是生命周期钩子函数在vue实例的生命过程中会运行一些叫做生命周期钩子的函数,用户可以通过这些钩子函数在不同阶段添加自己的代码的。简单理解,钩子嘛,就是在某个阶段给你一个
2021-03-24 16:25:08
277
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
599
3
原创 vue中方法名:function() {} 和 方法名() {}区别
没有本质区别,后者可以说是前者的简写。methods: { name:function() {}, // ES5写法 name() {} // ES6写法}以上两种写法功能是一样的。
2021-03-11 15:50:01
2434
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人