自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(107)
  • 收藏
  • 关注

原创 Go 目录规范

功能明确:一个目录实现的功能应该是明确的,并且在整个项目里具有很高的辨识度,当有新增功能的时候,我们可以清楚的知道应该存放在哪个目录之下。平铺式目录结构就是在项目根目录下存放项目的代码,整个目录就像一层的;- 可预测性:项目规模一定是从小到大,一个好的目录结构应该能够在项目变大时,能够保持之前的目录结构。- 全面性:目录结构应该全面包含研发过程中的所有功能,例如文档、脚本、API实现、功能、测试等。- 可扩展性:每个目录下存放的功能类型是一样的,在项目变大时,这些目录应该存放更多同类功能。

2023-04-02 18:07:24 542 1

原创 README 文档规范

写一段简短的话描述项目描述该项目的核心功能点描述项目架构图描述该项目依赖的工具包如何构建项目如何运行项目如何使用如何对该项目做贡献

2023-03-18 22:54:26 127

原创 垃圾回收(GC)

一.业内常见的垃圾回收算法1.引用计数:对每个对象维护一个引用计数,当引用计数为0的时候,回收该对象。优点:对象可以很快的回收,而不会出现内存耗尽或者达到某个阈值时才回收。缺点:不能很好处理循环引用,维护引用计数也有一定的代价。2 标记-清除:从根来遍历所有引用的对象,没有可以访问到的对象就会被回收。优点:解决引用计数的缺点缺点:需要STW,会暂时停止程序运行进行回收内存的处理。3 分代收集:按照对象生命周期的长短分为不同的代空间,生命周期长的放入老年代,而短的放入新生代,不同代有不同

2021-11-24 22:51:19 145

原创 分布式理论 - BASE理论学习

前言BASE理论是CAP理论中的AP的延伸,是对互联网大规模分布式系统的实践总结,强调可用性。BASE理论BASE理论的核心是基本可用(Basically Available),软状态(Soft State)和最终一致性(Eventually Consistent)。软状态为不同节点之间,数据副本存在短暂的不一致性。基本可用指的是当系统节点出现大规模故障的时候,通过牺牲部分功能的可用性,来保证系统的核心功能可用。基本可用的本质是一种妥协,通过牺牲部分功能的可用性,来保证核心功能的稳定运行。

2021-07-27 19:41:01 148

原创 CAP理论

CAP 三指标CAP理论对于分布式系统的特性做了高度抽象,形成了三个指标:一致性、可用性、分区容错性。一致性指的是客户端的每次读数据的操作,所有节点返回的数据应该是相同的,不然就读取失败。一致性主要强调的是每个节点间的数据高度一致。当客户端给节点1发起SET请求,请求成功之后。节点之间会发起通讯,使得节点2的值也编程和节点1的值相同。不管客户端访问哪个节点,读取到的都是同一份数据。当节点之间发生故障的时候,暂时没有办法将节点之间的数据同步。这个时候,我们需要牺牲数据的一致性,每个节点使用本地数据来

2021-07-26 18:39:15 127

原创 HTTP协议的演变

HTTP/1.1 相比HTTP/1.0 性能上的改进:使用TCP 长连接的方式去改善了HTTP/1.0 短连接造成的性能开销。支持管道传输,可以一次性发送多个请求,减少整体的响应时间。但HTTP/1.1 还有性能瓶颈只能压缩Body的部分,如果首部信息越多延迟越大发送冗长的首部,每次发送相同的首部造成的浪费较多。服务器是按照请求的顺序响应的,如果服务器慢,会导致客户端一直请求不到数据没有请求优先级请求只能从客户端开始,服务器只能被动响应。HTTP/2 相比HTTP/1.1性能改进:

2021-04-20 18:50:51 208

原创 https 协议

https 是什么简单来说,https是http + ssl, 对http 通讯内容进行加密,使用tls/ssl(理论在传输层实现)加密的HTTP协议需要理解SSL/TLS的工作原理,我们需要掌握加密算法。涉及到的加密算法有非对称加密和对称加密对称加密: 通信双方使用相同的密钥进行加密,特点是加密速度快,但缺点是需要保护好密钥,密钥泄漏容易被破解。非对称加密: 需要生成公钥和私钥 , 安全性更高,但是计算量较大https的链接过程https 主要分为证书验证阶段和内容传输阶段证书验证阶段

2021-04-20 13:24:36 148 1

原创 接口限流策略

