当前位置: 首页 > news >正文

仙居微信网站开发企业查询系统官网天眼查

仙居微信网站开发,企业查询系统官网天眼查,手机动画制作app免费,网站被黑是怎么回事啊#x1f973;#x1f973;#x1f973; 茫茫人海千千万万#xff0c;感谢这一刻你看到了我的文章#xff0c;感谢观赏#xff0c;大家好呀#xff0c;我是最爱吃鱼罐头#xff0c;大家可以叫鱼罐头呦~#x1f973;#x1f973;#x1f973; 如果你觉得这个【重启人生… 茫茫人海千千万万感谢这一刻你看到了我的文章感谢观赏大家好呀我是最爱吃鱼罐头大家可以叫鱼罐头呦~ 如果你觉得这个【重启人生计划】对你也有一定的帮助加入本专栏开启新的训练计划漫长成长路千锤百炼终飞升巅峰无水文不废话唯有日以继日终踏顶峰 ✨✨欢迎订阅本专栏✨✨ ❤️❤️❤️ 最后希望我的这篇文章能对你的有所帮助 愿自己还有你在未来的日子保持学习保持进步保持热爱奔赴山海 ❤️❤️❤️ 【重启人生计划】第零章序·大梦初醒 【重启人生计划】第壹章序·明确目标 【重启人生计划】第贰章序·勇敢者先行 【重启人生计划】第叁章序·拒绝内耗 序言 大家好我是最爱吃鱼罐头距离离职已经过去一个月了目前进度为3打算重新找工作倒计时27天当然这其中也会去投递面试。 人生哪里是旷野人生是山谷是迷雾重重的森林是湍急的被裹挟向前的河流是迷茫和疲倦交织的前路。 今日回顾 昨天不是很焦虑吗一直在看招聘信息吗昨晚就在想先不去理招聘的信息在面试的过程假设在这样的一个场景下比如说我自己作为面试官的时候我看着眼前自己的这份简历时对镜子前面的帅哥提问的时候你会考虑问那些问题呢。 在出去面试的时候甚至在投递简历的时候首先你必须对你的简历负责你必须非常了解你的简历给你带来优势和弱项你才有可能在面试过程中掌握更多的主动有时候自己可能身在局中而不知问题所在的时候那就去面试吧由面试官来真实的提问你由面试官发现你的弱项你再去完善提升自己这是我设想的对自己发问修改简历完善简历并且能够更从容的应对简历中所面临的问题。 挑战之旅第三天今天早上大概回顾了下jvm的内容后面就刷day4的算法题难度适中是需要理解链表的数据结构下午就开始刷了MySQL的面试题昨天暂时没时间刷视频想着明天休息一下背诵的进度来刷一下视频但进度一直在这明天再看看吧。 算法回顾 设计链表 设计链表 说这道题之前并且后续做的相关题目都是在这基础上去完成的所以先说下链表的数据结构 链表全名链式存储结构也是线性表的一种但是与顺序表不同不同表现在于 在存储结构中顺序表是用一组地址连续的存储单元依次存储线性表中的数据元素而链表它是一种物理存储单元上非连续、非顺序的存储结构在存储数据中顺序表只需要存数据元素信息就可以了。而在链表中除了要存数据元素信息外还要存储它的后继元素的存储地址在逻辑顺序中顺序表是通过数据元素物理存储的相邻关系来反映数据元素之间逻辑上的相邻关系而在链表中是通过链表的存储后续元素的存储地址来实现的逻辑上的顺序。 在链表中通常我们把存储数据元素信息所在的域称为数据域把存储直接后继位置所在的域称为指针域而将这两部分信息合并称为结点Node。 数据域主要用来存放的是数据元素它可以是基本数据类型也可以是引用数据类型指针域在Java中是没有指针的概念但是你能理解指针概念也行如果理解不了我们可以称之为引用域或者NEXT指针。引用域可以理解为存储下一个结点的引用地址NEXT指针可以理解为当前结点指向的下一个结点是谁是什么。最后一个结点的NEXT指针通常指向null就是一个空如果一个结点的next是空的就说明这个结点是最后一个结点。 链表的基本结构就是通过一系列结点组合成而结点又是可以在内存中动态生成一个个结点通过NEXT指针来串联起来形成一个链表。 基础概念知识 结点链表中的基本单元包含数据和一个指向下一个结点的指针在单向链表中。例如一个结点可以包含一个整数和一个指针指向下一个结点。头结点Head链表的起始结点。通过它可以访问链表中的所有其他结点。尾结点Tail链表的最后一个结点它的指针为空在单向链表中表示链表的结束。单向链表每个结点只包含一个指向下一个结点的指针。遍历链表时只能从头到尾前进无法回退。双向链表每个结点包含两个指针一个指向下一个结点一个指向前一个结点。可以从头到尾遍历也可以从尾到头遍历。循环链表链表的最后一个结点指向头结点形成一个循环结构。可以是单向的也可以是双向的。 讲个不恰当的例子当让我回忆回忆得了 不知道大家还是否记得那个是要成为海贼王的辣个男人路飞现在已经觉醒了第五档“太阳神尼卡”形态只能说主角光环闪闪发光呀反正我路飞就是挂多凯多再怎么打能打得过主角吗可见后面的剧情路飞已经快要接近他的梦想了成为海贼王那就是完结的时候了吧。 我们今天主要讲的是链表那大家知道草帽海贼团中的人有谁呢那这个草帽海贼团的人员关系跟我们今天要学习的链表有什么关系呢 我们应该知道草帽海贼团人员总有一个入团顺序入团顺序分别为 路飞 -- 索隆 -- 乌索普 -- 山治 -- 娜美 -- 乔巴 -- 罗宾 -- 弗兰奇 -- 布鲁克 -- 甚平。他们之间本无任何联系可言只因最终都加入草帽海贼团中他们已经有关系牵绊这就像链表一样他们通过路飞这个头结点来连接每一个结点形成一个草帽海贼团的链表我们可以看下下面画的链表图头像来自网络。 只要掌握了单链表的话后续的一些题目都可以正常理解了下面这道题也是让你设计出一个链表可以设计单链表或者双链表。下面是使用单链表实现方式。 代码实现 package com.ygt.day4;/*** 707. 设计链表* https://leetcode.cn/problems/design-linked-list/description/* 你可以选择使用单链表或者双链表设计并实现自己的链表。* 单链表中的节点应该具备两个属性val 和 next 。val 是当前节点的值next 是指向下一个节点的指针/引用。* 如果是双向链表则还需要属性 prev 以指示链表中的上一个节点。假设链表中的所有节点下标从 0 开始。* 实现 MyLinkedList 类* MyLinkedList() 初始化 MyLinkedList 对象。* int get(int index) 获取链表中下标为 index 的节点的值。如果下标无效则返回 -1 。* void addAtHead(int val) 将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后新节点会成为链表的第一个节点。* void addAtTail(int val) 将一个值为 val 的节点追加到链表中作为链表的最后一个元素。* void addAtIndex(int index, int val) 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。如果 index 等于链表的长度那么该节点会被追加到链表的末尾。如果 index 比长度更大该节点将 不会插入 到链表中。* void deleteAtIndex(int index) 如果下标有效则删除链表中下标为 index 的节点。* 输入* [MyLinkedList, addAtHead, addAtTail, addAtIndex, get, deleteAtIndex, get]* [[], [1], [3], [1, 2], [1], [1], [1]]* 输出* [null, null, null, null, 2, null, 3]* 解释* MyLinkedList myLinkedList new MyLinkedList();* myLinkedList.addAtHead(1);* myLinkedList.addAtTail(3);* myLinkedList.addAtIndex(1, 2); // 链表变为 1-2-3* myLinkedList.get(1); // 返回 2* myLinkedList.deleteAtIndex(1); // 现在链表变为 1-3* myLinkedList.get(1); // 返回 3* author ygt* since 2024/8/14*/ public class MyLinkedList {/*单链表一个单链表中可能会存在多个结点其每个结点由两部分构成- val域数据域用来存储元素数据- next域存放结点的直接后继的地址位置的指针域用于指向下一结点- 当链表后续无数据时一般来说都是最后一个节点指针域指向null代表单链表的结束。这里就简单构造下单链表下面的方法也是常见的链表的使用方法*/// 既然要有结点那么先创建一个内部结点类class Node{// - val域数据域用来存储元素数据int val;// - next域存放结点的直接后继的地址位置的指针域用于指向下一结点Node next;// 构造方法public Node(int val) {this.val val;}public Node(int val, Node next) {this.val val;this.next next;}}// 在链表中需要一些必要的属性信息// 头结点Node head;// 链表大小int size;// 下面开始编写方法public MyLinkedList() {// 初始化类size 0;// 初始化时可以有虚拟头结点和普通头结点的方法。// 虚拟头结点是额外增加一个没有值的结点在链表头部但是链表大小不加一在一些算法题目很实用。// 普通头结点也就是在原来链表上进行操作区别在于创建第一个结点时普通头结点就是第一个结点// 而虚拟头结点就是原本第一个结点而创建第一个结点是虚拟头结点的下一个结点。// 下面使用虚拟头结点方法head new Node(-1);}// 这是获取方法根据索引取出链表的位置。public int get(int index) {// 需要注意如果包含了虚拟头结点// 临界值判断if(index 0 || index size) {return -1;}// 查询链表指定位置的元素 是需要遍历链表即遍历每个元素// 从索引0处开始遍历从虚拟头结点的下一个结点的元素开始遍历 。// 如 虚拟头结点 -- 0 -- 1 -- 2 现在要查找index为1的位置即 1的结点的元素。// 1. 从虚拟头结点的下一个结点开始 即真正索引为0处。Node curNode head.next; // 即当前为0// 2. 开始遍历链表直到找到index的位置。 现在需要查找到index为1的位置for (int i 0; i index; i) {// 每次循环都需要将当前的结点指向下一个结点直到找到index位置。curNode curNode.next; // 即循环一次就可以找到 1结点的位置了。}// 最终获得到curNode.val就是我们想要获取到的元素。return curNode.val;}// 头插法public void addAtHead(int val) {// 例如 虚拟 -- 1头插一个0的数据 所以为 虚拟 -- 0 -- 1// 新建一个结点接收当前数据, 并指向虚拟结点的下一个结点位置。// 即 0 -- 1 temp 结点指向 1结点。Node temp new Node(val, head.next);// 然后虚拟结点需要指向当前的temp结点。后续的结点无需操作。head.next temp;// 可以简写一步为// head.next new Node(val, head.next);// 链表的长度 1size;}// 尾插法public void addAtTail(int val) {addAtIndex(size, val);}// 任意位置插入public void addAtIndex(int index, int val) {// 检验位置的合法性 如果指定的索引位置不符合要求抛出异常// 切记index是可以取到size和0的位置即在链表的尾部添加一个元素或者头部添加一个元素if (index 0 || index size) {return ;}// 如果是索引是0我们可以直接使用头插法if (index 0) {addAtHead(val);return;}// 如果索引是0之后的数据需要确定的结点是待插入位置的结点位置// 如: 原结点为虚拟结点 -- 0 -- 2 三个结点0, 1, 2现在需要插入位置为1处所以需要找到1前面的一个数即0的位置// 而我们有个虚拟结点所以需要循环的次数就是index次即 for(int i 0; i index; i ) 找到0处的结点// 然后0.next 当前带插入的数据temp, 当前待插入的数据temp.next 2的结点// 最终结点为虚拟结点 -- 0 -- 1 -- 2// 1. 确定带插入新元素结点之前的那个结点是谁。// 创建一个Node结点prev初始化的时候指向虚拟头结点head。虚拟节点在开始的时候指向的是0这个索引位置的元素它之前的那个节点。Node prev head;// 循环确定处真正需要待插入位置的结点之前的那个结点是谁。for (int i 0; i index; i) {// 从0开始遍历将prev的下一个节点prev.next指向prev即prev向后移动直到找到待插入节点的前一个节点的位置。prev prev.next;}// 2. 确定好位置后就跟之前的插入头结点的方式一样// 新建一个结点接收当前数据, 并指向当前确定的prev结点的下一个结点位置。// temp 结点指向 2结点。即 1 -- 2Node temp new Node(val, prev.next);// 然后当前确定的prev结点需要指向当前的temp结点。 即 0 -- 1prev.next temp;// 可以简写一步为// prev.next new Node(val, prev.next);// 最后链表的长度需要 1size;}public void deleteAtIndex(int index) {// 需要先校验需要删除的位置是否存在。if (index 0 || index size) {return;}// 删除的逻辑其实和我们的插入元素的逻辑一般// 如: 原结点为虚拟结点 -- 0 -- 1 -- 2 四个结点0, 1, 2, 3现在需要删除位置为1处所以需要找到1前面的一个数即0的位置// 而我们有个虚拟结点所以需要循环的次数就是index次即 for(int i 0; i index; i ) 找到0处的结点// 然后0.next 2, 将0结点的next域指向2的结点就行了1这个结点就没有人去指向就被删除了// 最终结点为虚拟结点 -- 0 -- 2// 1. 确定带删除元素结点之前的那个结点是谁。// 创建一个Node结点prev初始化的时候指向虚拟头结点head。虚拟节点在开始的时候指向的是0这个索引位置的元素它之前的那个节点。Node pre head;// 循环遍历找到待删除元素结点的前一个节点位置for (int i 0; i index - 1; i) {pre pre.next;}// 2. 确定好位置后可以得到待删除元素的结点Node delNode pre.next; // 得到1结点。// 将待删除元素结点的前一个结点的next指向待删除元素结点的next结点位置上。即0 -- 2 0结点去指向2结点pre.next delNode.next;// 最后链表的长度需要 - 1size--;}public static void main(String[] args) {MyLinkedList myLinkedList new MyLinkedList();myLinkedList.addAtHead(4);System.out.println(myLinkedList.get(1));myLinkedList.addAtHead(1);myLinkedList.addAtHead(5);myLinkedList.deleteAtIndex(3);myLinkedList.addAtHead(7);System.out.println(myLinkedList.get(3));System.out.println(myLinkedList.get(3));System.out.println(myLinkedList.get(3));myLinkedList.addAtHead(1);myLinkedList.deleteAtIndex(4);} }删除链表中的节点 删除链表中的节点 这道题有点抽象因为平时操作链表的话都是头结点去操作无论查找、删除什么的都是从头结点出发而这道题呢无法获取到head也就是无法获取到前一个结点并且题目保证给定的节点 node 不是链表中的最后一个节点。那么这道题思路是这样的将自己包装成下一个结点就可以很简单写出来了当前结点的值替换为下一个结点的值。 代码实现 package com.ygt.day4;/*** 237. 删除链表中的节点* https://leetcode.cn/problems/delete-node-in-a-linked-list/description/* 有一个单链表的 head我们想删除它其中的一个节点 node。* 给你一个需要删除的节点 node 。你将 无法访问 第一个节点 head。* 链表的所有值都是 唯一的并且保证给定的节点 node 不是链表中的最后一个节点。* 删除给定的节点。注意删除节点并不是指从内存中删除它。这里的意思是* 给定节点的值不应该存在于链表中。* 链表中的节点数应该减少 1。* node 前面的所有值顺序相同。* node 后面的所有值顺序相同。* 自定义测试* 对于输入你应该提供整个链表 head 和要给出的节点 node。node 不应该是链表的最后一个节点而应该是链表中的一个实际节点。* 我们将构建链表并将节点传递给你的函数。* 输出将是调用你函数后的整个链表。* 输入head [4,5,1,9], node 5* 输出[4,1,9]* 解释指定链表中值为 5 的第二个节点那么在调用了你的函数之后该链表应变为 4 - 1 - 9** author ygt* since 2024/8/14*/ public class DeleteNode {public static void main(String[] args) {ListNode node4 new ListNode(9);ListNode node3 new ListNode(1, node4);ListNode node2 new ListNode(5, node3);ListNode node new ListNode(4, node2);ListNode.print(node);new DeleteNode().deleteNode(node3);System.out.println();ListNode.print(node);}public void deleteNode(ListNode node) {// 因为无法获取到head也就是无法获取到前一个结点并且题目保证给定的节点 node 不是链表中的最后一个节点。// 那么这道题思路是这样的将自己包装成下一个结点 就可以很简单写出来了// 当前结点的值替换为下一个结点的值node.val node.next.val;// 然后当前结点next指针直接指向后一个结点node.next node.next.next;// 搞定} }反转链表 反转链表 对于这道题的讲解呢有两种方法 遍历反转单链表递归反转单链表。 这里就只实现遍历反转单链表方式后续如果学习到了递归或者现在就会就可以直接实现递归方式。 主要步骤 创建两个指针curNode指针保存当前的head节点数据preNode节点指针指向null并循环判断当前节点是否为null如果为空就反转结束退出循环如果不为空就进行循环获取当前的节点的下一个节点并将当前节点的next指针指向下一个节点最终完成链表的反转。 看一下图解 动图 如果自己代码要运行的话得先有个结点类 package com.ygt.day4;public class ListNode {int val;public ListNode next;ListNode() {}public ListNode(int val) {this.val val;}public ListNode(int val, ListNode next) {this.val val;this.next next;}// 打印public static void print(ListNode node) {ListNode cur node;if (cur ! null) {System.out.print(cur.val -- );ListNode next cur.next;print(next);}else {System.out.print(null);}} }代码实现 package com.ygt.day4;/*** 206. 反转链表* https://leetcode.cn/problems/reverse-linked-list/description/* 给你单链表的头节点 head 请你反转链表并返回反转后的链表。* 输入head [1,2,3,4,5]* 输出[5,4,3,2,1]* author ygt* since 2024/8/14*/ public class ReverseList {public static void main(String[] args) {ListNode node5 new ListNode(5);ListNode node4 new ListNode(4, node5);ListNode node3 new ListNode(3, node4);ListNode node2 new ListNode(2, node3);ListNode node new ListNode(1, node2);// 打印查看当前效果ListNode.print(node);ListNode listNode new ReverseList().reverseList(node);System.out.println();// 打印查看当前效果ListNode.print(listNode);}// 遍历反转单链表public ListNode reverseList(ListNode head) {/*这道题的主要思路实现关键也是双指针的应用1. 创建两个指针curNode指针保存当前的head节点数据preNode节点指针指向null2. 并循环判断当前节点是否为null3. 如果为空就反转结束退出循环4. 如果不为空就进行循环获取当前的节点的下一个节点并将当前节点的next指针指向下一个节点5. 最终完成链表的反转。*/// 通过双指针迭代法 preNode指针执行nullcurNode执行head节点在判断curNode还未为null时一直迭代遍历// 不断指针往前移动并在移动过程中curNode的next指针指向preNode代表反转。// 前结点为nullListNode preNode null;// 当前的结点ListNode curNode head;// 增加一个保存下一个结点的结点指针ListNode nextNode null;// 判断当前结点是否为null只要还没指向null一直遍历当前结点指针往前移while(curNode ! null) {// 获取当前结点的next避免反转后找不到并在最后赋值为curNode实现结点指针一直往前移动nextNode curNode.next;// 将当前的结点的next指针指向preNode相当于反转curNode.next preNode;// 重置双指针操作。// 赋值前结点为当前节点preNode curNode;// 最后赋值当前的节点为next结点curNode nextNode;}// 最后返回前一个结点即原链表的最后一个结点即5return preNode;} }删除排序链表中的重复元素 删除排序链表中的重复元素 这道题的解题思路 1. 使用指针 curNode指向当前head结点2. 通过判断 curNode的next是否不为空3. 不为空就需要判断 curNode 和 curNode.next 两者的值是否相同相同就得移除不同就后移即可。代码实现 package com.ygt.day4;/*** 83. 删除排序链表中的重复元素* https://leetcode.cn/problems/remove-duplicates-from-sorted-list/description/* 给定一个已排序的链表的头 head 删除所有重复的元素使每个元素只出现一次 。返回 已排序的链表 。* 输入head [1,1,2,3,3]* 输出[1,2,3]* author ygt* since 2024/8/14*/ public class DeleteDuplicates {public static void main(String[] args) {ListNode node5 new ListNode(3);ListNode node4 new ListNode(3, node5);ListNode node3 new ListNode(2, node4);ListNode node2 new ListNode(1, node3);ListNode node new ListNode(1, node2);// 打印查看当前效果ListNode.print(node);ListNode listNode new DeleteDuplicates().deleteDuplicates(node);System.out.println();// 打印查看当前效果ListNode.print(listNode);}public ListNode deleteDuplicates(ListNode head) {if(head null || head.next null) {return head;}/*注意这道题链表有序的完全可以使用一次遍历就删除重复元素主要思路1. 使用指针 curNode指向当前head结点2. 通过判断 curNode的next是否不为空3. 不为空就需要判断 curNode 和 curNode.next 两者的值是否相同相同就得移除不同就后移即可。*/ListNode curNode head;while (curNode.next ! null) {if (curNode.val curNode.next.val) {curNode.next curNode.next.next;} else {curNode curNode.next;}}return head;} }小结算法 今天的算法还是相对比较简单很好刷认真思考下就可以完成的但是前提得要有链表的基础。 明日内容 基础面试题 下面的题目的答案是基于自己的理解和思考去编写出来的也希望大家如果看到了可以根据自己的理解去转换为自己的答案。 当然很多思考也有参考别人的成分但是自己能讲述出来就是最棒的。 这里有一篇阿里的mysql面试题 暂时还没时间刷决定明天抽一天时间来刷视频吧毕竟后续的内容还是有点难度必须得理解理解像mvcc这个也是面试mysql的难点之一。 12. 事务的四大特性和隔离级别 事务 是数据库从一种一致性状态到另一种一致性的状态即事务的操作要么都执行要么都不执行。比如事务是将一组业务操作中的多条SQL语句当做一个整体那么这个多条语句要么都成功执行要么都执行失败。而这数据库引擎中InnoDB是支持事务而MyIASM就不支持啦。 原子性(atomicity) 事务是最小的执行单位要么全成功要么全失败。一致性(consistency) 事务开始和结束后数据库的完整性不会被破坏。隔离性(isolation) 事务的执行是相互隔离的不同事务之间互不影响四种隔离级别为RU读未提交、RC读已提交、RR可重复读、SERIALIZABLE 串行化。持久性(durability) 事务提交后对数据的修改是永久性的即使系统故障也不会丢失。 而这ACID主要是由什么保证呢 A原子性是由undo log 日志保证的它记录了需要回滚的日志信息事务回滚撤销时就会执行已经成功的SQL语句C一致性是由其他三大特性保证并且程序代码要保证业务的一致性I隔离性是由MVCC保证D持久性是由内存redo log保证mysql修改数据的同时在内存和redo log日志中记录这次操作如果数据库宕机的话就可以从redo log中恢复。 隔离级别 read-uncommitted读取未提交最低的隔离级别读取尚未的提交的数据也被为脏读它可能会发生就是脏读现象和不可重复读和幻读现象。 read-committed读已提交可以读取并发事务中已经提交的数据可以有效的阻止脏读但是每次读取的值发生了改变所以不可重复读和幻读仍有可能发生。 repeatable-read可重复读mysql的默认隔离级别对同一字段的读取多次结果是一致的可以阻止脏读和不可重复读但是幻读仍会发生。那幻读就是本来我读取的只有一行的数据此时再次读取可能多了一行此时就是幻读了。 serializable可串行化最高的隔离级别可以有效的解决脏读、不可重复读、幻读现象。但是效率会比较低。 13. redo 和 undo是什么 redo log重做日志 提供再写入操作恢复提交事务修改的页操作用来保证事务的持久性。 主要作用InnoDB引擎的事务采用了WAL技术(Write-Ahead Logging )这种技术的思想就是先写日志再写磁盘只有日志写入成功才算事务提交成功这里的日志就是redo log。当发生宕机且数据未刷到磁盘的时候可以通过redo log来恢复保证持久性。 undo log回滚日志 回滚行记录到某个特定版本用来保证事务的原子性、一致性。 主要作用主要用于事务的回滚(undo log 记录的是每个修改操作的逆操作)和一致性非锁定读(undo log回滚行记录到某种特定的版本—MVCC即多版本并发控制)。 14. redo log详解以及如何刷盘 redo log由两部分组成重做日志缓冲redo log buffer)以及重做日志文件redo log file)前者是在内存中后者在磁盘中。当事务提交之后会把所有修改信息都存到该日志文件中用于在刷新脏页到磁盘发生错误时进行数据恢复使用。 redo log的整体流程 先将原始数据从磁盘中读入内存中来修改数据的内存拷贝生成一条重做日志并写入redo log buffer记录的是数据被修改后的值当事务commit时将redo log buffer中的内容刷新到 redo log file对 redo log file采用追加写的方式定期将内存中修改的数据刷新到磁盘中 redo log的刷盘策略 redo log的写入并不是直接写入磁盘的而是先写入到文件系统缓存中最后根据刷盘策略写入到磁盘的redo log file中。 InnoDB给出 innodb_flush_log_at_trx_commit 参数该参数控制 commit提交事务时如何将 redo log buffer 中的日志刷新到 redo log file 中。它支持三种策略 设置为0 每次事务提交时不进行刷盘操作由后台线程masterThread每隔1s写入文件系统缓存中并刷到磁盘中设置为1 每次事务提交时都进行写入文件系统缓存中并刷到磁盘中默认设置为2 每次事务提交时都只把 redo log buffer 内容写入文件系统缓存中不进行同步。由os自己决定什么时候同步到磁盘文件。 15.Innodb是如何实现事务的 Innodb通过Buffer PoolLogBufferRedo LogUndo Log来实现事务以一个update语句为例 Innodb在收到一个update语句后会先根据条件找到数据所在的页并将该页缓存在Buffer Pool中执行update语句修改Buffer Pool中的数据也就是内存中的数据针对update语句生成一个RedoLog对象并存入LogBuffer中针对update语句生成undolog日志用于事务回滚如果事务提交那么则把RedoLog对象进行持久化后续还有其他机制将Buffer Pool中所修改的数据页持久化到磁盘中如果事务回滚则利用undolog日志进行回滚。 16. MVCC 所谓的MVCC是一种数据库的并发控制机制它的目标是在保证数据一致性和隔离性的同时提供更好的并发性能。主要就是生成一个ReadView通过ReadView找到符合条件的记录版本历史版本由undo日志构建)。查询语句只能读到在生成ReadView之前已提交事务所做的更改在生成ReadView之前未提交的事务或者之后才开启的事务所做的更改是看不到的。而写操作生成新的版本并更新到数据行中读记录的历史版本和改动记录的最新版本本身并不冲突也就是采用MVCC时读-写操作并不冲突。 MVCC主要就是依赖于记录行中的隐藏字段以及undo log版本链和readView trx_id每次一个事务对某条聚簇索引记录进行改动时都会把该事务的事务id赋值给trx_id隐藏列。roll_pointer每次对某条聚簇索引记录进行改动时都会把旧的版本写入到undo日志中然后这个隐藏列就相当于一个指针可以通过它来找到该记录修改前的信息。undo log版本链每次对记录进行改动都会记录一条undo日志每条undo日志也都有一个roll_pointer属性连接形成一个链表readView快照读的读视图当事务启动时会生成数据库系统当前的一个快照InnoDB为每个事务构造了一个数组用来记录并维护系统当前活跃事务的ID。主要包括 creator_trx_id创建这个 Read View 的事务 ID。 m_ids表示在生成ReadView时当前系统中活跃的读写事务的事务id列表。 min_trx_id活跃的事务中最小的事务 ID。 max_trx_id表示生成ReadView时系统中应该分配给下一个事务的id值。max_trx_id 是系统最大的事务id值这里要注意是系统中的事务id需要区别于正在活跃的事务ID。 具体的流程 首先获取事务自己的版本号也就是事务 ID 生成 ReadView 查询得到的数据然后与 ReadView 中的事务版本号进行比较 如果不符合 ReadView 规则就需要从 Undo Log 中获取历史快照 最后返回符合规则的数据。 17. MySQL 中有哪几种锁 在MySQL中常见的锁包括以下几种 共享锁Shared Lock也称为读锁Read Lock用于允许多个事务同时读取同一资源但禁止并发写入操作。其他事务可以获取共享锁但无法获取排他锁。排他锁Exclusive Lock也称为写锁Write Lock用于独占地锁定资源阻止其他事务的读写操作。其他事务无法获取共享锁或排他锁直到持有排他锁的事务释放锁。表级锁Table-level Locking在事务操作中对整个表进行加锁。当一个事务对表进行写入操作时其他事务无法对该表进行任何读写操作。表级锁通常是针对特定的DDL操作或备份操作。行级锁Row-level Locking也称为记录锁Record Locking在事务操作中对数据行进行加锁。行级锁可以控制并发读写操作不同事务之间可以并发地访问不同行的数据。MySQL的InnoDB存储引擎默认使用行级锁。页锁在页的粒度上进行锁定页锁的开销介于表锁和行锁之间会出现死锁。锁定粒度介于表锁和行锁之间并发度一般。意向锁 intention lock它允许行级锁与表级锁共存而意向锁就是其中的一种表锁。记录锁Record Lock用于行级锁的一种形式锁定数据库中的一个记录行以保证事务的隔离性和完整性。间隙锁Gap Lock用于行级锁的一种形式锁定两个记录之间的间隙。它可以防止其他事务在该间隙中插入新记录从而保证数据的一致性。临键锁Next-Key Locks 临键锁是记录锁和间隙锁的结合锁定的是一个范围并且包括记录本身。 需要注意的是MySQL的不同存储引擎对锁的支持和实现方式可能有所不同。例如MyISAM存储引擎使用表级锁来控制并发访问而InnoDB存储引擎则支持更细粒度的行级锁提供更好的并发性能和数据一致性。 算法 在有链表的基础上进行链表的算法题可以事半功倍。 需要有链表以及双指针的基础。 反转链表 II 删除排序链表中的重复元素 II 删除链表的倒数第 N 个结点 移除链表元素 完结 最后相关算法的代码也上传到gitee或者github上了。 乘风破浪会有时 直挂云帆济沧海 希望从明天开始一起加油努力吧成就更好的自己。 虽然这篇文章完结了但是我还在永不完结。我会努力保持写文章。来日方长何惧车遥马慢✨✨✨ 感谢各位看到这里愿你韶华不负青春无悔让我们一起加油吧 学到这里今天的世界打烊了晚安
http://www.dnsts.com.cn/news/134213.html

