自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(126)
  • 资源 (3)
  • 收藏
  • 关注

原创 paxos协议的理解及证明推导

文章目录导读历史解决的问题理论分析只有一个Acceptor两个Acceptor结果到原因的推进如何预测未来理论到工程的缺陷根本问题在哪里算法提出FAQ导读paxos算法为什么是这么设计?Paxos协议为什么是两阶段?为什么第一阶段的时候需要取一个最大编号?本文尝试从一个简单场景一步步构建出理论框架并转化为可工程化的算法历史paxos从诞生至今已经近30年,从开始工业化至今也有10来年历史,但至今仍然难以理解。本文尝试从最简单的场景入手,一步步尝试去推导及理解理论约束中的各个细节点,其中不免有理解不对

2020-06-17 12:43:31 729

原创 我对字符编码的理解

背景开发这些年,一直有遇到字符编码这些问题,能一直在解决,但始终没有做到通透的水平,现在想尝试做一下归纳与总结。尝试从一个完全不懂的小白的角度,把问题讲清楚。问题为什么会存在字符编码?gbk、unicode是什么?UTF-8、UTF-16等与UNICODE什么关系?mysql里面存储的是数据,编码是解释层面的概念,而存储的时候,理论上都只是二进制而已,为什么存储的时候,需要指定什么类...

2019-09-30 00:04:41 460

原创 unique_ptr实现Impl模式时遇到的问题分析

背景对于类的设计与定义,我们习惯上使用“指向实现的指针”, 或者叫PImpl。例如下面的类:// widget.h(接口)class widget { // 公开成员private: struct impl; // 实现类的前置声明 impl* ptr;};// widget.cpp(实现)struct widget::impl { // 实现细节...

2019-08-07 10:43:04 1844 1

原创 leveldb设计思想学习总结

leveldb的价值每一类组件,都有它特定擅长的应用场景。在leveldb出世之前,我们对于nosql下的kv存储,我们有redis方案存储。然而redis数据存储的上限,即是机器内存。内存在目前阶段,算是比较昂贵。而leveldb的出现,提供了一个可以以机器磁盘为容量上限,支持持久化的写操作的同时,做到写速度较快,读速度也不慢的一个解决方案。leveldb如何解决问题leveldb面对的问...

2019-07-31 21:29:56 356

原创 c++中函数返回时的RVO机制和std::move的理解

