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

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

2019-08-07 10:43:04

阅读数 4

评论数 0

leveldb设计思想学习总结

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

2019-07-31 21:29:56

阅读数 8

评论数 0

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

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

2019-07-28 09:26:21

阅读数 8

评论数 0

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

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

2019-07-17 12:15:35

阅读数 15

评论数 0

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

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

2019-07-16 23:46:02

阅读数 15

评论数 0

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

背景 最近在协助同事定位问题的时候,发现一个有趣的问题。使用std::map的insert函数插入的时候,总是报了一个莫名的错误。std::map<std::string, T> map_data;而 T的类型,则是一个第三方的类类型。而看到的报错,则是完全没有头绪。 ...

2019-06-19 16:54:11

阅读数 25

评论数 2

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

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

2019-06-19 15:40:39

阅读数 42

评论数 0

学习GFS架构总结

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

2019-06-10 22:18:12

阅读数 35

评论数 0

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

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

2019-05-17 00:24:40

阅读数 31

评论数 0

库冲突错误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,起初没有太留意,编绎还是能正确...

2019-05-13 21:10:25

阅读数 78

评论数 0

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

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

2019-04-10 12:16:28

阅读数 177

评论数 0

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

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

2019-03-11 19:32:38

阅读数 40

评论数 1

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

正常的TCP端的四次挥手 问题1:如果只是关闭了一端,另一端还能发数据么 我们知道,TCP是一个双全工协议,从协议层面,我们了解到,如果client发了FIN包给服务端,在收到ACK之后,状态切换成FIN_WAIT2。此时,从协议层面,只是关闭了client->server...

2019-02-20 10:25:24

阅读数 110

评论数 0

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

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

2018-12-17 20:46:37

阅读数 205

评论数 0

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

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

2018-12-17 20:04:42

阅读数 1182

评论数 0

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

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

2018-12-03 19:23:45

阅读数 73

评论数 2

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

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

2018-12-02 13:15:08

阅读数 529

评论数 3

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

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

2018-12-01 23:31:20

阅读数 91

评论数 2

innodb特性之一致性非锁定读

事务特性 经典的事务,包括ACID特性。 A (Atomicity原子性),一个事务中的所有操作,要么全部完成,要么全部不完成。C(Consistency一致性),在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。 I(Isol...

2018-12-01 17:25:16

阅读数 62

评论数 0

redis重新分片及迁移技术

redis分片 分片场景 在业务量相对较小的时候,可以将所有数据都存到一台机器上,只使用redis单机模式,不存在分片问题。如果业务的数据量超过一台物理机器的内存大小时,则会面对扩展问题,需要多台机器去存数据,此时,需要使用到redis的分片技术。 如何分片 redis通过分slot的方式进行分片...

2018-11-25 21:43:31

阅读数 573

评论数 4

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