- 博客(149)
- 收藏
- 关注
原创 Redis进阶之事物&持久化
Redis的基本事务(basic transaction)需要用到MULTI命令和EXEC命令,这种事务可以让一个客户端在不被其他客户端打断的情况下执行多个命令。和关系数据库那种可以在执行的过程中进行回滚(rollback)的事务不同,在Redis里面,被MULTI命令和EXEC命令包围的所有命令会一个接一个地执行,直到所有命令都执行完毕为止。当一个事务执行完毕之后,Redis才会处理其他客户端的命令。Redis事务在执行的中途遇到错误。
2023-03-05 22:33:34
935
4
原创 Golang协程常见面试题
有缓冲的channel当容量没有达到上限时写入不会阻塞在这里奇数协程的channel容量为1我们提前给他写入了一个数据因此当偶数和奇数协程都开始读取数据时,首先读取到数据的是奇数协程,奇数协程打印完之后在通知偶数协程打印,偶数协程打印完成之后在通知奇数协程重复下去就实现了交替打印的效果。在这里需要注意的点是我们需要close掉这个管道当达到临界值时,主协程退出但是defer方法会执行这个时候管道一关闭所有协程都会收到退出信号,另外两个阻塞在那里的协程就会退出这样就没有这个协程泄漏了。废话不多说直接上代码。
2023-02-25 16:33:10
389
2
原创 Go入门之Gorm 框架
gorm是Golang语言中一款性能极好的ORM库,对开发人员相对是比较友好的。当然还有另外一个xorm库也是比较出名的,感兴趣的也可以看看这个库,接下来主要介绍下gorm库的一些基本使用。下面我们一起看看如何安装这个gorm框架,然后快速的把它使用起来//安装MySQL驱动 go get - u gorm . io / driver / mysql go get - u github . com / jinzhu / gorm。
2023-02-19 23:46:54
4500
1
原创 Go语言Web入门之浅谈Gin框架
Gin 是一个用 Go (Golang) 编写的 web 框架。它是一个类似于 martini 但拥有更好性能的 API 框架,由于 httprouter,速度提高了近 40 倍。Gin在GitHub上已经有47k的star,它和Golang的语法一样简洁明了,使得初学者得以迅速入门。只需要在终端上输入以下命令就可以将使用gin框架了。
2023-02-19 14:45:12
5712
1
原创 浅谈Redis之Redis入门(初学者必备)
Redis,英文全称是Remote Dictionary Server(远程字典服务),是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。与MySQL数据库不同的是Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存,另外,Redis也经常用来做分布式锁。除此之外,Redis支持事务、持久化、LUA 脚本、LRU 驱动事件、多种集群方案。
2023-02-06 08:33:13
6121
3
原创 Docker进阶(中)
docker容器在产生数据的时候,如果不通过docker commit生成新的镜像,使得数据作为镜像的一部分保存下来,那么当容器删除之后,数据自然而然的也会消失。所有的docker镜像都起始于一个基础镜像层,当进行修改或者增加新的内容时,就会在当前镜像层之上,创建新的镜像层。比如有多个镜像都从相同的Base镜像构建而来,那么宿主机只需要在磁盘上保留一份base镜像,同时内存中也只需要加载一份base镜像,这样就可以为所有容器提供服务了,而且镜像的每一层都可以被共享。我们上面的案例默认是这个可读可写的。
2023-01-02 23:22:06
368
4
原创 go语言并发编程(中)
再这里再次强调一下这个需要注意的是读写锁非常适合读多写少的场景,如果读和写的操作差别不大,读写锁的优势就发挥不出来。现在我们知道了,Tick,Sleep,包括time.After函数,都使用的timer结构体,都会被放在同一个协程中统一处理,这样看起来使用Tick,Sleep并没有什么区别。本文使⽤Go语⾔实现并发的协程调度池阉割版,本⽂主要介绍协程池的基本设计思路,⽬的为深⼊浅出快速了解协程池⼯作原理,与真实的企业协程池还有很⼤差距,本⽂仅供学习参考。下面我们通过一个案例演示一下这个读写锁的使用。
2022-12-19 18:47:00
576
6
原创 Docker入门(基础篇)
说白了镜像就等于一个centos系统的安装程序,一个镜像只是一个只读环境而已,这个镜像提供的是基础的运行环境,而你在Centos7系统中安装的应用,比如Redis,Mysql这些应用就相当于一个容器,这些容器都是单独可运行的,仓库的概念就更好理解了,在Centos7系统中下载的所有应用都被收集到同一个仓库里了,比如Maven仓库。3.特点 : Docker镜像是不能运行的,是静态的,而Docker容器是运行的,是动态的,可以将Docker容器想像成一个简化版的操作系统和一些核心基础的应用。
2022-12-16 14:41:08
7728
7
原创 高楼扔鸡蛋问题
1.对应letecode链接高楼扔鸡蛋问题2.题目描述解题思路在这里需要注意的是如果鸡蛋没碎那么这个第i层我们可以将其当中这个第0层。下面我们来看看这个代码如何来书写。但是这样很暴力即使我们加了这个记忆化搜索我们也过不了。下面我们看看这个记忆化搜索的代码如何实现。下面我们来看看这个方法二:方法二有点偏数学方法,非常的难想到利用函数单调性进行二分。并不是像刚才那样一层楼一层楼的进行枚举,把枚举的过程做了一点优化。我们可以看到dp(K,N)他只依赖这个。dp(K-1,i-1)和这个dp(K,N-
2022-12-03 16:43:05
541
1
原创 MySQL索引
什么是索引?索引其实就是一个数据结构。当表中的数据量到达几十万甚至上百万的时候,SQL查询所花费的时间会很长,导致业务超时出错,此时就需要用索引来加速SQL查询。由于索引也是需要存储成索引文件的,因此对索引的使用也会涉及磁盘I/O操作。如果索引创建过多,使用不当,会造成SQL查询时,进行大量无用的磁盘I/O操作,降低了SQL的查询效率,适得其反,因此掌握良好的索引创建原则非常重要。索引是创建在表上的,是对数据库表中一列或者多列的值进行排序的一种结果。索引的核心是提高查询的速度!物理上(聚集索引&非聚集索
2022-11-18 09:05:17
843
7
原创 LeteCode第319场周赛
解题思路本题,我们可以使用这个层序遍历拿到没一层的数据,然后我们求每一层需要多少次。什么意思了就是我们拿到的每一层的值有可能很大但是我们可以将其转换为再这个数组中的排名。本题的解决思路也非常的简单,我们一看这个数据量的范围非常的小。本题的解题思路需要用到之前一个经典的问题最长回文字串,我们需要生成一张dp表表示[L…这样我们就将这个很大的数组转换成为了这个再排序好的对应的下标,有了这个就好办了。可能性1: i位置不再回文区域里面那么此时f[i]=f[i-1].这个容易。本题解题思路非常的简单直接返回即可。
2022-11-13 16:04:02
185
5
原创 c++11高级用法(建议收藏)
2.会导致资源延迟释放weak_ptr 会保持控制块(强引用, 以及弱引用的信息)的生命周期, 而因此连带着保持了对象分配的内存, 只有最后一个 weak_ptr 离开作用域时, 内存才会被释放. 原本强引用减为 0 时就可以释放的内存, 现在变为了强引用, 弱引用都减为 0 时才能释放, 意外的延迟了内存释放的时间. 这对于内存要求高的场景来说, 是一个需要注意的问题.我们再前面说过这个这个创建一个线程之后,创建它的这个线程需要调用join方法进行等待,对线程资源进行回收此时这个线程也会被阻塞再这里。
2022-11-12 19:59:15
815
3
原创 室友打了一晚上游戏我学会了使用GDB调试
run:简记为 r ,其作用是运行程序,当遇到断点后,程序会在断点处停止运行,等待用户输入下一步的命令。continue (简写c ):继续执行,到下一个断点处(或运行结束)next:(简写 n),单步跟踪程序,当遇到函数调用时,也不进入此函数体;此命令同 step 的主要区别是,step 遇到用户自定义的函数,将步进到函数中去运行,而 next 则直接调用函数,不会进入到函数体内。step (简写s):单步调试如果有函数调用,则进入函数;与命令n不同,n是不进入调用的函数的。
2022-11-10 22:43:13
11308
12
原创 一文带你精通Git
博主之前直接已经写过了git的相关基础博客了,老铁可以自行去查看。本篇文章的目录是为了深入的学习git,关于git的基础部分我们可以我们之前在学习git的时候开始重点学习的是暂存区、版本库.下面我们来学习一下git对象是什么。Git 的核心部分是一个简单的键值对数据库。你可以向该数据库插入任意类型的内容,它会返回一个键值,通过该键值可以在任意时刻再次检索该内容。下面我们新建一个目录Test,并打开git Bash输入这个gitinit命令。我们交给git管理的文件都放到了这个目录里面。下面我们来看一条
2022-11-08 21:13:48
7727
原创 有营养的算法笔记(八)
1.题目描述2.解题思路3.对应代码数字转换1.题目描述2.解题思路3.对应代码K递增子序列1.对应letecode链接2.题目描述3.解题思路4.对应代码思考?如果从非递减改成严格递增此时又该怎么做?举个例子,现在每 k 个数选一个数,假设选出来的数组是 [3,2,4,5,5,6,6]。每个数减去其下标后就是 [3,1,2,2,1,1,0]。对这个数组中的正整数求最长非降子序列,那就是 [1,1,1]了,对应原始数组的 [,2,,,5,6,],这三个数字保留,其余数字修改完成后就是 [1,2
2022-10-28 22:27:32
666
1
原创 验证回文串问题带你轻松学会
那么我们就要想了,如果我们求出这个字符串的最长回文子序列,此时这个字符串想要变成回文串就必须把最长回文子序列之外的字符给删除掉。因此我们只需要求出字符串最长回文子序列然后用字符串的长度减去最长回文子序列看看这个值是不是小于等于k即可。那么下面的任务就是怎么求最长回文子序列的问题了。最长回文子序列是典型的范围尝试模型。本题思路还是很简单的,首先一样的我们定义一个指针指向字符串的开头位置定义一个指针指向字符串的结尾位置。可能性3:最长回文子序列既以L开头又以R结尾此时必须要L位置的字符要和R位置的字符相等。
2022-10-27 20:16:44
477
3
原创 Go语言GC机制超详细
什么是GC?他的英文全称(英语:Garbage Collection,缩写为GC),在计算机科学中是一种自动的存储器管理机制。当一个计算机上的动态存储器不再需要时,就应该予以释放,以让出存储器,这种存储器资源管理,称为垃圾回收。垃圾回收器可以让程序员减轻许多负担,也减少程序员犯错的机会(-----来自维基百科)简单地说,垃圾回收(GC)是在后台运行一个守护线程,它的作用是在监控各个对象的状态,识别并且丢弃不再使用的对象来释放和重用资源。
2022-10-27 14:34:46
1122
8
原创 go语言并发编程(上)
下面我们来解释一下MPG模式当中的M、P、G分别代表什么意思M:操作系统当中的线程(物理线程/内核线程)P:调度器负责调度协程,其维护了一个协程队列,M从P当中获取到协程并执行G:协程每个协程都有自己的栈空间定时器其模型大致如下图所示:在这里,我们看到2个线程(M),每个线程都有一个上下文(P),每个线程都运行一个goroutine(G)。灰色的goroutine尚未运行,但已准备好进行调度。它们被排列在称为运行队列的列表中。
2022-10-25 20:27:00
407
3
原创 有营养的算法笔记(七)
1.题目描述2.解题思路3.对应代码上面这个代码非常的暴力,就是所有的情况我们全部都尝试一遍。不断的更新答案,够暴力哈哈哈哈。4.方法二:贪心方法二就是贪心,怎么贪了就是我遇到ab或者ba我就把它给消除掉。所以了我们可以使用一个栈,每次遍历到一个字符的时候我们就去栈里面看看这个栈里面的字符能否和我组成ba或者是ab如果能我们将栈里面的元素弹出即可。最后遍历栈里面的元素生成字符串返回即可,下面我们来看看如何来实现代码6.对应测试代码执行乘法的最大分数1.对应letecode链接2.题目描述3.解题思
2022-10-22 19:50:33
1570
6
原创 万字带你入门Go语言(建议收藏)
定义变量我们一般使用var关键字。具体格式为var 变量名字 变量类型。下面我们演示一个代码定义一个整型变量。var a int = 10 //注意如果定义的时候不给初始值系统会给这个默认值 fmt . Println(a) }注意在go语言当中如果定义了一个变量如果没用初始化,则变量默认为零值。所谓的零值也就是变量没有做初始化时系统默认设置的值。下面让我们看看基本数据类型不初始化系统会赋那些零值。在go语言当中如果定义变量时没有指定变量的类型,可以通过初始值推导出变量的类型。下面我看一下这个代码。
2022-10-21 22:59:07
2472
7
原创 有营养的算法笔记五
圆心所对应的角是直角三角形注意此时这个钝角三角形是以a作为开头的钝角三角形,所以我们只要看这个范围内点的个数有几个在利用排列组合就可以求出以a作为开头的钝角三角形的个数,同样的我们在求以b开头以d开头的情况下钝角三角形的数量就可以了。这条合法路径的代表,就是x, a, b, c, y所组成的集合,我们叫做代表集合如果从b到y,还有一条路径叫(b, a, c, x, y),那么(x, a, b, c, y)和(b, a, c, x, y)是同一个代表集合,返回这个无向图中所有合法路径的代表集合数量。
2022-10-20 14:53:40
2527
16
原创 有营养的算法笔记(六)
1.对应letecode链接喧闹和富有2.题目描述3.解题思路4.对应代码完成任务的天数1.本题为某家公司的笔试题再这里没有这个测试链接,再这里只给出解题思路和代码2.题目描述3.解题思路4.对应代码需要的面试官数量1.同样的本题是公司的笔试题,没有这个测试连接在这里给出解题思路和这个代码。2.题目描述3.解题思路4.对应代码
2022-10-08 21:30:27
888
5
原创 有营养的算法笔记(四)
本题的解题思路也比较的容易想到,题目说的是再k进制下求1到m的当中1的数量但是要求1的数量必须要大于等于n,要我们找到最小的m让1到m当中1的数量要比n要大。这一看就是明显的二分。思路很简单,最重要的是k进制下1到m的数量该如何求,这个如果不是很明白的老铁可以去看我以前的博客,再这里就不重复进行赘述。按照题目的意思,如果我们将这颗二叉树的节点放到一个容器当中其实就是将这个容器里面的元素左移k元素然后再将上一层的父亲指针指向调整好的这一层,没一层都这么干。最后将根节点返回即可。1.对应letecode链接。
2022-10-07 20:22:55
548
3
原创 有营养的算法笔记(三)
1.对应letecode链接知晓秘密的专家2.题目描述3.解题思路4.对应代码魔法数组1.本题为美团的笔试题,所以了没有笔试链接。在这里只给出代码和思路。2.题目描述3.解题思路但是这样的时间复杂度是O(NN)的时间复杂度,每次更新都需要进行遍历才能更新完毕。其实这个枚举行为可以使用线段树进行优化将时间复杂度降低到O(NlogN).下面我们来看看使用线段树进行优化的版本对应总代码最近公共祖先IV1.对应letecode链接2.题目描述3.解题思路4.对应代码
2022-10-06 14:50:08
1076
1
原创 有营养的算法笔记(二)
1.本题为某公司的笔试题,所以没有这个测试链接。在这里只给出代码和思路。2.题目描述3.解题思路4.对应代码但是这样的方式是最暴力的所有节点都搞一遍时间复杂都有点高。下面我们来看看迪结特斯拉算法怎么来解这个题1.第一步和暴力解一样需要生成邻接表,并且需要求这个最小值这一步还是不变的2.准备一个优先级对象小根堆和一个visit数组标记某个节点是否从堆中弹出过,如果已经在堆当中弹出过再次弹出的时候直接忽略调因为第一次弹出的距离是最小的。3.一开始先将x这个节点加入到优先级队列当中加入的形式为Node类
2022-10-05 08:05:58
7805
10
原创 C++设计模式(建议收藏)
如果在多线程环境下线程一判断完这个_inst为空由于时间片的原因被切走了,此时线程二进来发现为空创建了对象,当线程一再次被切回来的时候,继续往下执行又创建了一份对象此时和我们预期的就不一样了。单例模式是指在内存当中只会创建一次对象的设计模式,有时候在一个程序当中多次使用一个对象并且作用相同时,此时如果创建多个对象是非常的浪费内存的,单例模式可以让对象在内存当中只被创建一份。单例模式在面试当中也是考察的非常多的一个设计模式,在面试当中需要我们掌握的是场景的两种一种是懒汉模式,一种是饿汉模式。
2022-10-04 08:36:11
1106
3
原创 有营养的算法笔记(一)
这个题了直接干就是了深度优先遍历,先遍历其孩子节点将其孩子节点处理完毕之后用一个容器保存好如果一个节点孩子节点被全部删除了,并且它自己也不是黑色节点那么这个节点给上层返回nullptr,否则这个更新这个节点的孩子节点并返回。最容易想到的就是遍历这个范围内的每一个数字,求每个数字当中二进制为1的数量如果数量等于target我们就累加答案。限制:0
2022-10-03 15:41:17
1663
7
原创 国庆弯道超车之最长递增子序列衍生的一类题
第一位的答案非常的明显第一问就是最长递减子序列的长度但不是严格递减的就是相等也算。一开始389了我们需要开一门大炮来拦截它那么这门大炮能够打的高度就变为了389,然后来了一个207、155此时这门大炮都能够拦截但是当来到300时这时候就拦截不了需要再开一门大炮来拦截了,这门大炮能够拦截的最大高度就是300了然后来到299这个300这门大炮可以拦截170也是300这么大炮可以拦截158也是这么大炮来拦截但是65这么大炮要交给能够拦截155的这么大炮了二不是158的,这样158的这么大炮就可以拦截的更多。
2022-10-03 11:15:26
799
4
原创 国庆弯道超车(手写Muduo库剖析核心代码及编程思想)
Muduo库是陈硕老师个人编写的TCP网络编程库。博主出于学习的目的使用了C++11将陈硕老师的muduo库重构了一下,当然只是重构了其核心的思想。muduo库当中还有很多牛逼的实现个人现在能力有限只能看懂其主要的实现,后面能力提升了再写博客进行剖析。同时这篇博客的目的主要是为了剖析muduo库的核心代码梳理其代码的执行逻辑。这个了博主能力有限,可能写着写着就写出来了一些不知所云的东西,还请各位担待。如果有写错的地方请在下方留言指正。
2022-10-01 23:30:31
997
6
原创 Linux下mmap
什么是mmap了?从名字上来看是memory map也就是地址映射,是一种内存映射文件的方法。mmap是一个可以将一个文件或者其它对象映射到进程的地址空间实现磁盘的地址和进程虚拟地址空间一段虚拟地址的一一对应关系。通过mmap这个系统调用我们可以让进程之间通过映射到同一个普通文件实现共享内存,普通文件被映射到进程地址空间当中之后,进程可以向访问普通内存一样对文件进行一系列操作。
2022-09-27 21:40:48
1744
3
原创 室友打了一把王者我学会了CMake的使用(初学者必备)
CMake是开源、跨平台的构建工具,可以让我们通过编写简单的配置文件去生成本地的Makefile,这个配置文件是独立于运行平台和编译器的,这样就不用亲自去编写Makefile了,而且配置文件可以直接拿到其它平台上使用,无需修改,非常方便。本文的目的主要是入门CMake并不会涉及复杂的CMake的使用,第二个目的就是用来复习的。
2022-09-21 21:10:00
6673
9
原创 基于Epoll的Reactor模式
Reactor反应堆模式,也就做分发者模式也叫做通知者模式。它是一种设计模式将就绪事件派发给对应服务器处理程序:其基本理念如下。
2022-09-15 23:50:55
409
6
原创 每日一题之原子的数量
然后f2这个函数就从3位置开始继续撸字符串到了5位置发现到了右括号。将自己撸到位置也就是5位置和结果返回给调用给他的老大。f2就根f1说你给你我的任务我已经完成了,结果是这个。f1收到之后从f2返回的结果当中的位置从下一个位置继续往后看有没有数字如果有将f2返回的结果中的字符出现的次数翻倍然后在合并到自己的cntMap当中即可.然后继续往后撸串。这道题看起来很复杂,涉及到了括号嵌套的问题。下面我们以字符串"Mg(OH)2K2"为列。下面我们就用递归来看看这种括号嵌套问题如何来实现的。
2022-09-15 10:14:16
774
3
原创 Linux文本三剑客
awk是一个强大的linux命令,有强大的文本格式化的能力,好比将一些文本数据格式化成专业的excel表的样式.awk更是是一门编程语言,支持条件判断、数组、循环等功能。可能有老铁会问为啥没有删除掉了,这是因为sed会按行将内容读取到内存当中我们删除的是内存当中的数据此时我们如果想要删除文件里面的内容我们可以使用-i选项就可以了。现在我们想将这个文件里面的内容显示出来但是我们不想看到看到空行,此时我们可以使用上面的组合符 ^$代表空格在使用grep的-v选项即可。我们想要拿到第二列的值。
2022-09-11 22:50:53
2176
原创 Git入门(建议收藏)
中心服务器,仅仅是为了方便交换大家的修改,但是这个服务器的地位和我们每个人的PC是一样的。我们可以 把它当做一个开发者的pc就可以就是为了大家代码容易交流不关机用的。没有它大家一样可以工作,只不过“交换”修改不方便而已。git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。Git是 Linus Torvalds 为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。同生活中的许多伟大事物一样,Git诞生于一个极富纷争大举创新的年代。
2022-09-01 22:36:02
1605
4
原创 正则表达式及通配符匹配问题(建议收藏)
我们来看一下dp[i+1][j]=dp[i+2][j+1] | dp[i+3][j+1] | dp[i+4][j+1]...........................p[j-1]是星号,并且 s[i-1]和p[j−2] 匹配,要考虑三种情况:,p[j−1] 星号可以让p[j−2] 在 p 串中消失、出现 1 次、出现 >=2 次。情况一:s[i-1]与p[j-1]是匹配的最右端的字符是匹配的,那么,大问题的答案 = 剩余子串是否匹配。通过观察可以发现dp[i+1][j]可以优化dp[i][j]
2022-08-23 14:21:53
451
1
原创 Linux下线程池(ThreadPool)
再这里实现的是一个简单的线程池,再这个线程池当中有一个任务队列,线程从任务队列当中提前任务,已经若干个线程,一开始再特点的条件变量下进行等待。线程池中的线程去这个任务队列当中拿任务的前提必须是任务队列当中要有任务,如果此时我们只使用互斥锁那么就有可能出现互斥锁一直被一个线程占用着,这是不合理的因此我们需要引入条件变量。此时线程池中的线程只需要从任务队列中拿到任务然后执行Run方法即可.下面我们来看一下主线程的执行逻辑:主线程主要负责通过线程池提供的Push方法将任务放入到任务队列当中即可。
2022-08-22 20:06:09
469
3
原创 守护进程(初学者必备)
linux操作系统本来就有很多的守护进程默默运行,维持系统的正常活动大概有30到50个, ps -efj ppid为0的进程为内核进程,跟随系统启动声明周期是随内核的,cmd列带[]的这种叫内核守护进程,老主init也是守护进程负责启动各运行层次特定的系统服务,所以很多进程的ppid是init.并且这个init进程也负责收养孤儿进程,cmd列不带[]我们称为普通守护进程,也叫做用户守护进程。如何判断一个进程是不是这个进程组的组长了,通常进程组ID等于进程ID那么这个进程就是对应进程组的组长。...
2022-08-18 21:11:49
3674
5
原创 数组原地哈西一类题一网打尽
1.由于题目说了所有的整数的范围在这个[1,n]当中所以我们将数组当中的数字调整成nums[i]=i+1这样的形式由于这个数组当中有出现两次的数字那么肯定有一些位置的数字不满足nums[i]=i+1这样的形式,如果不满足说明当前位置的数字一定是这个重复的。2.那么如何将数组中的元素调整成nums[i]=i+1这种形式了,比如说我们当前来到的位置他所对应的值为val并不满足nums[i]=i+1此时当前位置的值要去的地方应该是val-1位置,所以我们只需要将这两个位置的数进行交互就可以了。...
2022-08-16 17:57:55
1325
7
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人