字节三面的场景题限流的目的是通过对于并发访问进行限速,一般是达到限制的速率,就会触发相应的限流行为。常见的限流行为如下:拒绝服务。 把多出来的请求拒绝掉,受到流量暴增的时候,会统计当前的哪个客户端来的请求最多,直接进行拒绝,把带恶意的请求阻挡。服务降级。关闭一些不太重要的服务,让给更重要的功能。另一种是返回部分数据。特权请求。我们只把有限的资源分给重要的用户,我们应该把资源尽可能的分给特权用户。延时队列。利用一个队列来进行缓冲大量的请求,如果队列满,则进行拒绝,一般用于应对短暂的峰刺请求。限

2021-04-19 21:39:30 1067

原创 Gnu linker script 脚本手册-笔记

一.概述链接过程由链接脚本(lds文件)控制,链接脚本主要用于规定输出文件的内存布局。(可以看做链接过程中的Makefile)链接器的默认链接脚本,可以通过 ld --verbose 来进行查看,可以通过 -T 选项用于指定自己的链接脚本。二.简单例子SECTIONS { . = 0x10000; .text : { *(.text) } . = 0x800000; .data : { *(.data) } .bss : { *(.bss) } }. = 0x10000 :

2021-03-29 23:17:39 511 1

原创 Redis 缓存异常

一.Redis 和数据库中的数据不一致的情况是如何发生的?首先我们需要明确数据一致性的情况缓存中有数据,但是缓存的数据值需要和数据库中的值相同缓存中本身没有数据,那么,数据库中的数据就必须是最新值如果不符合上述情况,那么就出现了数据不一致的情况。我们可以根据缓存是不是需要处理写请求,我们可以把缓存分为读写缓存和只读缓存对于读写缓存来说,如果要进行增删改查需要对于缓存中进行,同时还要通过写回方式,同步回数据库中。对于只读缓存来说,如果有新的数据新增,会直接去写入到数据库之中,而如果有数据删改

2021-03-13 22:41:37 324

原创 C++ 在编译阶段可以干什么? -- 学习笔记

编译阶段编译是预处理之后的阶段,输入是通过预处理之后的C++源码,输出是二进制可执行文件。编译阶段看到的都是 C++语法实体,比如说typedef ,using ,template , struct/class 这些关键字定义的类型,而不是运行阶段的变量。比如说,让编译器去递归计算斐波那契数列 template<int N> struct fib // 递归计算斐波那契数列 { static const int value = fib<N - 1>::value

2021-03-05 16:42:07 787

原创 如何提升TCP四次挥手的性能? -- 参数调优

首先我们来看一下四次挥手的过程当主动方关闭连接时,会发送 FIN 报文,此时主动方的连接状态由 ESTABLISHED 变为FIN_WAIT1。当被动方收到 FIN 报文后,内核自动回复 ACK 报文,连接状态由ESTABLISHED 变为 CLOSE_WAIT,顾名思义,它在等待进程调用 close 函数关闭连接。当主动方接收到这个 ACK 报文后,连接状态由 FIN_WAIT1 变为 FIN_WAIT2,主动方的发送通道就关闭了。再来看被动方的发送通道是如何关闭的。当被动方进入 CLOSE_WA.

2021-03-04 21:07:27 215 1

原创 redis 的哨兵机制 - 学习笔记

在学习过redis 的主从模式之后,我们可以思考一个问题 如果主库发生故障,则没有实例可以去服务客户端的写操作请求,这时候应该如何处理呢?我们在这个时候,需要考虑这三个问题:主库真的故障了吗?如果主库故障,我们应该如何去选择从库作为主库?我们如何把新的主库信息通知给从库和客户端呢?Redis 的哨兵机制实现主从库自动切换的关键机制,解决主从复制模式下故障转移的问题。基本流程哨兵主要负责的是 监控(防止主库出现故障),选择主库和通知新主库信息监控是指哨兵进程在运行的时候,周期性的给所有主

2021-03-03 20:19:10 102 1

原创 Redis - 数据如何保持一致性?

Redis如何保证服务少中断?Redis通过增加副本的冗余量,也就是将一份数据同时保存在多个实例上,如果有一个实例出现了故障,其他实例也可以提供服务,不影响业务使用。Redis 主要提供主从库模式,来保证数据副本的一致性,主从库之间采用的是读写分离的模式。读操作 : 主库,从库都可以接收写操作 : 首先到主库进行执行,之后通过写操作由主库同步给从库主从库采用读写分离,所有数据的修改只会在主库上进行,不用协调三个实例。主库有了新的数据后,会同步给从库,这样,主从库的数据就是一致的。主从库之间