相关文章:

  • 济南做网站的中企如何推广自己的店铺
  • 企业站模板招聘网站开发的流程
  • 做柱状图好看的网站中国万网张向东去哪了
  • 东莞营销型网站建设公司pc 移动的网站开发
  • ps做网站字号大小一个wordpress的爱好者
  • 中国建设银行网站u盾修改密码wordpress数据表结构
  • wordpress网站网页加密5113二次加密和三次加密
  • 哈尔滨市建设工程交易网网站字头优化
  • 网站没有百度快照idc机房
  • 做哪个网站零售最好aso优化技巧大aso技巧
  • 秦皇岛网站制作电话ysl 官网中国
  • 英文网站建设服务合同模板下载软件平台建设方案
  • 打开一个网站为繁体字是怎么做的怎么做网站评论
  • 山西省建设注册中心网站个人如何开投资公司
  • 惠州专业网站建设价格近境制作官网
  • 个人可以做社区网站推广网站公司
  • 黑龙江建筑职业技术学院招生网站网络贷款公司哪个好
  • 云南建设工程招标网站淘宝联盟自己做网站
  • 手机端网站尺寸规范网站备案需要具备什么
  • 网站 设计 趋势小白网站建设
  • 中山网站建设文化机构人物介绍网页设计
  • 西安网站关键词优化推荐做网站具体步骤
  • 专业做pe的网站深圳装饰公司前十强
  • 青岛工程建设监理公司网站公司新成立想要搭建网站怎么做
  • 做招聘网站需要什么人员wordpress主查询
  • 海口企业免费建站共享ip网站 排名影响
  • 海南网站制作潍坊网站建设价格低
  • 网站建设开发多少钱深圳做网站公
  • 山西建立网站营销策划学网站开发可以创业吗
  • 网站网页设计要求摄影工作室网站源码