自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(56)
  • 资源 (1)
  • 收藏
  • 关注

原创 MySQL的故事——查询性能优化

不过在编写SQL语句使用用户自定义变量时需要注意,在对变量赋值和读取变量可能是在查询的不同阶段,所以最好把变量的赋值和读取写在一起,或者要搞明白SQL语句的执行过程。MySQL会将使用该提示的语句立即返回给客户端,并将插入的行数据放入到缓冲区,然后在表空闲时批量将数据写入。这几个提示会告诉优化器使用或者不使用哪些索引来查询记录(例如,在决定关联顺序的时候使用哪个索引。这个提示告诉MySQL,当多个语句同时访问某一个表时,哪些语句的优先级相对高些,哪些相对低些。SQL_CACHE和SQL_NO_CACHE。

2023-09-06 01:11:30 1076

原创 MySQL的故事——创建高性能的索引

另外,其它不同类型的索引(例如哈希索引或者全文索引)也不会是B-Tree索引的冗余索引,而无论覆盖的索引列是什么。唯一索引的选择性是1,这是最好的索引选择性,性能也是最好的。当InnoDB注意到某些索引值被使用的非常频繁时,它会在内存中基于B-Tree索引之上再创建一个哈希索引,这样就让B-Tree索引也具有哈希索引的一些优点,比如快速的哈希查找。要理解MySQL中索引是如何工作的,最简单的方法就是去看看一本书的“索引 ”部分:如果在一本书中找到某个特定主题,一般会先看书的“索引”,找到对应的页码。

2023-09-06 01:09:37 431

原创 MySQL的故事——Schema与数据类型优化

更小的通常更好应该尽量使用可以正确存储数据的最小类型,更小的数据类型通常更快,因为他们占用更少的磁盘,内存和CPU缓存,并且处理时需要的CPU周期更少简单就好更简单的数据类型的操作通常需要更少的CPU周期。例如 ,整型数字比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较相对整型数字比较更复杂。比如,应使用INTERGER存储IP地址尽量避免NULL通常情况下,最好指定列为NOT NULL。

2023-09-06 00:34:32 373

原创 MySQL的故事——MySQL架构与历史

写锁是排他的,只有一个线程能进行写操作,其它读锁和写锁都是阻塞的。select InnoDB查找创建系统版本号小于等于事务系统版本号的行,即在事务开始前就存在的行,或者由事务自身插入或修改的行。但是也是需要时空开销的,判断是否有锁、加锁、释放锁的操作都需要额外的开销,如果锁粒度太小,虽然并发程度高,但系统花大量资源去管理锁,而不是存取数据,也是得不偿失。MVCC只在提交读和可重复读两个隔离级别下工作,因为未提交读总是能读取到最新的行,而不是符合当前事务版本的行,而串行化会对所有行加锁。

2023-09-06 00:06:30 486

原创 计算机网络的故事——确认访问用户身份的认证

HTTP使用的认证方式:BASIC认证(基本认证)、DIGEST(摘要认证)、SSL客户端认证、FormBase认证(基于表单认证)。基于表单的认证:涉及到session管理以及cookie的应用。

2023-09-05 23:43:23 557

原创 计算机网络的故事——确保Web安全的Https

通信加密,HTTP协议中没有加密机制,但是可以通过SSL(Secure Socket Layer,安全套接字层)或TLE(Transport Layer Security安全层传输协议)的组合使用,加密HTTP的通信内容。HTTPS采用混合加密的方式,在交换密钥的过程中采用公开加密(就是非对称加密),之后建立连接之后使用共享加密(对称加密)。查明对手的证书,证书由第三方机构颁发,用来证明服务器和客户端实际存在的,通过证书可以证明服务器,客户端持有证书也可以完成个人身份的确认。

2023-09-05 23:40:51 757 1

原创 计算机网络的故事——HTTP首部

在HTTP协议通信交互中使用的首部字段。不限于RFC2616中定义的47种首部字段,还有Cookie、setCookie和Content-Disposition等。HTTP 首部字段将定义成缓存代理和非缓存代理的行为,分成 2 种类型。端到端首部和逐跳首部。

2023-09-05 23:32:50 1151

原创 计算机网络的故事——返回结果的HTTP状态码

304(Not Modified)表示客户端发送附带条件的请求时,服务器允许访问资源,但未满足条件。当301、302、303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文内的主体,之后请求会自动再次发送。401(Unauthorized)表示发送的请求需要有通过HTTP认证(BASIC认证、DIGEST认证)的认证信息。204(No Content,请求得到正常处理,返回的响应报文不含实体的主体部分,浏览器不发生更新)404(Not Found)服务器没有请求的资源。

2023-09-05 23:21:03 33

原创 计算机网络的故事——HTTP报文内的HTTP信息

HTTP报文是由多行(CR+LF作换行符)数据构成的字符串文本,HTTP报文可以分为报文首部和报文主体两部分,两者起初是由(CR+LF)划分的,通常并不一定有报文主体。分割发送的分块传输编码:把实体主体分块的功能称为分块传输编码,分块传输编码分为多个块,每个块都会用十六进制来标记块的大小,最后一个块会用”0(CR+LF)”来标记。HTTP协议中存在内容编码也有类似的功能,进行实体内容编码。内容协商:返回最合适的内容,涉及到浏览器默认语言、字符集、编码等设置,请求服务器会返回最适合的内容。

2023-09-05 00:32:06 780

原创 计算机网络的故事——简单的HTTP协议

put和delete不带验证机制,所以一般也不会使用delete方法,options:询问支持方法 trace:追踪路径,让web服务器将之前的请求通信回给客户端的方法,容易引发站点追踪,不常用。method: get:获取资源 post:传输实体主体 put:传输文件 head:获取报文首部,用于确认URI的有效性以及资源的更新日期时间等 delete:删除文件。1、cookie会根据从服务器发送的响应报文内的叫做Set-Cookie的首部字段信息,通知客户端保存cookie。

2023-09-05 00:21:01 1011

原创 计算机网络的故事——了解Web及网络基础

Web 使用一种名为 HTTP(HyperText Transfer Protocol,超文本传输协议)的协议作为规范,完成从客户端到服务器端等一系列运作流程。根据Web浏览器指定的URL,从对应的服务器中获取文件资源,从而显示出Web页面。TCP位于传输层,提供可靠的字节流服务,TCP协议会通过三次握手建立连接。不同的硬件,操作系统之间进行通信,都需要一种规则,我们管这种规则叫做协议。URL统一资源定位符,URI 就是由某个协议方案表示的资源的定位标识符。1.6各种协议与 HTTP 协议的关系。

2023-09-04 23:12:37 1315

原创 并发编程的故事——JUC

第一次判断的意思是如果还有其它线程想要进来,那么发现乐观锁(U.compareAndSwapInt(this, SIZECTL, sc, -1)已经被使用了,那么就进入下一次循环,发现sizeCtl是-1也就是有线程正在创建表,那么就yield放弃cpu使用权相当于就进入阻塞,下一次苏醒进入创建的时候发现这个时候table已经不是null了,再次回到循环,然后回到while循环的时候结束。所以e现在指向的是1->null,e.next很自然就是35->1->null,切换到线程2就会死链,为什么会这样?

2023-09-04 22:56:51 176

原创 并发编程的故事——共享模式之无锁

其实就是CPU的缓存都是以缓存行进行的存储,cpu1和cpu2读取了内存块1和2进入自己的缓存行,导致的问题就是一方的修改导致对方的缓存失效,那么就要去修改内存再通知其它缓存块。解决办法就是通过Contended注解,把内存块分成两行相当于就是增加padding空块,然后让Cell数据存到内存块的下一行,让cpu读取的时候存入不同的缓存行,那么就不会出现在修改的时候还需要去修改另一个cpu的缓存。第二个判断是casBasy是0的时候,而且cells没有被修改,把casBusy改为1,相当于就是上锁。

2023-09-01 04:47:20 223

原创 并发编程的故事——共享模型之内存

关键就是if(INSTANCE==null)是一个在monitor之外的代码,那么产生的问题就是在执行INSTANCE=new Singleton()的时候,他并不是一个原子操作,包括了invokespecial执行构造方法指令和putstatic给引用赋值(找到对象的堆内存地址)t线程如果频繁读取一个静态变量,那么JIT编译器会把它存入到线程的缓存,那么就算主线程修改了主存中的静态变量也没有任何作用,因为t线程读取的是缓存里面的。单例模式为了防止多次加锁,可以先判空之后,再加锁,再判空。

2023-09-01 03:57:02 215

原创 并发编程的故事——并发之共享模型

接着就是把对应锁记录的锁信息与obj进行交换,比如说把01改成了00告诉obj这是一个轻量级锁,而且告诉了obj锁记录的地址,相当于就是给obj贴上是谁的锁的标签。其实就是竞争轻量级锁的时候,没有地方给竞争的线程放着,那么这个时候就需要把轻量级锁转换成重量级锁monitor,其实就是把obj的markword指向monitor。下面的代码出现的问题就是线程1判断成功之后切换,刚好释放了锁,然后就是线程2获取锁进行判断,再次切换线程1获取锁处理put,切换线程2也可以获取锁处理put。

2023-09-01 03:12:49 324 1

原创 并发编程的故事——Java线程

其实就是一个锁的支持类,它的park方法可以模拟sleep把线程进行阻塞,但是需要标记是false的时候。而且这里需要给主线程睡眠一会,不然t1线程还没睡眠,主线程就已经调用打断,那么这个时候的打断是打断t1,并且加上打断标记,但是打断睡眠并不会有打断标记。先分配栈给线程,线程调用main方法,在栈分配一个栈帧给main方法,栈帧保存锁记录、局部变量表、操作数栈、返回地址(返回到原来的栈帧方法的下一条指令)每次开启一个线程都会产生一个线程的栈给线程使用,实际上就是一开始分配的虚拟机栈。

2023-09-01 01:38:47 188

原创 并发编程的故事——进程和线程

进程:资源分配的最小单位,是线程的容器。运行的程序,负责管理IO和内存,以及指令的执行线程:其实就是指令流,进程的子集,进程可以分多个线程运行区别:1、进程是最小资源分配,线程是最小调度(指的是cpu切换指令流执行的调度)2、线程是进程的子集3、同样的计算机里面进程通讯是IPC方式,不同计算机就要通过协议比如HTTP4、线程切换的成本更低,比如CPU需要并发执行进程或者是线程,线程比较轻量,切换消耗的CPU时间也更小。

2023-08-31 05:36:02 40

原创 JVM的故事——虚拟机字节码执行引擎

执行引擎Java虚拟机的核心组成之一,它是由软件自行实现的,能够执行那些不被硬件直接支持的指令集格式。对于不同的虚拟机实现,执行引擎可能会有解释执行和编译执行或者两种兼备,但是所有执行引擎的输入输出都是一样的,输入的是字节码二进制流,输出的是执行结果。

2023-08-31 05:25:46 718 1

原创 JVM的故事——虚拟机类加载机制

本章将要讲解class文件如何进入虚拟机以及虚拟机如何处理这些class文件。Java虚拟机把class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称为虚拟机的类加载机制。这些过程都是在程序运行时发生的,使Java拥有了极高的扩展性和灵活性。

2023-08-31 05:11:04 565

原创 JVM的故事——类文件结构

计算机是只认由0、1组成的二进制码的,不过随着发展,我们编写的程序可以被编译成与指令集无关、平台中立的一种格式。

2023-08-31 04:13:51 771

原创 JVM的故事—— 内存分配策略

若允许,则用老年代最大可用的连续空间与历次进入老年代的对象平均大小进行对比,若大于,则进行一次有风险的Minor GC,反之进行full GC。当Eden区空间不足分配给新对象时,会进行一次minor GC,回收完没有引用的对象后,先考虑把一些Eden区的对象放到Survivor区,如果放不下,就放到老年代中。对象通常在Eden区诞生,如果经过第一次Minor GC后仍然存活并能被Survivor区存储,该对象就会被移到Survivor区,并且Age(年龄计数器)为1。比如长字符串或者数量庞大的数组。

2023-08-31 04:00:13 906

原创 JVM的故事——垃圾收集器

为了应对这种情况,虚拟机提供了一种称为“增量式并发收集器”(Incremental Concurrent Mark Sweep/i-CMS)的CMS收集器变种,这会使垃圾收集的过程变长,用户程序受到的影响小一点。Parallel Scavenge收集器的特点是它的关注点与其他收集器不同,CMS等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量(Throughput)。新生代收集器,实质上是serial收集器的多线程版本。

2023-08-31 00:34:50 533

原创 leetcode198. 打家劫舍,一种不一样的思路

打家劫舍看其他人的题解都是到一家,然后通过判断是否打劫该家来得到最优解,而我的思路有些许不同。我是从后往前想的,到了某一家,我一定要打劫他,那么我就不能打劫它的前一家(i-1)。但是我不确定是打劫他的前面第二家(i-2)还是打劫他的前面第三家(i-3)的金额更高。所以可以在这里进行判断,得到我一定要打劫的这家可以获得的最高金额,然后再拿此金额和之前的最高金额max对比,如果此家的金额高于之前的最高金额max,则更新max,最终返回max```javaclass Solution { p.

2021-12-24 10:19:37 560

原创 AVL树、红黑树、B树、B+树

AVL是平衡搜索树红黑树B树B+树

2021-12-04 15:37:20 1340

原创 数据库的隔离级别

关于概念:https://blog.csdn.net/u010960184/article/details/82557978举例子和总结:https://www.cnblogs.com/myseries/p/10748912.html

2021-12-04 01:12:13 540

转载 leetcode关于对称性递归的思路总结(转)

个人观点:leetcode题解转载,总结了许多关于树的递归的题目,看完使人豁然开朗。当然,许多暴力dfs的问题都可以看成树或者图的递归问题,例如数字排列组合(层数即为该层节点数的图的dfs),N皇后问题(每一行的dfs,列和斜边为条件),链接为https://www.acwing.com/problem/content/844/和https://www.acwing.com/problem/content/845/引言:力扣上很多树的题目都是可以用递归很快地解决的,而这一系列递归解法中蕴含了一种很强大的

2021-11-28 00:25:14 118

原创 2021-10-15 通过两道剑指offer的题目搞清Java的HashSet、HashMap、LinkedHashMap、HashTable、ConcurrentHashMap

题目均出自leetcode上的剑指offer题库剑指 Offer 03. 数组中重复的数字在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3限制:2 <= n <= 100000官方题解class Solution { public int findRepeat

2021-11-19 22:12:34 81

原创 Vue-cli的下载和加速下载

在此之前,要安装node.js,按照向导一直安装即可。win+R,然后输入cmd。用node -v和npm -v两个指令查看node.js和npm版本,如果显示出版本,则说明之前安装正确。然后进行vue-cli的安装,参考:https://www.yuque.com/neuedu/campus/vcxquc即可(注,如果npm install …失败,则需要检查npm版本对应命令是否正确。或者是否有之前安装的npm,这也会影响现在的npm install …)...

2021-06-08 22:23:39 373

原创 2021-06-08 软工实训

实训第二天把自己的个人日报提交到小组的gitee中。(git的使用)通过阅读论文,假如我是用户,希望该肉类溯源系统有什么功能使用Axure进行原型设计故事板设计:就相当于一个流程,根据这个流程设计故事板的内容用故事->模块化,可以得到一个图表(层次方框图)接下来要画的,很重要的是:核心业务流程图围绕着核心业务,画用例业务流程图(明天任务)然后进行数据描述(明天任务)...

2021-06-08 16:44:40 73

原创 2021-06-07-软工实训

**软件工程课设——第一天**每个同学必须编写2000行以上代码以后每天100行面试笔试四科:1、linux操作系统(15分) 2、数据库 三张以上表的级联查询(25分) 3、数据结构 二叉树的遍历(25分)4、C语言或者Java,根据面试方向出题...

2021-06-07 19:16:42 233 2

原创 leetcode-410 分割数组的最大值

使用动态规划得到每种分割方式得到的最小的数组最大值class Solution {public:int splitArray(vector& nums, int m) {int n = nums.size();vector sum(n + 1, 0);for (int i = 1; i <= n; i ++) {sum[i] = sum[i - 1] + nums[i - 1];}vector<vector> dp(n + 1, vector(m + 1, 2e1

2020-11-09 13:57:15 123

原创 leetcode-300 最长上升子序列

使用动态规划求最长上升子序列,定义一个length数组(dp数组),每一个数起始的length都为1,然后遍历该数前面的所有数,如果该数大于前面的某一个数(即nums[i]>nums[j]),那么说明可以接在以该数为尾的上升子序列,然后就需要动态规划,取现有的子序列length和新组成的子序列length中的最大值,这样就求出了nums数组中每个数对应最长上升子序列的length,最后返回最大的length即可。昨天做的leetcode-714买卖股票的最佳时机也是用的动态规划,不过昨天是定义一个二

2020-11-05 10:59:46 93

原创 leetcode-714 买卖股票的最佳时机含手续费

一道动态规划的题,使用dp数组。有两个状态未持有或者持有,对应dp[i][0]和dp[i][1]。每一天都和前一天做比较,如果当天持有,那么和前一天比,取dp[i-1][1]或者dp[i-1][0]-prices[i]-fee的最大值如果当天不持有,那么就取dp[i-1][0]和dp[i-1][1]+prices[i]到最后返回持有或者不持有最终的最大值就行了。法一莫名其妙的对了,其实只理解了法二。法一:class Solution {public:int maxProfit(vector

2020-11-04 17:55:59 54

原创 leetcode-200 岛屿数量

经典的岛屿问题,可以用dfs和bfs解决。这里我用的是dfs,即找到一个值为1的起点,进行深度优先搜索,把该点及和该点连接的点都置0。在主函数中遍历所有点,如果某个点为1,那么该点一定不与之前的任何点是联通的,因为之前已经进行了深度优先遍历。这道题最开始我想的是每个点就往右和下寻找联通的点就行了,因为我们在主函数中是从(0,0)到(n,m),但是发现如果不往左和上找,会遗漏很多情况,如下图:像这种情况,本来岛屿数量应该为1,因为所有点都是联通的。但是如果不向左或者向下搜索,就会搜索不到左下角的那个点

2020-11-03 15:14:17 115

原创 leetcode-78 子集

这道题是用回溯算法求一个数组的所有子集。回溯算法和dfs的一大区别就是回溯会在该条路走到头之后再退回来。class Solution {public:vector<vector> result;vector<vector> subsets(vector& nums) {vector path;dfs(0,nums,path);return result;}void dfs(int start,vector& nums,vector& path

2020-11-02 19:17:59 87

原创 leetcode-209 长度最小的子数组

滑动窗口的题,也可以算是双指针。一个start指着前面,i指着后面。如果和小于s,i就向后移动,直到和大于等于s,就可以在满足和大于等于s时把start向前移动。start和s的差的最小值即为最小的长度。class Solution {public:int minSubArrayLen(int s, vector& nums) {int n=nums.size();int sum=0;int count=INT32_MAX;int start=0;for(int i=0;i&lt

2020-10-29 12:38:39 52

原创 leetcode-1262 可被三整除的最大和

一道动态规划的题,设一个dp数组。有三种状态,对0取余为0,1,2 。求每个数组元素对0取余的值,并动态更新dp数组。例如:0的dp数组+取余为0的还是00的dp数组+取余为1的是10的dp数组+取余为2的是2.这里有一点需要注意,即0,1,2三种情况的初始化。0的数组可以直接初始化为0,而1和2的数组都需要初始化为一个很小的值(即一个绝对值比较大的负数),这是因为不能让1和2的数组加上前面的可被3整除的数而对0的数组产生影响如果1和2的数组初始化为0或者比较小的负数,就会在后面max判断中

2020-10-28 18:08:14 185

原创 leetcode-547 朋友圈

该题可用dfs、bfs、并查集。我采用的是dfs,方便快捷。虽然dfs写起来很简单,但是也需要优化一下时间复杂度,在dfs遍历所有点的时候,可以if(x!=i)去除对自己进行的过程,因为自己和自己本来就是朋友,M[I][I]恒为一,所以不需要判断,只需要判断自己和他人是否形成一个朋友圈。class Solution {public:int findCircleNum(vector<vector>& M) {int count=0;int n=M.size();int vis

2020-10-27 20:15:07 74

原创 leetcode-275 H指数Ⅱ

一开始认为只能暴力的搜索,但是看完题解之后发现是二分查找,由此总结出二分查找的一些规律。1.一定是按照顺序排好的数组2.要查找数组的下标,且会和数组的值有关系3.查找的一定是有某一特定规则的数该题中,n-i(数组下标)是有多少篇文章,citations[i](数组的值)是引用次数左边是文章数很多引用数很少,右边是文章数很少引用数很多所以该题只需要使用二分查找找到引用数(值)刚好大于文章数(下标)的数组下标即可。也就是即使二分查找过程中没有找到恰好相等的值,但查找的结果也一定是符合该条件的。cl

2020-10-27 20:09:46 92

原创 leetcode-94 二叉树的中序遍历

二叉树的中序遍历,用了两种方法-递归和迭代(需要用到栈)。递归解法:class Solution {public:vector< int > res;void inorder(TreeNode* root) {if (!root) {return;}inorder(root->left);res.push_back(root->val);inorder(root->right);}vector< int > inorderTraversal

2020-10-22 20:32:03 57

cloudFactory.rar

智能云工厂系统,前端使用的是Vue+elementUI,后端使用的是springboot+SSM,其中有邮箱的一些操作,使用前需要阅读readme

2021-10-29

空空如也

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

TA关注的人

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