2021-02-27 19:53:44 2455 1

原创 MySQL实战45讲 笔记 - MySQL如何保证主从一致?

GNU ld version 2.27-44.base.1.al7Supported emulations:elf_x86_64elf32_x86_64elf_i386elf_iamcui386linuxelf_l1omelf_k1omusing internal linker script:/* Script for -z combreloc: combine and sort reloc sections // Copyright © 2014-2016 Free Software

2021-02-24 22:20:01 196

原创 Redis 渐进式哈希-学习笔记

Redis 解决哈希冲突的方式Redis 通过链式哈希的方式来解决哈希冲突。 链式哈希指的是同一个哈希桶中的多个元素用一个链表来保存,它们依次用指针来进行连接。这里存在一个问题,哈希冲突链上的元素只能通过指针来进行逐一操作。哈希表写入的数据越多,哈希冲突可能也会越多,这会导致某些哈希冲突链过长,进而导致整个链上的元素查找耗时长,效率低。因此 Redis 会对哈希表做rehash操作,rehash也就是增加哈希桶的数量,减少每个桶中的元素数目,进而减少单个桶中的元素。Redis 如何

2021-02-15 15:18:51 227

原创 mysql 中的 redo log 和undo log - 学习笔记

Redo log 重做日志redo log 是为了确保事务的持久性。防止在发生故障的时间点,尚有脏页未写入磁盘,在重启mysql服务的时候,根据redo log 进行重做,进而达到事务的持久性这一特性redo log 物理格式的日志,记录的是物理数据页面的修改信息,其redo log 是顺序写入redo log file 的物理文件中去。redo log 流转过程先将原始数据从磁盘中进行读取,修改数据的内存拷贝。生成一条日志信息写入到 redo log buffer(大小固定

2021-02-14 16:49:43 236

原创 mapreduce 论文 - 阅读笔记

一.概要MapReduce是一种编程模型,它是一种用于处理和生成大型数据集的实现。用户通过指定一个用来处理键值对(Key/Value)的map函数来生成一个中间键值对集合。然后,再指定一个reduce函数, 它用来合并所有的具有相同中间key的中间value 。二.编程模型由用户所编写的Map函数接收输入,并生成一个中间键值对集合。MapReduce这个库会将所有共用一个键的值组合到一起,传递给Reduce函数Reduce函数接收一个中间键以及该键的值得集合作为输入。它会将这些值合并起来,生成

2021-02-01 14:46:18 373 1

原创 链接-学习笔记

以下内容均为网络上整理的资料一.链接是什么?我们在这里可以去引用csapp 的定义 : 链接(linking)是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或被拷贝)到存储器并执行。 了解这句话的含义,我们首先需要明白linux 系统上的一般编译过程:需要强调的是,链接可以执行于编译时(compile time),也就是在源代码被翻译成机器代码时;也可以执行于加载时,也就是在程序被加载器(loader)加载到存储器并执行时;甚至执行于运行时(run time),由应用

2021-01-30 00:35:33 204

原创 编译binutil包报错 error: array type has incomplete element type extern const struct relax_type md_relax_t

编译binutils出错:…/…/sources/binutils-2.15.91.0.2/gas/config/tc-i386.h:457:32: error: array type has incomplete element typeextern const struct relax_type md_relax_table[];^make[3]: *** [app.o] Error 1make[3]: Leaving directory /mnt/lfs/binutils-build/gas

2021-01-25 19:24:36 1058

原创 Go语言之旅 - 闭包

闭包是什么?闭包是在词法上下文中引用了自由变量的函数,这种说法可能太过学术化了,很难理解。用通俗的话来说, 闭包相当于在一个函数中,去捕获自由变量(在函数外部定义但在函数内被引用的变量) 。当脱离了捕获该自由变量的上下文,依旧可以使用该自由变量。我们来看一个例子func test(x int) func() { return func() { fmt.Println(x) }}func main() { f := test(1) f()}输出结果为 1test返回的匿名

2020-11-25 22:26:31 144

转载 Linux文件删除原理

可以转载,转载请注明出处:http://www.cnblogs.com/billy98/Linux是通过link的数量来控制文件删除的,只有当一个文件不存在任何link的时候,这个文件才会被删除。一般来说,每个文件都有2个link计数器:i_count 和 i_nlink。i_count的意义是当前文件使用者(或被调用)的数量,i_nlink 的意义是介质连接的数量(硬链接的数量);可以理解为i_count是内存引用计数器,i_nlink是磁盘的引用计数器。当一个文件被某一个进程引用时,对应i_cou

2020-11-03 22:08:27 206

原创 宏实现大小端互换

//短整形高低字节交换#define Swap16(A) ((((uint16)(A) & 0xff00) >> 8) | (((uint16)(A) & 0x00ff) << 8))//长整形高低字节交换#define Swap32(A) ((((uint32)(A) & 0xff000000) >> 24) | (((uint32)(A) & 0x00ff0000) >> 8) | (((uint32)(A) &

2020-08-25 20:31:41 1146

原创 mysql group_concat拼接查询的时候数据无规律

在鹅厂的实习生活中遇到了一个问题.需要对group_concat 拼接的数据进行排序一开始使用的是,select group_concat(A, B , C) where table order by …但是并没有按照预期结果进行排序,通过查询资料得出group_concat(field order by field)在group_concat 内部排序即可...

2020-07-26 00:14:04 331

原创 初识lua语言(一)

一.什么是lua语言?以及如何安装lua?Lua 是用 C 语言开发的可扩展的轻量级编程语言。它起源于 1993 年由 Roberto lerusalimschy,Luiz Henrique de Figueiredo 与 Waddemar Celes 领导的一个内部项目。lua语言提供了更高的抽象,动态结构,垃圾回收,无冗余,易于测试和调试。安装curl -R -O http:...

2020-04-28 23:41:43 511 1

原创 TCP和UDP区别-学习笔记

TCP和UDP基本区别TCP面向连接,UDP无连接TCP需要通过三次握手,UDP指明对端通信地址即可TCP可靠,UDP不可靠TCP通过校验和,超时重传,确认机制来保证可靠性,UDP无序性TCP是字节流,UDP是数据报的形式UDP边界性保证发几个包,收几个包TCP有拥塞控制机制,UDP没有拥塞控制机制TCP首部开销是比UDP首部开销大的TCP一般用于可靠性的连接,UDP一般用于实...

2020-04-20 22:13:18 210

原创 学习笔记-单调栈

单调栈实际上还是栈,只不过让栈内的元素保持有序(单调递增或单调递减)我们拿一个问题来理解一下:给你一个数组,返回一个等长的数组,对应索引存储下一个更大的元素,如果没有更大的元素,就存 -1.输入[2,1,2,4,3] ,输出[4,2,4,-1,-1]解释: 第一个2后面比2大的数是4,1后面比1大的数是2,第二个2后面比2大的数是4,4后面没有比4大的数,填 -1 ;3后面没有比3大...

2020-04-20 15:05:47 163

原创 c++强制类型转换-学习笔记

c++强制类型转换分为四种,static_cast,dynamic_cast,const_cast,reinterpret_cast一.为什么在C++中还有特殊的四种强制转换因为C风格的强制类型转换,在C++中可能带来一些隐患,难以察觉.(可以在任意类型之间进行转换,...

2020-04-18 15:42:49 234

原创 操作系统中的堆栈区别

堆和栈是两种内存分配的统称。一.栈栈会存放函数的局部变量,函数的返回地址等。栈有"LIFO"(后进先出)的特点。栈由操作系统分配,自动回收.栈的大小受到限制。在x86体系下,栈一般通过esp 指向栈帧顶部,ebp指向底部不断的嵌套或者为局部变量分配空间,可能导致栈溢出。这时候会触发一个异常在执行完一个函数的时候,其中的变量都会从堆栈中弹出。无需亲自管理内存,变量会自动分配和释放。...

2020-04-11 17:17:33 1197

原创 C++的static 为什么不能和虚函数一起使用?

首先我们先做个例子试试看可以吗?class A{public : A(){}; ~A() = default; static virtual void test() { }};int main(){ A a; return 0;}编译结果报错:经过查询资料得知首先的话,静态函数是不和任何类对象或...

2020-03-13 10:59:39 585

原创 vector的性能利器-reserve

vector是c++编程中的最常见的容器之一,可以帮助用户自动管理存储空间,需要分配存储空间的场景,可以取代原生数组.vector在实践的过程中,提升性能的要点就是尽量使用reserve,运行期能确定个数,应该用reserve,不建议用传递大小的数组构造函数或者调用resize为什么不建议使用resize?reserve和resize函数都能分配足够容纳下指定个数对象的空间.不同的是resi...

2020-03-09 19:59:22 436

原创 EPOLL 的 LT和ET-学习笔记

Epoll一般有两种方式边缘触发(ET)和水平触发(LT)epoll 默认模式是水平触发水平触发: 只要满足条件,就触发事件(只要内核缓冲区中的数据没有读完,就会一直触发)边缘触发: 每当状态发生变化的时候就触发一个事件.举一个例子,你在吃一碗饭,LT当你没有吃完这碗饭,它会一直给你提示,ET 当你去打第二碗饭的时候,才会给你提示.LT相当于一个快速的poll,可读可写就绪条件和po...

2020-03-07 16:13:32 213

原创 select 的文件描述符为什么是1024?

一直不知道为什么select的文件描述符限制是比较小的?于是去查看内核5.6的版本,其中在/include/uapi/linux/posix_types.h有说明/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */#ifndef _LINUX_POSIX_TYPES_H#define _LINUX_POSIX_TYPE...

