- 博客(173)
- 收藏
- 关注
原创 【Linux篇】日期和时区(date命令)
格式化字符串:通过特定的字符串来标记,来控制显示的日期格式。由于中间有空格,所以使用双引号包围格式化字符串,作为整体。-d选项,可以按照给定的字符串显示日期,一般用于日期计算。安装ntp:yum -y install ntp;当ntpd启动后会定期的帮助我们联网校准系统时间。通过date命令可以在命令行中查看系统时间。语法:date [-d] [+格式化字符串]-d按照给定的字符串标记,一般用于日期计算。我们可以通过ntp程序自动校准系统时间。-d可以和格式化字符串一起使用。
2024-08-25 20:57:40
31
原创 【Linux篇】软件安装与systemctl控制软件
比如:yum -y install ntp软件,可以通过ntpd服务名,配合使用systemctl进行软件控制。Linux系统同样支持这两种方式,我们首先,先使用Linux命令行内的"应用商店",yum命令安装软件。Linux系统很多软件(内置或第三方)均支持使用systemctl命令控制:启动,停止,开机自启。yum:PRM包软件管理器,用于自动化安装配置Linux软件,并可以自动解决依赖问题。除了内置的服务外,部分第三方软件安装后也可以以systemctl进行控制。yum命令需要联网。
2024-08-25 17:44:08
176
原创 【Linux篇】Linux的用户和权限
无论是Windows,MacOS,Linux均采用多用户的管理模式进行权限管理。在Linux系统中,拥有最大权限的账户名为:root(超级管理员)。root用户拥有最大的系统操作权限,而普通用户在许多地方的权限是受限的。比如使用普通用户在根目录下创建文件夹是不允许的。使用su - root命令可以切换到root用户,此时可以进行该mkdir命令。普通用户的权限,一般在其HOME目录内是不受限的。一旦出了HOME目录,大多数地方,普通用户仅有只读和执行权限,无修改权限。
2024-08-24 20:28:04
428
原创 【Linux篇】vim编译器
vi / vim是visual interface的简称,是Linux中最典型的文本编辑器。同图形化界面中的文本编辑器一样,vi是命令行下对文本文件进行编辑的绝佳选择。vim是vi的加强版本,兼容vi的所有指令,不仅能编译文本,而且还具有shell程序编程的功能,可以不同颜色的字体来辨别语法的正确性,极大的方便了程序的设计和编辑性。
2024-08-24 19:36:04
129
原创 【Linux篇】Linux命令基础
命令行:即Linux终端,是一种命令提示符页面。以纯"字符"的形式操作系统,可以使用各种字符化命令对系统发出操作指令。命令:即Linux程序。一个命令就是Linux的程序。命令没有图形化页面,可以在命令行(终端中)提供字符化的反馈。
2024-08-23 15:20:24
997
原创 【数据结构与算法 | 图篇】最小生成树之Kruskal(克鲁斯卡尔)算法
克鲁斯卡尔算法(Kruskal's algorithm)是一种用于寻找加权图的最小生成树(Minimum Spanning Tree, MST)的经典算法。这种算法是由约瑟夫·克鲁斯卡尔(Joseph Kruskal)提出的,并且适用于所有类型的加权无向图,特别是那些边比较稀疏的图。Prim算法更偏重于图的顶点,而克鲁斯卡尔算法更偏重于图的边。
2024-08-19 23:39:15
422
原创 【数据结构与算法 | 图篇】并查集(DisjointSet)
并查集(Disjoint Set)是一种树形的数据结构,用于处理一些不交集的合并及查询问题。它在图算法、计算机科学和编程竞赛中非常常见。查找(Find):确定一个元素属于哪个集合。通常实现为查找该元素所在集合的代表元或根节点。合并(Union):将两个集合合并成一个集合。
2024-08-19 17:38:52
316
原创 【数据结构与算法 | 图篇】最小生成树之Prim算法
普里姆算法(Prim's Algorithm)是一种用于寻找加权无向图中的最小生成树(Minimum Spanning Tree, MST)的贪心算法。最小生成树是指对于一个给定的无向图,连接所有顶点且边的总权重最小的生成树。
2024-08-18 01:23:32
412
原创 【数据结构与算法 | 图篇】Floyd-Warshall算法(多源最短路径算法)
Floyd-Warshall算法是一种在有向图或无向图中寻找所有顶点对之间的最短路径的动态规划算法。该算法可以处理带权重的边,并且能够正确处理负权重的边(但不包括负权重循环),不过它不能处理包含负权重循环的情况,因为这种情况下最短路径是没有定义的。
2024-08-18 00:40:26
632
原创 【数据结构与算法 | 图篇】Bellman-Ford算法(单源最短路径算法)
前文的迪杰斯特拉算法不能求解有负边的图的最短路径的问题。而此文的Bellman-Ford可以处理含负权边的图算法,并且能检测出图中是否存在负环(权重和为负数的环).
2024-08-16 22:44:01
163
原创 【数据结构与算法 | 图篇】Dijkstra算法(单源最短路径算法)
由图:如果我们想要求得节点1到节点5(也可以是其他节点)的最短路径,我们可以使用Dijkstra算法。
2024-08-15 22:29:41
534
原创 【数据结构与算法 | 图篇】拓扑排序
拓扑排序是是一种针对有向无环图进行的排序方法。它将图中所有顶点排成一个线性序列,使得对于图中的每一条有向边(u, v),顶点u在序列中都出现在顶点v之前。从队列中取出一个节点并输出;对于该节点指向的所有邻接节点,减少它们的入度值。如果某个邻接节点的入度变为0,则将其入队。如果输出的节点数量等于图中总节点数,则拓扑排序成功;找到所有入度为0的节点,并将它们加入到队列。
2024-08-14 23:42:33
201
原创 【数据结构与算法 | 图篇】图的概念及BFS,DFS相关代码
图的连通性:如果两个顶点之间存在路径,就说明这两个顶点是连通的,如果所有顶点都连通,则该图被称之为连通图,如子图连通,则称为连通分量。权(weight):边可以有权重,代表从源顶点到目标顶点的距离,费用或其他度量。度是指与该顶点相邻的边的个数。有向图细分为出度和入度。路径被定义为从一个顶点到另一个顶点的一系列连续的边。图是由顶点和边组成的数据结构。
2024-08-14 18:59:40
267
原创 【数据结构与算法 | 排序篇】力扣1122,1636
中出现过的元素需要按照升序放在。中的每个元素都出现在。中的元素进行排序,使。for循环暴力破解。
2024-08-13 17:28:21
149
原创 【数据结构与算法 | 排序篇】排序算法
注意:稳定和不稳定的依据是,相同的两个值,比如4*(*是为了区分后者的4,没其他特殊含义), 4,如果在排序前,4*在4的前面,排序后,4*依然在4的前面,则该排序是稳定的排序;优化手段:每次循环时,若能确定更合适的右边界,则可以减少很多冒泡轮数。以数组3,2,1的冒泡排序为例,未排序区域就剩下一个元素,结束。下面逐一写上述的排序算法。
2024-08-11 21:27:25
356
原创 【数据结构与算法 | 哈希表篇】力扣136, 242
除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
2024-08-11 14:50:23
224
原创 【数据结构与算法 | 搜索二叉树篇】力扣701, 700
可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。,新值和原始二叉搜索树中的任意节点值都不同。给定二叉搜索树(BST)的根节点。没啥好说的,直接秒。
2024-08-10 18:03:32
283
原创 【数据结构与算法 | 哈希表篇】力扣1, 3, 217
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。整数,并返回它们的数组下标。你可以按任意顺序返回答案。,请你在该数组中找出。
2024-08-10 15:16:53
129
原创 【数据结构与算法 | 哈希表篇】哈希表
给每个数据分配一个编号,放入表格(数组)。建立编号和表格索引的关系,这样就可以通过编号快速查找数据。理想情况编号当唯一时,表格能容纳所有的数据。现实是不能说为了容纳所有的数据造一个超大的表格,编号也可能重复。有限长度的数组,以拉链方式存储数据。允许编号适当重复,通过数据自身来进行区分。查找时,顺着单向链表查找即可。
2024-08-10 00:45:03
282
原创 【数据结构与算法 | 力扣+二叉搜索树篇】力扣938,1008
返回值位于范围 [low, high]没啥好说的,中序遍历加起来就好了。之间的所有结点的值的和。给定二叉搜索树的根结点。
2024-08-08 13:00:40
247
原创 【数据结构与算法 | 力扣+二叉搜索树篇】力扣450, 98
对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。另一个正确答案是 [5,2,6,null,4,null,7]。要求算法时间复杂度为 O(h),h 为树的高度。二叉树不包含值为 0 的节点。给定一个二叉搜索树的根节点。,删除二叉搜索树中的。
2024-08-07 18:29:00
487
原创 【数据结构与算法 | 二叉树篇】AVL树
AVL树是一种自平衡的二叉搜索树。为什么会出现AVL树。众所周知,虽然普通的二叉搜索树的平均时间复杂度为O(logn),但最差的情况的时间复杂度为O(n)。为了避免最差的这种情况,出现了AVL树。我们规定:如果树有个节点它的左子树的高度-右子树的高度大于1或者它的右子树的高度-左子树的高度小于-1,我们就说该二叉搜索树是不平衡的,需要调整。
2024-08-07 00:59:24
967
原创 【数据结构与算法 | 二叉树篇】二叉搜索树
数据结构好久没看了,代码感觉都有点生疏了。二叉搜索树前提是二叉树,每个节点最多只有两个孩子。如果二叉树的节点满足任意节点的键比其左孩子的值要大,比右孩子的值要小,称这样的二叉树为二叉搜索树。
2024-07-31 18:49:18
194
原创 【MySQL进阶之路 | 高级篇】推荐的主键设计:改造的UUID
主键设计至少应该是全局唯一且是单调递增。全局唯一保证在各系统之间都是唯一的,单调递增是希望插入时不影响数据库性能。什么UUID是全局唯一的?为什么UUID占用36个字节?为什么UUID是无序的?对应表的主键自增ID,如告警、日志、监控等信息。全局唯一,占用36字节,数据无序,插入性能差。这里推荐最简单的一种主键设计:UUID。
2024-07-28 00:20:44
203
原创 【MySQL进阶之路 | 高级篇】主从复制概述
在实际工作中,我们常常将Redis 作为缓存与MySQL配合来使用,当有请求的时候,首先会从缓存中进行查找,如果存在就直接取出。如果不存在再访问数据库,这样就提升了读取的效率,也减少了对后端数据库的访问压力。Redis的缓存架构是高并发架构中非常重要的一环。此外,一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是采用数据库集群的方案,做主从架构、进行读写分离,这样同样可以提升数据库的并发处理能力。
2024-07-27 18:57:20
769
原创 【MySQL进阶之路 | 高级篇】简述Bin Log日志
binlog即binary log,二进制日志文件,也叫作变更日志(update log)。二进制日志可以通过数据库的全量备份和二进制日志中保存的增量信息,完成数据库的无损失恢复I但是,如果遇到数据量大、数据库和数据表很多(比如分库分表的应用)的场景,用二进制日志进行数据恢复,是很有挑战性的,因为起止位置不容易管理。在这种情况下,一个有效的解决办法是配置主从数据库服务器,甚至是一主多从的架构,把二进制日志文件的内容通过中继日志,同步到从数据库服务器中,这样就可以有效避免数据库故障导致的数据异常等问题。
2024-07-27 17:38:38
940
原创 【MySQL进阶之路 | 高级篇】MVCC三剑客:隐藏字段,Undo Log,ReadView
对该记录每次更新后,都会将旧值放到一条undo日志中,就算是该记录的一个旧版本,随着更新次数的增多,所有的版本都会被roll_pointer属性连接成一个链表,我们把这个链表称之为版本链,版本链的头节点就是当前记录的最新的值。InnoDB使用锁来保证不会有脏写情况的发生,也就是在第一个事务更新了某条记录后,就会给这条记录加锁,另一个事务再次更新时就需要等待第一个事务提交了,把锁释放之后才可以继续更新。它可以在大多数情况下替代行级锁,降低系统的开销。这不就是一个事务修改了另一个未提交事务修改过的数据,脏写。
2024-07-26 23:59:57
354
原创 【MySQL进阶之路 | 高级篇】MVCC解决读写问题
MVCC (Multiversion Concurrency Control),多版本并发控制。顾名思义,MVCC是通过数据行的多个版本管理来实现数据库的并发控制。这项技术使得在InnoDB的事务隔离级别下执行一致性读操作有了保证。换言之,就是为了查询一些正在被另一个事务更新的行,并且可以看到它们被更新之前的值,这样在做查询的时候就不用等待另一个事务释放锁。MVCC没有正式的标准,在不同的DBMS中 MVCC的实现方式可能是不同的,也不是普遍使用的(大家可以参考相关的DBMS文档)。
2024-07-26 23:12:51
230
原创 【MySQL进阶之路 | 高级篇】全局锁与死锁
当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。缺点:每个新的被阻塞的线程,都要判断是不是由于自己的加入导致了死锁,这个操作时间复杂度是o(n)。即当两个事务互相等待时,当一个事务等待时间超过设置的阈值时,就将其回滚,另外事务继续进行。死锁的检测原理就是构建一个以事务为顶点,锁为边的有向图。两个事务都持有对方需要的锁,并且在等待对方释放,并且双方都不会主动释放自己的锁。
2024-07-26 22:03:52
657
原创 【MySQL进阶之路 | 高级篇】页锁+锁的思想(悲观锁和乐观锁)
页锁就是在页的粒度上进行锁定,锁定的数据资源比行锁要多,因为一个页中可以有多个行记录.当我们使用页锁的时候,会出现数据浪费的现象,但这样的浪费最多也就是一个页上的数据行。悲观锁不适用的场景较多,它存在一些不足,因为悲观锁大多数情况下依靠数据库的锁机制来实现,以保证程序的并发访问性,同时这样对数据库性能开销影响也很大,特别是长事务而言,这样的开销往往无法承受,这时就需要乐观锁。悲观锁是一种思想,顾名思义,就是很悲观,对数据被其他事务的修改持保守态度,会通过数据库自身的锁机制来实现,从而保证数据操作的排它性。
2024-07-26 18:19:35
266
原创 【MySQL进阶之路 | 高级篇】行锁之临键锁和插入意向锁
有时候我们既想锁住某条记录,又想阻止其他事务在该记录前边的间隙插入新记录,所以InnoDB就提出了一种称之为Next-Key Locks的锁,官方的类型名称为:LOCK_ORDINARY,我们也可以简称为next-key锁。假设存在两条值分别为4和7的记录,两个不同的事务分别试图插入值为5和6的两条记录,每个事务在获取插入行上独占的(排他)锁前,都会获取(4,7)之间的间隙锁,但是因为数据行之间并不冲突,所以两个事务之间并不会产生冲突(阻塞等待)。
2024-07-26 17:53:36
695
原创 【MySQL进阶之路 | 高级篇】行锁之记录锁和间隙锁
行锁(row lock)也称为记录锁。顾名思义,就是锁住某一行(某个记录row)。需要注意的是,MySQL服务层并没有行锁机制,行级锁只在存储引擎层实现。InnoDB与MyISAM的最大不同有两点:一是支持事务;缺点:对于锁的开销比较大,加锁会比较慢,容易出现死锁的情况。优点:锁定力度小,发生锁冲突概率低,可以实现的并发度高。
2024-07-26 16:34:48
257
原创 【MySQL进阶之路 | 高级篇】表级锁之S锁,X锁,意向锁
MySQL中采用了自增锁的方式来实现,AUTO-INC锁是当向使用含有AUTO_INCREMENT列的表中插入数据时需要获取的一种特殊的表级锁,在执行插入语句时就在表级别加一个AUTO-INC锁,然后为每条待插入记录的AUTO_INCREMENT修饰的列分配递增的值,在该语句执行结束后,再把锁释放掉。也正因为如此其并发性能不高。该锁会锁定整张表,它是MySQL中最基本的锁策略,并不依赖于存储引擎(不管你是MysQL的什么存储引擎,对于表锁的策略都是一样的),并且表锁是开销最小的策略((因为粒度比较大)。
2024-07-26 16:22:06
1197
原创 【MySQL进阶之路 | 高级篇】数据操作类型的角度理解共享锁,排他锁
在普通的select语句后加上lock in share mode,如果当前事务执行了该语句,那么它会为读取的记录加S锁,这样允许别的事物继续获取这些记录的S锁,但不能获取该记录的X锁(比如使用select ... for update语句来取这些记录,或者直接修改这些记录)。这两种类型的锁通常被叫做共享锁和排他锁。在普通的select语句后面加for update,如果当前事务执行了该语句,那么它会为读取到的记录加S锁,这样不允许别的事务获取这些记录的S锁,也不允许获得这些记录的X锁。
2024-07-25 22:57:46
720
原创 【MySQL进阶之路 | 高级篇】锁的概述以及读写并发问题
锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在很多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(如订单,金额等),我们就需要保证这个数据在任何时刻最多只有一个线程访问,保证数据的完整性和一致性。在开发过程中加锁是为了保证数据的一致性,这个思想在数据库领域同样重要。在数据库中,除传统的计算资源(如CPU,RAM,I/O等)的争用外,数据也是一种供用户共享的资源。为了保证数据的一致性,需要对并发操作进行控制,因此产生了锁。
2024-07-25 19:05:32
903
原创 【MySQL进阶之路 | 高级篇】简谈undo日志
注意,由于查询操作并不会修改任何用户记录,所以在查询操作执行时,并不需要相应的undo日志。此外,undo log也会产生redo log,也就是undo log的产生会伴随着redo log的产生,这是因为undo log也需要持久化。每当我们要对一条记录做改动时(这里的改动可以是指INSERT,DELETE,UPDATE),都需要留一手,把回滚的所需的东西记下来。redo log是事务持久化的保证,undo log是事务原子性的保证。事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么都不做。
2024-07-25 14:59:35
328
原创 【MySQL进阶之路 | 高级篇】简谈redo日志
事务有四种特性:原子性,一致性,隔离性和持久性。那么事务的四种特性到底是基于什么机制实现呢?事务的隔离性由锁机制实现。而事务的原子性,一致性和持久性由事务的redo日志和undo日志来保证。REDO LOG称为重做日志,提供再写入操作,恢复提交事务修改的页操作,用来保证事务的持久性。UNDO LOG称为回滚日志,回滚行记录到某个特定版本,用来保证事务的原子性,一致性。REDO和UNDO都可以视为一种恢复操作但是。
2024-07-24 21:36:57
256
原创 【MySQL进阶之路 | 高级篇】数据并发问题与四种隔离级别
MySQL是一个客户端/服务器架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接之后,就可以称之为一个会话。事务有隔离性的特性,理论上在某个事物对某个数据进行访问时,其他事物应该进行等待排队,当该事务提交后,其他事务才可以继续访问这个数据。但这样对性能影响太大。我们既想要保持事务的隔离性,又想让服务器在处理访问同一个诗剧的多个事务的性能尽量高一些,那就看二者如何权衡取舍了。先看一下访问相同数据的事务在不保证串行执行(也就是执行完一个再执行下一个)的情况可能会出现哪些问题。
2024-07-24 14:35:19
323
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人