- 博客(294)
- 资源 (1)
- 收藏
- 关注
原创 数据库--从数据库层面看索引
文章目录索引主键索引和非主键索引自增索引覆盖索引联合索引索引重建避免索引重复减少搜索次数索引 索引用于提高查询效率,实现方式有hash表、红黑树、B+树、跳表等,一张表可以根据查询需要建立多种索引 关于这四种数据结构底层实现,参考之前写的数据结构专栏(跳表、hash,轻松玩转红黑树,B+树看它就够了,实战应用等四篇文章) 关系型数据库中表根据主键顺序以索引形式存放,InnoDB采用...
2020-03-15 21:03:42
331
原创 数据库--事务隔离
文章目录事务事务隔离级别读未提交读已提交可重复度可串行化实现原理启动事务方式避免长事务事务 事务保证一组数据库操作要么全成功,要么全失败,mysql中事务在存储引擎层实现 事务包含四个特性:ACID( 即原子性、一致性、隔离性、持久性)事务隔离级别 当数据库中多个事务同时执行可能出现脏读、不可重复读、幻读,而隔离级别的概念就是用于解决上述问题 事务隔离级别包括: 读未提交、读提...
2020-03-14 19:52:31
393
原创 数据库--语句执行流程
文章目录mysql架构sql语句执行流程step1:连接数据库长连接和短连接step2:查询缓存step3:词法分析step4:优化step5:执行step6:写入(仅限更新操作)redo logbinlog完整流程数据回滚mysql架构 Mysql分为服务层和存储引擎两部分 服务处包括 连接器、查询缓存、分析器、优化器、执行器等,所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器...
2020-03-13 20:03:05
1101
原创 数据结构与算法--消息队列底层实现
文章目录消息队列step1:顺序队列step2:循环顺序队列step3:加锁的循环顺序队列step4:针对锁优化多次上锁转为批量一次CAS操作减少加锁粒度消息队列step1:顺序队列 消息队列用来解决类似生产者-消费者模型问题,按照实现方式,分为基于链表实现的链式队列和基于数组实现的顺序队列 对于链式队列,优点是支持无限大,缺点是性能低; 对于顺序队列,优点是性能高,缺点是数量有限...
2020-03-12 11:16:00
1302
原创 数据结构与算法--实战应用
文章目录实战应用推荐系统基于相似用户推荐基于相似歌曲推荐数据库索引设计考虑常用索引结构Redis背后数据结构列表字典集合有序集合搜索引擎搜集分析索引查询接口鉴权精确匹配前缀匹配限流固定时间窗口限流滑动时间窗口限流实战应用推荐系统比如音乐推荐,有两种方式:找口味相似的用户,推荐他们爱听的歌推荐跟喜爱歌曲特征相似的歌基于相似用户推荐 对用户的歌曲进行评分:5(单曲循环)、4(喜爱)...
2020-03-11 12:32:00
261
原创 数据结构与算法--BitMap与Bloom
文章目录BitMapBloom过滤器BitMap 我们有 1 千万个整数,范围在 1 到 1 亿之间。如何快速查找某个整数是否存在? 我们可借助hash,或者开1亿的bool数组(存在为true否则false),但是这些做法都耗费内存。 BitMap通过位运算,只需一个二进制位(bit)来表示true(1)或者false(0),相比bool数组内存缩小8倍伪代码:class B...
2020-03-10 10:11:59
334
原创 数据结构与算法--浅析图
文章目录图存储方式拓扑排序Kahn算法DFS算法单源最短路应用场景图 图的元素叫作顶点,顶点间的连接关系叫做边,跟顶点相连的边的条数称为顶点的度 图根据是否有方向可分为有向图和无向图,有向图的边有方向,度也分为入度(指向顶点的边的个数)和出度(顶点指向的边的个数) 有权重的图称为带权图,也就是边有权值 用图展示下(左上无权无向图、右上无权有向图、左下有权无向图、右下有权有向图):...
2020-03-09 10:59:35
272
原创 数据结构与算法--字符串匹配深度长文
文章目录字符串匹配BF算法RK算法方式一方式二BM算法坏字符规则好后缀规则KMP算法优化版next数组求法伪代码字典树AC**自动机**快速推导失败指针伪代码字符串匹配 就是在串A中查找是否存在串B,此时串A叫做主串,串B叫做模式串。假设串A长度为n,串B为m,则n>=m,在工业级主要应用于搜索引擎、敏感词过滤等BF算法暴力匹配法,时间复杂度为O(nm) 虽然复杂度高,但在...
2020-03-08 14:52:46
524
1
原创 数据结构与算法--堆
文章目录堆及其应用插入调整删除调整应用合并有序小文件高性能定时器求topK大求中位数堆及其应用 堆是一个完全二叉树,分为大顶堆和小顶堆。大顶堆每一个节点的值都必须大于等于其子树中每个节点的值,小顶堆正好相反 既然堆是完全二叉树,那么就可以通过数组来构建堆,父节点下标为i/2,左子节点i×2,右子节点i×2+1实现快速定位。插入调整 记住四个字:自下而上,下图是插入22的流程图:...
2020-03-07 11:37:05
316
1
原创 数据结构与算法--B+树看它就够了
文章目录B+树支持区间查找减少内存耗费查询效率高B+树索引的插入和删除调整B+树 对于数据库,我们主要做到三点:查询效率高、减少内存耗费、支持区间查找,通过改造二叉查找树,我们发明了B+树来存储数据库的索引支持区间查找 树中节点只作为索引,每个叶子节点串在一条双向链表上,这样我们想要查询某个区间,只需要找到最小值,然后通过链表遍历即可。减少内存耗费 上图中每个节点至少占用索引值...
2020-03-05 13:37:44
213
原创 数据结构与算法--轻松玩转红黑树
文章目录二叉树二叉查找树(二叉排序树)支持重复数据时间复杂度红黑树插入调整删除删除调整红黑树 VS AVL树代码二叉树 二叉树每个节点最多有两个子节点。 特殊二叉树有:满二叉树(除叶子节点外每个节点都有两个子节点)、完全二叉树(除最下层外其他层节点全满,且最下层叶子节点靠左排列) 二叉树的存储方式有两种:一种是基于链式存储(通过指针),另一种是基于数组(左子节点为2i,右子节点为2i...
2020-03-02 17:22:43
332
原创 数据结构与算法--跳表、hash
文章目录引子跳表复杂度针对插入、删除导致的跳表退化Hash哈希冲突复杂度简易代码实现工业级hashhash应用安全加密区块链唯一标识数据校验负载均衡hash表+双向链表扩展引子 我们之前学了线性表中的数组和链表,它们之间各有优势和缺点,且链表和数组的优缺点正好互补。那么我们可不可以用一种新的数据结构来代替链表和数组,使其继承它们各自的优点呢? 而接下来所讲的跳表、hash表,都是结合了数...
2020-02-29 14:35:28
1002
原创 数据结构与算法--杂谈(递归、分治、dfs、bfs)
文章目录杂谈递归警惕堆栈溢出对于递归的调试分治在海量数据上的应用DFS伪代码复杂度BFS伪代码复杂度对比dfs和bfs杂谈递归 递归满足三个条件: (1)问题可以拆分为几个更小的子问题 (2) 子问题除了数据范围和规模不同,求解思路完全一样 (3) 存在递归终止条件 递归的优点是比较直观; 缺点就是空间复杂度高、有堆栈溢出的风险、存在重复计算、大量函数调用耗时较多等问题警惕堆栈...
2019-12-28 16:32:03
468
原创 数据结构与算法--查找和排序
文章目录查找与排序排序关于稳定性关于内部和外部排序选择排序复杂度冒泡排序复杂度插入排序复杂度插入排序优于冒泡?归并排序复杂度快速排序复杂度降低最坏情况发生的概率快排比优于归并排序?扩展小作业桶排序复杂度优化空间利用适应场景基数排序复杂度高效通用排序思考题二分查找复杂度三要素变型查找与排序 建议大家好好看看查找、排序这两个程序员的必修课,希望大家能学有所获排序 常见的排序有:冒泡排序、插...
2019-12-18 23:07:05
308
原创 数据结构与算法--线性表
文章目录线性表数组复杂度优化思路针对数组的插入操作针对数组的删除操作注意事项扩展小作业链表复杂度优化思路注意事项扩展小作业栈复杂度应用场景扩展小作业队列复杂度优化思路应用场景扩展小作业线性表 线性表数据排列像线一样,每个线性表的数据最多只有前和后两个方向。数组、链表、队列、栈等都是线性表结构。数组 数组是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。 连...
2019-12-16 22:21:26
245
原创 数据结构与算法--复杂度
文章目录复杂度时间复杂度规则常见的时间复杂度最好、最坏、平均时间复杂度空间复杂度规则常见的空间复杂度复杂度 复杂度也叫渐进复杂度,包括时间复杂度和空间复杂度,用来分析算法执行效率与数据规模之间的增长关系。 复杂度分析可以在初期帮助程序员预估该程序的性能耗费。 时间复杂度用于表示算法的时间耗费与数据规模增长之间的关系 空间复杂度用于表示算法的存储空间与数据规模增长之间的关系时间...
2019-12-15 21:51:55
465
原创 Vim精简版(常用)
//光标h、j、k、l分别代表左下上右0代表行首,$代表行尾gg代表文件的开头,G代表文件的末尾nG或者ngg代表第n行//删除x 删除所在字符dw 删除所在单词d0 从行首删到光标前d$ 从光标删到行尾dd 删除所在行ndd 删除光标所在行开始的n行//撤销u 撤销ctrl+r 反撤销//复制粘贴yy 复制一行nyy 从光标所在行起复制n行p 粘贴到光标...
2019-06-02 19:45:36
612
原创 Linux复习归纳10-tcpdump和Wireshark下篇
LinuxLinux复习归纳10~tcpdump和Wirshark抓到的报文格式第一列:时间戳,分别代表时、分、秒、微秒第二列:网际网路协议名称第三列:报文发送方的网际网路协议地址和端口第四列:> (用于指向接收方)第五列:报文接收方的网际网路协议地址和端口(有时不是端口而是协议名比如http)第六列::第七列:Flags标识,可能取值是[S.] [.] [P.] [F...
2019-06-02 17:01:04
305
原创 Linux复习与归纳9-tcpdump和Wirshark上篇
LinuxLinux复习与归纳9~tcpdump和Wirshark tcpdump可用于网络问题的调试,它是基于Unix系统命令行式的数据包嗅探工具,可以抓取流动在网卡上的数据包。 tcpdump只能抓取流经本机的数据包。如果要抓取其它主机MAC地址的数据包,必须开启网卡混杂模式(就是允许网卡抓取任何经过它的数据包,不管该数据包是不是发给它的) 开启混杂模式的命令:$ ifco...
2019-05-23 23:47:47
270
原创 Linux复习归纳8-练习题
LinuxLinux复习归纳8~习题Case 1:echo $[`tr -s -c '0-9' '+' '+' < test.txt`0]cat test.txt | tr 'A-Z' 'a-z'文件重命名:mv Words.sh `echo Words.sh | tr 'a-z' 'A-Z'`Case 2:echo $PATH | tr ':' '\n' | ta...
2019-05-23 11:01:57
228
原创 Linux复习归纳7-awk
LinuxLinux复习归纳7~awk AWK适合文本处理和报表生成,最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息。它是以文件的一行作为处理单位。格式awk '{pattern + action}' {filenames} //其中pattern表示查找的内容,action是找到匹配内容后执行的一系列命令 举个简单的例子1. echo ok | awk '{prin...
2019-05-23 10:47:41
205
原创 Linux复习归纳6-sed
LINUXLinux复习归纳7~sed sed是一种流编辑器,能够完美配合正则表达式。 它会先把要处理的行存储在临时缓冲区,接着用sed命令处理缓冲区的内容。处理完成后把缓冲区的内容输出到屏幕,接着处理下一行直到文件末尾。 sed常见的参数:-n //取消默认的完整输出,只要需要的-e //允许多项编辑-i //修改文件内容-r //不需要转义 sed常见命令:a...
2019-05-20 21:24:42
186
原创 Linux复习归纳5-top
LINUXLInux复习归纳5~TOP用于实时显示进程的状态,默认显示cpu密集型的进程,5秒更新一次。信息包括:第一行为任务队列信息:包括当前时间、系统启动持续时间、当前登录用户数、系统负载(也就是任务队列的平均长度)第二行为进程信息:包括进程总数、正在运行数、睡眠进程数、已停止数、僵尸进程数第三行为CPU信息:包括us(用户空间占用CPU百分比)、sy(内核空间占用CPU百分比)、...
2019-05-20 19:10:28
211
原创 Linux复习归纳4-高级命令
文章目录LINUX高级命令sortcutsplituniqtrteexargsgrepLINUXLInux复习归纳4~高级命令sort 用于排序,具体用法:sort 文件 //将文件的每一行作为单位进行比较-u 用于去除重复行-n 对于数字文件来说,按照数字进行排序-o 排序结果重定向到文件(不能用>符)cut 用于切割,具体用法:cut -c 范围 文件名...
2019-05-18 13:30:37
436
原创 Linux复习归纳3-特殊符号和命令
LINUXlinux复习归纳3~特殊符号和命令ctrl+z 对程序进行挂起bg 对挂起的命令后台运行fg 可以将后台执行的命令转为前台jobs 可以查看所有在后台执行和挂起的任务& 在命令后加&代表后台执行``命令中如果包含另一个命令,则用``将它括起来,在执行时优先执行``中的子命令,然后将其结果带入父命令继续执行重定向 具体有以下几...
2019-05-16 09:38:37
191
原创 Linux复习归纳2-其它常用命令
linux复习归纳2~查找和检索find find命令用于查找文件,格式为:find 路径 [选项] 内容,它有很多选项,比如:-name(按照名字查找,比如查找*.c文件,则为-name "*.c")-type(按照类型查找,比如查找目录,则为 -type d)-size(按照大小查找,比如大于1M小于5M,则为-size +1M -size -5M)-maxdepth(用于...
2019-05-16 08:39:50
161
原创 Linux复习归纳1-文件和基本命令
文章目录Linux系统目录结构常用命令与命令相关manhistory切换管理员与目录相关lspwdtreecdmkdirtouchrmcpmvwhich与文件相关catmore和lesshead和taillnunlinkchmodchown与chgrp与统计相关wcdu与系统有关whoamidf通配符Linux 把自己所学的linux整理归并一下~系统目录结构 Linux一切皆文件!...
2019-05-15 21:33:35
204
原创 数据库索引
文章目录HashB+树LSM TREE倒排索引 索引用于帮助我们快速找到想要的数据,Mysql的索引是B+树,Redis的索引是hash,HBase的索引是LSM树等等 没有最好的索引,只有最适合的索引。不同的索引是为了解决不同的问题而实现的Hash 这里就不详细将Hash的原理了。Hash查询的时间复杂度是O(1)的,速度快。但是hash只适合随机查找,不适合范围查找,因为它是无序...
2019-05-13 21:18:58
189
原创 保持DB和缓存一致性
文章目录Cache Aside PatternRead/Write Through PatternWrite Behind Caching Patternmysql更新缓存方式 对于维持DB和缓存的一致性,我们先假设更新数据库和更新缓存都可以成功的情况。 主要有以下几种方法:Cache Aside Pattern 对于一致性更新,先把数据存到数据库中,成功后再让缓存失效 这时,...
2019-05-13 18:50:14
827
原创 事务隔离级别、脏读、不可重复读、幻读
文章目录数据库隔离级别读未提交读已提交可重复读可串形化数据库隔离级别 事务隔离是多个事务同时进行时的隔离。它们之间的相互影响与隔离级别有关 数据库隔离级别数据库事务的隔离级别有4个,分别是读未提交(可能出现脏读、不可重复读、幻读)、读已提交(可能出现不可重复读、幻读)、可重复读(可能出现幻读)、可串形化。隔离级别越来越高,事务之间的影响越来越小,效率越来越低读未提交 举个例子:两...
2019-05-13 17:41:29
276
原创 缓存
文章目录缓存出现的原因缓存模型缓存数据的方法局部性原理缓存缓存淘汰算法 之前也有说过缓存的三大问题及解决方案:可以 跳转 到这儿看一下 结合网上查阅的博文,整体说一下缓存的概念缓存出现的原因 缓存出现的目的只有一个:缓冲不同介质IO速度,从而加快访问速度 对于不同介质之间的数据传输,速度快和速度慢的不匹配,会导致速度快的长时间处于等待状态,造成资源的浪费,最典型的例子就是CPU和...
2019-05-13 12:11:38
431
原创 存储介质
文章目录内存结合实际固态硬盘SSD为什么内存会被固态硬盘快磁盘 影响程序运行效率最大的两个因素:算法和IO快慢。其中影响IO快慢,就是各种存储介质的工作原理了。内存 内存由晶体管和电容组成,晶体管是控制电容充放电的开关(电容充满电是0,放完电是1),一个基本单元可以存储1bit数据。内存单元按照一定顺序排列成矩阵,就是内存。然后给它们的每个单元编上号,这个编号就是内存地址。 从内...
2019-05-13 10:07:28
827
原创 唯一id生成算法
文章目录UUID 和 GUID数据库自增主键数据库自增主键优化数据库自增主键再优化时间戳snowflake算法为递增的优势 我们在很多情况下都需要用到一个唯一标识,比如一个用户id,一个订单号等等。因此,我们需要设计一种算法来保证标识的唯一性。 具体算法:UUID 和 GUID UUID含义是通用唯一识别码,让分布式系统中的所有元素,都能有唯一的辨识数据库自增主键 这种实现方...
2019-05-11 21:37:19
2194
原创 一致性哈希
文章目录一致性哈希实现方法改进和扩展应用一致性哈希 一致性哈希是一种特殊的哈希,当哈希表的大小发生变化的时候,平均只有n / m(n为key总数,m为哈希表的大小)个key值需要重新计算映射关系。解决了一般哈希算法,当hash表发生变化几乎所有key都要重新映射的问题。实现方法1. 一致性hash通过一个hash环来实现,将环分为2^32份2. 数据key经过hash函数得到的整型一...
2019-05-11 11:48:56
187
原创 布隆过滤器
文章目录布隆过滤器算法内容:布隆过滤器的概率推导:推导结论应用场景布隆过滤器 用于判断一个元素是否在某个集合中。相比hash,它不需要存储key值更加节省空间,而且由于不存储key值保密性更好。但是有一定概率判断出错,且无法删除集合中的元素。(以差错率换取空间)算法内容: 它主要就是对hash的扩展和更改,牺牲了一部分的准确性来换取时空的效率。它的算法核心是:添加时: 1.开一个...
2019-05-10 13:04:38
265
原创 动态库和静态库相关
文章目录静态库静态库特点静态库的创建静态库的查看静态库的使用动态库动态库特点动态库的创建动态库的使用 讲静态库和动态库之前,先说一下gcc的编译流程: (图片来自室友男神,地址:跳转) 至于静态库和动态库,他们的区别在于链接阶段的处理不同(一个静态链接方式,一个动态链接方式)静态库 目标文件.o与静态库一起链接成可执行文件,对应的链接方式为静态链接。它和.o文件类似,可以简单看...
2019-05-09 20:38:42
164
原创 C++对象内存模型
文章目录C++对象内存模型多继承情况虚继承情况存在虚函数情况虚函数多继承情况C++对象内存模型 一般来说,类成员变量存储顺序按照声明的顺序从低地址到高地址顺序存储。 对于类的静态成员变量,它单独存储在程序的.data段中,不与特定的对象相关联。 如果子类和父类的成员变量(或成员函数)同名,则父类的成员变量(或成员函数)会被隐藏(当然它可以通过类名受限的方式来访问),具体如下:cla...
2019-05-08 23:43:18
218
原创 C++顺序内存模型
强顺序内存模型 CPU按照正确的指令顺序执行弱顺序内存模型 CPU为了性能提升,采用流水线技术,进一步挖掘指令的并行性,一段连续指令使用了不同的寄存器和内存地址,因此一些处理器可能会讲指令执行的顺序打乱执行。这就是弱顺序的内存模型。这种可能会导致错误发生,比如:int thread_1(){ int t = 1; a = t; b = 2;}int t...
2019-05-08 20:58:01
480
原创 C++内存模型
文章目录C++内存模型分成多个区的原因栈区堆区静态区(全局区)常量区代码区C++内存模型 C++内存由高地址到低地址依次是栈区(向下增长,用于存放函数内的局部变量,形参和函数返回值。系统会自动管理栈区的内存分配与回收)、堆区(向上增长,由程序员主动申请和释放,容易造成内存泄漏)、静态区(也叫全局区,静态变量和全局变量的存储区域一样,静态区的内存直到程序完全结束才会被释放)、常量区(用于存放常...
2019-05-08 20:57:23
1944
原创 操作系统杂谈-1
文章目录操作系统作为系统资源的管理者:操作系统为上层提供服务:操作系统为下层实现的功能:操作系统的四个特征:并发、共享、虚拟、异步。指令和代码的区别:内核的核心:大内核和微内核中断:进程控制块:进程的组织进程控制:进程间通信:通信之共享内存:通信之管道:线程控制块和线程切换:用户级线程和内核级线程。高级调度(作业调度):中级调度(内存调度):低级调度(CPU调度):在什么时候不能进行进程间切换:临...
2019-05-07 17:16:35
338
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人