2020-03-07 14:54:16 1278

原创 进程间通信-管道学习笔记

均为整理的资料,侵删.IPC的通信方式-管道.管道一般分为匿名管道和有名管道.管道是最基本的进程通信的方式.匿名管道特点只能在父子进程之间进行使用.有名管道客户克服管道没有名字的限制.因此,除了具有管道所具有的功能之外,还允许无亲缘关系进程之间的通信.匿名管道(pipe)特征:只提供单向通信,也就是说,两个进程都访问这个文件.如果进程1往文件内写东西,进程2只能读取文件的内容.只...

2020-03-07 14:43:22 209

原创 LSM树的基本原理-学习笔记

一.什么是LSM树?LSM全称为"Log-Structured Merged-Tree".后来被Google发表的BigTable论文发扬广大.LSM相对于B+树而言,LSM树在损失部分读性能的前提下尽可能的提高写性能,将随机写转换为顺序写.LSM树主要应用于写多读少的情况.二.LSM树的基本思想LSM树将所有的数据的插入,删除,修改等操作保存在内存之中,当操作达到一定的阀值,批量的写入磁...

2020-02-27 22:40:31 1352

原创 shared_ptr --学习笔记

对于shared_ptr学习笔记的整理一.管理具有共享所有权的资源通过std::shared_ptr智能指针访问的对象采用共享所有权来管理其生存周期,当最后一个指涉到某对象的std::shared_ptr不再指向它的时候,该std::shared_ptr会析构所指向的对象.std::shared_ptr可以通过访问某资源的引用计数来确定自己是不是最后一个指向该资源的.当然引用计数也会有性能...