常见问题RVO和std::move都能减少对象拷贝时的开销,那他们到底是什么与什么的关系叫?talk is cheap, show me the code!如下代码所示:test_1.cpp场景一【函数返回非RVO】class Obj {public: Obj() { printf("construct \n"); } ~Obj() {...

2019-07-28 09:26:21 1292 2

原创 fork生成子进程与执行exec子进程的区别

背景项目中想使用多进程的模式。一个控制进程,加上N个工作进程。即是master+worker进程的模式,与nginx的进程模式类似的思路。master创建并管理worker进程,而且他们之间需要能够进行通信。设计思路如下图所示:遇到问题如何创建woker进程linux系统下,创建进程,肯定使用fork来做系统调用。然后fork之后,我们通过ps看到子进程名称也是master,从使用角度来...

2019-07-17 12:15:35 1399

原创 fork多线程中需要注意的问题

单线程场景对于fork系统调用,我们知道是linux下创建子进程的一种方式。fork调用一次,对于程序看来,是“返回两次”。这里其实理解为fork调用中,已经创建出了子进程,父子进程分别分从fork调用中返回。父进程需要知道子进程的进程ID,所以返回值大于0的是父进程,而子进程返回0即可,子进程可以通过getpid获取自身进程ID和getppid获取父进程ID。多线程场景对于多线程场景中,例...

2019-07-16 23:46:02 437

原创 STL使用时的一个常见错误(拷贝构造函数)

背景最近在协助同事定位问题的时候,发现一个有趣的问题。使用std::map的insert函数插入的时候,总是报了一个莫名的错误。std::map<std::string, T> map_data;而 T的类型,则是一个第三方的类类型。而看到的报错,则是完全没有头绪。定位说实话,如果再来一次,这种问题我来看错误,我是肯定想不到是这种原因导致的,因为错误信息中完全找不到跟问题相关的提...

2019-06-19 16:54:11 2378 3

原创 如何让团队摆脱低层次的开发困境

背景相信不少开发同事遇到过一种似曾相识的场景:线上的系统非常繁忙,然后用户经常遇到各种各样的问题。比如说交易系统,里面用户到营业部的柜台里面查某些业务做不了,那柜台人员只能找到后台开发人员帮忙排查,而后台开发人员则需要抽时间先解决客户的问题,有时甚至需要去改生产环境的数据来解决一些问题。一来二去,柜台同事则大部分时间消耗在了排查CASE上面,剩下的一些时间,则做一下迭代需求,基本就把人力资源吃完...

2019-06-19 15:40:39 216

原创 学习GFS架构总结

基本问题为什么需要分布式?因为需要支持百万级的文件,单机无法满足,所以需要用许多廉价机器来协作完成。如何设计架构按最简单的来理解。我们存一个文件,就需要知道文件在磁盘中的位置。现在我们存大文件,我们则需要知道这个文件存在哪台机器上。顺着这个思路我们就构建了简单的索引->机器的架构。如下图所示:我们把元数据放到master机器上,然后把真正的物理文件,存放到chunk机器上。这种架...

2019-06-10 22:18:12 2222

原创 RAFT一致性算法关于成员变更(membership change)问题讨论

RAFT成员变更什么场景需要变量正常情况下,我们最多接触的是RAFT中选举Leader,并正常提交数据的过来。并且了解leader或者follower出现故障之后,如何恢复的过程。今天讨论的场景,是关于成员变更。例如:A、B、C三台机器,A机器负载比较高,需要更强的A1机器顶上。这时候,需要用到成员变更。原来的集群A、B,C,换成A1,B,C。变成的方式方案一:停掉A,增加A1。方案二:...

2019-05-17 00:24:40 1198 2

原创 库冲突错误warning: libstdc++.so.5 needed by xxx, may conflict with libstdc++.so.6

背景在开发项目的时候,链接的时候,遇到错误warning: libstdc++.so.5, needed by /oracle/product/10.2.0/db_1/lib/libocci.so, may conflict with libstdc++.so.6,起初没有太留意,编绎还是能正确编绎,也能单独运行。问题在某个库进行集成之后,在调用OCCI库的API的时候,出现了莫名的失败。主...

2019-05-13 21:10:25 3648

原创 gcc新旧版本ABI在项目中兼容性问题

ABI这里与我们常用的API的概念一起拿出来对比认识。API全称:Application Program InterfaceAn API defines the interfaces by which one piece of software communicates with another at the source level.ABI全称:Application Binary ...

2019-04-10 12:16:28 5306 2

原创 异步业务系统的一个常用实现模式

业务场景一个系统,依赖很多外部系统的数据。对于一个请求过来,需要查询N个外部系统的数据,等全部数据拿到之后,做数据处理完之后,返回给请求端。如果依赖系统太长时间未返回,我们必须有一个超时响应机制返回给客户端。简单方案最简单的方案,就是通过同步的方式。一个客户端请求过来,假如依赖3个接口,则同步顺序的去请求三个接口,send1, recv1, send2, recv2, send3, recv...

2019-03-11 19:32:38 400 1

原创 tcp挥手时的异常情况(SIGPIPE、shutdown vs close操作)

正常的TCP端的四次挥手问题1:如果只是关闭了一端,另一端还能发数据么我们知道,TCP是一个双全工协议,从协议层面,我们了解到,如果client发了FIN包给服务端,在收到ACK之后,状态切换成FIN_WAIT2。此时,从协议层面,只是关闭了client-&gt;server这个方向的数据传输。而server-&gt;client端,则可以继续往client端发数据。可以参考《tcp/ip详...

2019-02-20 10:25:24 782

原创 linux下SSD硬盘与机械硬盘的一个实际数据比对

SSD硬盘一直有一个感性的认识,SSD硬盘比传统的机械磁盘快很多,采用了与机械磁盘完全不同的技术进行存储,具体的技术原理,可以参考这个固态硬盘介绍。这里简单的对手头上现有的两台机器做一下磁盘性能测试,可以给大家一个大致的参考。测试工具使用fio作为工具进行测试,使用dd存在不太精确的情况。环境信息机器1配置:磁盘:TOSHIBA PX02SMF020CPU主频2.3G,12核Cen...

2018-12-17 20:46:37 1680

原创 linux如何查看磁盘是SSD还是传统机械磁盘

目录新来了一台SSD硬盘的机器如何确定真的是SSD新来了一台SSD硬盘的机器项目中由于程序遇到了IO瓶颈,想着找一台SSD硬盘的机器来看是否有多大提升,于是项目组给到一台SSD机器,用来测试性能指标。如何确定真的是SSD按照网上给出来的办法,这里简单总结两条:1、在磁盘没有使用RAID方案的时候,可以使用这个方案,查看磁盘是否为SSD,查看是否SSD,注意,这里查到为SSD,就应该是SS...

2018-12-17 20:04:42 6170

原创 动态链接库链接参数不要写成静态链接形式

背景动态链接库常用写法:动态链接库的路径在/usr/local目录,动态链接库的名称为libtest.so,我们在链接的时候,一般使用g++ -o test_bin main.o -L$(library_path) -ltest类似这种形式来指定目标文件需要的动态链接库。静态链接库的写法如下:例如静态链接库放到/usr/local/libstatic.a,我们在链接的时候,一般使用g...

2018-12-03 19:23:45 432 2

原创 内存数据原子的写到磁盘解决方案之innodb特性double write

场景我们先来讨论一个场景。假设有一段内存,例如是1M大小,需要保证原子的写到磁盘里面,而且如果发生异常情况下,能够原子的恢复起来。正常情况下,只需要使用write系统调用,即可将数据down到磁盘中。绝大多数情况下,这样做都不会有问题。但如果是可靠性要求特别高的系统的数据,需要持久化且用于数据恢复,则来不得半点马虎。这其中就存在写磁盘原子性的问题。可靠性这里存在两个主要问题:1、写磁盘缓冲问题...

2018-12-02 13:15:08 1380 3

原创 求哈希散列值用求模还是用逻辑与

哈希表在使用key, value场景的时候,最常用的一个数据结构,能够实现O(1)时间复杂度的算法。而我们常用的算法中,一般是使用一个比目标空间略大一些的质数,通过对key做一次编码函数,得到一个整数值,再找到对应的目标空间的slot位置,进而做插入操作。如下所示:质数不妨假设为MAXid = fun(key),slot_id = id % MAX找到对应的slot位置进行查找或者插入修...

2018-12-01 23:31:20 375 2

原创 innodb特性之一致性非锁定读

事务特性经典的事务,包括ACID特性。A (Atomicity原子性),一个事务中的所有操作,要么全部完成,要么全部不完成。C(Consistency一致性),在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。I(Isolation隔离性),数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发...

2018-12-01 17:25:16 227

原创 redis重新分片及迁移技术

redis分片分片场景在业务量相对较小的时候,可以将所有数据都存到一台机器上,只使用redis单机模式,不存在分片问题。如果业务的数据量超过一台物理机器的内存大小时,则会面对扩展问题,需要多台机器去存数据,此时,需要使用到redis的分片技术。如何分片redis通过分slot的方式进行分片。例如有A、B、C三台机器组成的一个集群。对于集群里面的节点而言,三者会全部覆盖16384个slots...

2018-11-25 21:43:31 2291 4

原创 意向锁的作用

背景在了解innodb事务并发控制的时候,里面提到了意向锁(intention lock),这里简单做下总结应用场景在innodb的使用场景中,里面有实现了行锁,具体有对行的读锁,写锁。另外,如果对一个表作一些统一的操作,表的层面,有表层级的读锁,写锁。那这个意向锁是干嘛用的?我们假设一个场景,一个事务A正在写某个表T的第r行加了写锁,另一个事务B尝试去对整个表做操作(例如修改表结构的时候...

2018-11-25 17:51:47 2930

原创 redis的AOF持久化方案如何解决备份时数据一致性问题

AOF持久化redis支持两种持久化方案,一种是RDB,RDB直接保存的是数据。另一种是AOF方案,保存下来的是用户的操作过程,可以简单理解为把用户对数据库操作的命令保存下来了,通过回放,可以恢复数据的一种持久化方案。正常AOF逻辑为了满足效率要求,主进程对用户的每一次请求,会把请求写到AOF的缓冲区,然后再按一定的策略把AOF缓冲区的用户操作刷新的AOF磁盘文件中。AOF日志膨胀问题正...

2018-11-19 00:27:02 816

原创 redis的有序集的实现原理

有序集从用户的角度来看,有序集,它首先是一个集合,并且,他可以是顺序的。按照redis提供的命令来看,他可以通过指定key来查找成员,另一方面,可以通过指定score分数,来返回一个还区间的有序成员。如下图所示:哈希方案如果使用redis中的字典基本数据结构,从逻辑上讲,是能满足需求,在查找效率方面,能达到近O(1)时间复杂度。但如果要返回区间的时候,则需要进行内存排序操作,这个场景效率...

2018-11-18 23:35:38 1051

原创 一个分布式限流系统的设计思路

问题背景今天在参与面试的时候,候选人提到了一个他们项目做的一个项目中使用的限制系统的设计。大致思路如下,通过一个配置中心去获取每台机器的配额,然后本地做限流。当时就被挑战了这个思路,如果其他机器挂了,如何快速感知?马上就没答上来了。基于这个话题,今天想来简单分析一下,一个限流系统的设计思路。基本算法1、先讨论最简单的场景,单台机器,用什么方式来限制流量?通知一个非常简单的做法,暂且叫它为时间...

2018-11-13 00:32:05 1010 1

原创 为什么有些类型无法使用memset初始化?

基本经验我们知道,对于这个问题,一般的开发经验是一些基本数据类型的,像int, char, double之类的构造的简单struct类型,我们在C语言中,一般使用memset来对一片内存进行初始化。而另一个经验又是,有些类型,我们不能使用memset进行初始化,例如:string, vector之类的stl结构,或者是一些自定义的类型比较复杂的,例如有多态性质的类定义。什么样的类可以使用mem...

2018-11-11 22:23:15 3992 5

原创 不同容器(GCC7.1与GCC4.8.5)运行相同代码导致效率巨大差别的案件追踪(第二篇)

localtime函数最权威的使用手册不是百度,而是man,在man里面提到与与时区相关。再通过谷歌找到一个前人对localtime进行调优的博客How setting the TZ environment variable avoids thousands of system calls,详细信息可以参考里面的内容描述,这里不赘述。原因解释按照前人得出来的结论,localtime里面,如...

2018-11-11 21:09:29 989

原创 不同容器(GCC7.1与GCC4.8.5)运行相同代码导致效率巨大差别的案件追踪(第一篇)

背景之前对项目中日志组件做了一轮优化测试之后,在GCC4.8.5下,跑一个测试案例(写100万条日志,每条1K字节),能跑到4.2S左右的耗时。而今天发现了一个奇怪的现象,同样的代码,居然在GCC7.1的容器下,跑出了7.5S左右的水平。百思不得其解!不同的容器能跑出相差50%左右的时间出来。而且是更新版本的容器,性能差了将近一倍,无论如何都无法解释。后面简称安装GCC4.8.5的是A容器,安...

2018-11-08 00:09:17 2030

原创 多进程写同一个日志并发问题分析

背景问题在优化日志组件项目中有如下场景:两个进程,A、B进程往同一个文件写日志的时候,使用C语言的库函数写,fopen文件追加方式打开, fwrite等。如果每一次写的时候都强制fflush操作,则写的时序是正常的。如果不是每次fflush操作的时候,则会出现写入日志的时候的时序问题,即是A进程的一条日志没打完,B进程的日志中间插进来了。问题分析原子性系统调用先从最基本的系统调用说起...

2018-10-26 23:14:57 6137 4

原创 mysql innodb索引结构的理解

从几个“经验”做法问题开始:1、建索引的时候,建议使用一个id字段作为主键,并递增的插入,这样效率更高。2、为什么索引查询的时候,会有前缀匹配的约束?开始的时候抛出这两个问题,我们先了解完innodb的索引的数据结构,再回来看这两个问题是不是更清晰了。innodb的数据与主键索引是如何组织B树与B+树的基本原理mysql的索引通过B+树来进行组织。为什么是B+树?这先简单回...

2018-10-21 23:54:23 375

原创 C语言结构体中解决变长数据结构连续内存分配的定义的一种方法(char data[0])

最近项目中,有一个业务场景需要使用一个变长数据结构。而且需要使用连续内存。例如这个场景,我定义一个字段,它来表示DB结构的某个列,如下所示:struct Col_v0 { int type; int len; char data[100];};一般来说,我们可以简单的定义成这样。直接用一个定长的结构体来表示。又有人或者有疑问,要表示一个变长的,不是可以直接用...

2018-10-14 22:00:02 2078 3

原创 哈希桶的预分配内存的实现形式

之前在书本中使用过的hashtable的时候,总体思想是使用一大片内存,然后把key值hash成一个int,找到对应的内存的结构的位置,然后找到相应的数据。常用的解决冲突的方式是,需要进行拉链,再new一个新结点来表示数据。这是一种实现形式,逻辑上没有什么问题。总体方案如下图所示 存在问题:大部分情况下,都需要通过动态分配内存的方式进行拉链。而对于类似共享内存,或者是堆内存,预...

2018-10-10 11:05:26 926

原创 二分搜索问题总结

最近工作中遇到了二分搜索问题。它是计算机课程中最基础的算法,这是我们在顺序查找时,最直接的一种提速的普遍性算法了,能够将一个顺序的查找的时间复杂度,从O(n)提升到了O(logn),这是质变的算法。首先我们来看一下一个经典的二分搜索算法:int BinarySearch(vector&lt;int&gt;&amp; vec_arr, int target) { int left ...

2018-10-02 08:43:57 388

原创 磁盘IO效率的简单总结

最近一段时间的项目进入阶段性收尾,项目中由于遇到了数据需要落地的场景,因此,便需要好好整理一下。这里从几个问题开始:1、对于传统的机械硬盘,如何让写磁盘速度更快?如何了解自己是否已经达到最优?2、多进程写文件的时候,如何保证文件有序?3、只有一个磁盘,多进程写文件的时候,是同时写到一个文件更快,还是多个进程写到多个文件,总体IO效率更高?4、在某些对数据严格要求安全的场景下,有什么...

2018-09-29 11:32:13 6076 1

原创 整形溢出的总结

最近在项目中需要做一个算术运算比较问题,涉及到一个比较的溢出问题。可以简单的抽象成一个示例如下:int a = -100;unsigned b = 100;if (a &lt; b) { cout &lt;&lt; "a(-100) &lt; b(100)" &lt;&lt; endl;} else { cout &lt;&lt; "a(-100) &gt; b(...

2018-09-16 23:20:56 3833

原创 函数返回值的优化技术(RVO和右值引用)

我们先来看一段例子,一个简单的函数返回值场景#include &lt;iostream&gt;using namespace std;class Moveable {public: Moveable():h(new int(3)) { cout &lt;&lt; "construct " &lt;&lt; endl; } ~Moveabl...

2018-09-06 23:42:49 2387

原创 压力测试的一点思考

最后工作中的项目,接近上线了,做了个完整的压力测试过程,对于压力测试,整个项目下来,有些自己的理解,这里简单总结如下:压测的目的1、检查系统是否要求业务需求,拿到系统的一些性能指标。一般情况下,例如峰值是1W/s的系统,压测的时候,需要能扛上2W/s基本就能满足要求(特殊业务可能另作评估)。并且输出压测报告,拿到一个对系统的量化指标,做到一切心中有数。2、发现系统存在的问题。很...

2018-09-03 23:50:41 205

原创 二分搜索常用变种(N个相同目标,寻找第一个或最后一个目标元素)leetcode 278

     /*     * 二分搜索的一个变种,找到第一个等于target的下标     */    int binarySearchFirst(vector&lt;int&gt;&amp; nums, int target) {        if (nums.empty()) {            return -1;        }                ...

2018-09-02 22:26:41 160

原创 leetcode 旋转数组

这个旋转数组,看似挺简单,但真正想要不用调试,直接写出通过的,基本功还是要特别扎实,记自己通过的三种方法class Solution {public:    /* solution 1:直接用了n个辅助空间,空间复杂度过高 */    void rotate(vector&lt;int&gt;&amp; nums, int k) {        vector&lt;int&gt; r...

2018-08-24 23:01:55 364

poj上算法题目分类

poj上的算法题目分类,对于大家想练习算法的同鞋可以参考一下,里面按类列出了各种算法的题号。

2010-10-29

学习VC的经典小游戏入门例子

学习VC的经典小游戏入门例子,里面讲得非常详细,觉得非常不错,所以特地放上来和大家一起分享一下。。。大家顶一个

2010-10-29

STL源码剖析,非常不错的电子书,对源码的剖析

这是学习STL的非常不错的电子书,对源码的剖析!大家可以试试看!--------------

2010-09-05

空空如也

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

TA关注的人

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