2020-02-27 16:09:55 218

原创 最大堆的简单实现

一.什么是最大堆?  最大堆的每一个节点的值都大于它的子节点的值.二.如何实现最大堆?堆的插入首先插入到末尾与父结点进行比较如果大于则与父结点交换位置堆中取出元素,让堆末尾的元素放入堆的首部,和相邻子类进行比较,将其中较大的数字和父类指针进行交换三.代码实现采用vector 和 unordered_map 来进行实现在代码中有详细的解释#include <...

2020-02-27 11:45:29 344

原创 Page Cache同步-学习笔记

以下均为自己整理的资料通常Cache 的同步方式有两种,写穿和写回,对应Linux的Page Cache 上所谓的写穿就是write () 操作将数据拷贝到页缓存后立即和下层进行同步的写操作,完成下层的更新之后返回,写回正好相反,指的是写完Page Cache直接返回,Page Cache 到下层的更新操作是异步进行的.Linux 下的 Buffered IO 默认使用回写机制,Page Ca...

2020-02-26 23:35:00 222

原创 glibc下的memcpy 源码学习笔记

一直听说memcpy有内存重叠的问题,想看看为什么会有这个问题?glib 版本2.15#include <string.h>#include <memcopy.h>#include <pagecopy.h> #undef memcpy void *memcpy (dstpp, srcpp, len) void *dstpp; ...

2020-02-23 14:00:45 617

原创 学习笔记-fork函数(一)

一.进程复制fork建立了父进程的唯一完整副本,作为子进程执行。vfork 类似于fork 函数,与父进程共享地址空间,并不创建副本二.写时复制内核采用了写时复制技术,以防止fork执行时将父进程的所有数据复制到子进程在早期的fork函数中,内核对于父进程的每个内存页,都会为子进程创建一个相同的副本。这样会使用了大量内存,复制操作耗费了很长时间。内核通过子进程和父进程共享同一内存...

2020-02-18 19:20:51 238

空空如也

空空如也

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

TA关注的人

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