关于c++:最新阿里CC-Linux后台开发面试题及答案

3次阅读

共计 5618 个字符,预计需要花费 15 分钟才能阅读完成。

1、Mysql 有哪些存储引擎?请具体列举其区别?

InnoDB: 事务型存储引擎, 并且有较高的并发读取频率

MEMORY:存储引擎,寄存在内存中,数据量小,速度快

Merge:

ARCHIVE:归档,有很好的压缩机制

2、设计高并发零碎数据库层面该如何设计?数据库锁有哪些类型?如何实现?

1. 分库分表:同样量的数据均匀存储在不同数据库雷同表(或不同表)中,加重单表压力,如果还是很大,就能够每个库在分多张表,依据 hash 取值或者其余逻辑判断将数据存储在哪张表中

2. 读写拆散:数据库本来就有主从数据库之分,查问在从服务器,增删改在主服务器,

3. 归档和操作表辨别:建一张归档表,将历史数据放入,须要操作的表数据独自存储

4. 索引啊之类的创立,对于数据量很大,百万级别以上的单表,如果增删改操作不频繁的话,能够创立 bitMap 索引,速度要快得多

1. 共享锁:要等第一个人操作完,开释锁,能力操作

2. 更新锁:解决死锁,他人能够读,但不能操作

3. 排他锁:读写都被禁用

4. 意向锁(xlock):对表中局部数据加锁,查问时,能够跳过

5. 打算锁:操作时,别的表连贯不了这张表

3、讲讲分布式惟一 ID?

确定 ID 存储用 64 位,1 个 64 位二进制 1 是这样的 00000000…..1100……0101,切割 64 位,某段二进制示意成 1 个约束条件,前 41 位为毫秒工夫,后紧接 9 位为 IP,IP 之后为自增的二进制,记录当后面位数雷同状况下是第几个 id,如当初有 10 台机器,这个 id 生成器生成 id 极限是同台机器 1ms 内生成 2 的 14 次方个 ID。

分布式惟一 ID = 工夫戳 << 41 位,int 类型服务器编号 << 10,序列自增 sequence。每个工夫戳内只能生成固定数量如(10 万)个自增号,达到最大值则同步期待下个工夫戳,自增从 0 开始。将毫秒数放在最高位,保障生成的 ID 是趋势递增的,每个业务线、每个机房、每个机器生成的 ID 都是不同的。如 39bit 毫秒数 |4bit 业务线 |2bit 机房 | 预留 |7bit 序列号。高位取 2016 年 1 月 1 日 1 到当初的毫秒数,零碎运行 10 年,至多须要 10 年 x365 天 x24 小时 x3600 秒 x1000 毫秒 =320×10~9,差不多 39bit 给毫秒数,每秒单机顶峰并发小于 100,差不多 7bit 给每毫秒的自增号,5 年内机房小于 100 台机器,预留 2bit 给机房,每个机房小于 100 台机器,预留 7bit 给每个机房,业务线小于 10 个,预留 4bit 给业务线标识。

64bit 分布式 ID(42bit 毫秒 +5bit 机器 ID+12 位自增)等

生成分布式 ID 的形式:A,2 个自增表,步长互相隔开 B,工夫的毫秒或者纳秒 C,UUID D,64 位约束条件(如上)

4、Redis 内存数据回升到肯定大小会执行数据淘汰策略,Redis 提供了哪 6 种数据淘汰策略?

LRU:从已设置过期工夫的数据汇合中筛选最近起码应用的数据淘汰

random:从已设置过期工夫的数据中筛选任意数据淘汰

ttl:从已设置过期工夫的数据汇合中筛选将要过期的数据淘汰。

notenvision:禁止驱赶数据

如 mysql 中有 2 千万数据,redis 只存储 20 万的热门数据。LRU 或者 TTL 都满足热点数据读取较多,不太可能超时特点。

redis 特点:速度块,O(1),丰盛的数据类型,反对事物原子性,可用于缓存,比 memecache 速度块,能够长久化数据。

常见问题和解决:Master 最好不做长久化如 RDB 快照和 AOF 日志文件;如果数据比拟重要,某分 slave 开启 AOF 备份数据,策略为每秒 1 次,为了主从复制速度及稳固,MS 主从在同一局域网内;主从复制不要用图状构造,用单向链表更为稳固 M-S-S-S-S。。。。;redis 过期采纳懒汉 + 定期,懒汉即 get/set 时候查看 key 是否过期,过期则删除 key,定期遍历每个 DB,查看制订个数个 key;联合服务器性能调节并发状况。

过期淘汰,数据写入 redis 会附带 1 个无效工夫,这个无效工夫内该数据被认为是正确的并不关怀真实情况,例如对领取等业务采纳版本号实现,redis 中每一份数据都维持 1 个版本号,DB 中也维持 1 份,只有当 redis 的与 DB 中的版本统一时,才会认为 redis 为无效的,不过依然每次都要拜访 DB,只须要查问 version 版本字段即可。

c/c++ linux 后盾服务器开发学习地址:https://ke.qq.com/course/4177…(内容包含:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK 等等

5、ZooKeeper 分布式是如何做到高可用?

ZooKeeper 运行期间,集群中至多有过半的机器保留了最新数据。集群超过半数的机器可能失常工作,集群就可能对外提供服务。

zookeeper 能够选出 N 台机器作主机,它能够实现 M:N 的备份;keepalive 只能选出 1 台机器作主机,所以 keepalive 只能实现 M:1 的备份。

通常有以下两种部署计划:双机房部署(一个稳定性更好、设施更牢靠的机房,这个机房就是次要机房,而另外一个机房则更加便宜一些,例如,对于一个由 7 台机器组成的 ZooKeeper 集群,通常在次要机房中部署 4 台机器,剩下的 3 台机器部署到另外一个机房中);三机房部署(无论哪个机房产生了故障,剩下两个机房的机器数量都超过半数。在三个机房中都部署若干个机器来组成一个 ZooKeeper 集群。假如机器总数为 N,各机房机器数:N1 = (N-1)/2,N2=1~(N-N1)/2,N3 = N – N1 – N2)。

程度扩容就是向集群中增加更多机器,Zookeeper2 种形式(不完满),一种是集群整体重启,另外一种是逐台进行服务器的重启。

6、如何将数据分布在 redis 第几个库?

redis 自身反对 16 个数据库,通过 数据库 id 设置,默认为 0。

例如 jedis 客户端设置。一:JedisPool(org.apache.commons.pool.impl.GenericObjectPool.Config poolConfig, String host, int port, int timeout, String password, int database);

第一种通过指定构造函数 database 字段抉择库,不设置则默认 0 库。二:jedis.select(index); 调用 jedis 的 select 办法指定。

7、幂等的解决形式?

一、查问与删除操作是人造幂等

二、惟一索引,避免新增脏数据

三、token 机制,避免页面反复提交

四、乐观锁 for update

五、乐观锁(通过版本号 / 工夫戳实现,通过条件限度 where avai_amount-#subAmount# >= 0)

六、分布式锁

七、状态机幂等(如果状态机曾经处于下一个状态,这时候来了一个上一个状态的变更,实践上是不可能变更的,这样的话,保障了无限状态机的幂等。)

八、select + insert(并发不高的后盾零碎,或者一些工作 JOB,为了反对幂等,反对反复执行)

须要更多最新面试题(阿里系、腾讯系、百度系)能够加 qun(563998835)

8、Https 工作流程?

a、客户端发送本人反对的加密规定给服务器,代表通知服务器要进行连贯了

b、服务器从中选出一套加密算法和 hash 算法以及本人的身份信息 (地址等) 以证书的模式发送给浏览器,证书中蕴含服务器信息,加密公钥,证书的方法机构

c、客户端收到网站的证书之后要做上面的事件:

c1、验证证书的合法性

c2、如果验证通过证书,浏览器会生成一串随机数作为密钥 K,并用证书中的公钥进行加密

c3、用约定好的 hash 算法计算握手音讯,而后用生成的密钥 K 进行加密,而后一起发送给服务器

d、服务器接管到客户端传送来的信息,要求上面的事件:

d1、用私钥解析出明码,用明码解析握手音讯,验证 hash 值是否和浏览器发来的统一

d2、应用密钥加密音讯,回送

如果计算法 hash 值统一,握手胜利

9、RabbitMQ 音讯沉积怎么解决?

减少消费者的解决能力(例如优化代码),或缩小公布频率

单纯降级硬件不是方法,只能起到一时的作用

思考应用队列最大长度限度,RabbitMQ 3.1 反对

给音讯设置年龄,超时就抛弃

默认状况下,rabbitmq 消费者为单线程串行生产,设置并发生产两个要害属性 concurrentConsumers 和 prefetchCount,concurrentConsumers 设置的是对每个 listener 在初始化的时候设置的并发消费者的个数,prefetchCount 是每次一次性从 broker 外面取的待生产的音讯的个数

建设新的 queue,消费者同时订阅新旧 queue

生产者端缓存数据,在 mq 被生产完后再发送到 mq

突破发送循环条件,设置适合的 qos 值,当 qos 值被用光,而新的 ack 没有被 mq 接管时,就能够跳出发送循环,去接管新的音讯;消费者被动 block 接管过程,消费者感触到接管音讯过快时被动 block,利用 block 和 unblock 办法调节接管速率,当接管线程被 block 时,跳出发送循环。

新建一个 topic,partition 是原来的 10 倍;而后写一个长期的散发数据的 consumer 程序,这个程序部署下来生产积压的数据,生产之后不做耗时的解决,间接平均轮询写入长期建设好的 10 倍数量的 queue;接着长期征用 10 倍的机器来部署 consumer,每一批 consumer 生产一个长期 queue 的数据;等疾速生产完积压数据之后,得复原原先部署架构,从新用原先的 consumer 机器来生产音讯;

10、一个线程池正在解决服务如果突然断电该怎么办?

队列实现长久化贮存,下次启动主动载入。

然而理论须要看状况,大体思路是这样。

增加标记位,未解决 0,解决中 1,已解决 2。每次启动的时候,把所有状态为 1 的,置为 0。或者定时器解决

关键性的利用就给电脑配个 UPS。

c/c++ linux 后盾服务器开发学习地址:https://ke.qq.com/course/4177…(内容包含:C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK 等等

11、红黑树的特点?

(1)每个节点或者是彩色,或者是红色。

(2)根节点是彩色。

(3)每个叶子节点(NIL)是彩色。[留神:这里叶子节点,是指为空(NIL 或 NULL) 的叶子节点!]

(4)如果一个节点是红色的,则它的子节点必须是彩色的。

(5)从一个节点到该节点的子孙节点的所有门路上蕴含雷同数目的黑节点。[这里指到 叶子节点的门路]

12、分布式服务调用的特点?

分布式服务调用能够实现跟踪零碎,能够在业务日志中增加调用链 ID,各个环节 RPC 均增加调用时延,QPS 等。

非业务组件应该少退出业务代码,服务调用采纳买点,也会采纳配置采样率形式,买点 即以后节点的上下文信息,蕴含 TraceId,RPCId,开始完结工夫,类型,协定,调用 方 IP,端口,服务名等,以及其余异样信息,报文等扩大,日志采纳离线 + 实时的如 flume 联合 kafka 等,应依照 TraceId 汇总日志后按 RPCId 程序整顿。

13、如何编写高质量 C ++ 代码的倡议?

1) extern C 的作用是当程序被 C ++ 编译器编译时,让后续的链接器以 C 形式来寻找函数,不便 C ++ 程序调用 C 程序。

2) C++ 格调正文形如:// ….,举荐应用这样的正文。然而,头文件阐明和函数默认参数的正文,还是用 C 格调 (/**/) 的较好。

3) 不要写与编译器依赖严密的代码

例如:printf(“a %d %d”, p(), q()),p 和 q 函数的执行前后程序与编译器实现相干,该当防止此类代码。相似的还有 c = p() * q() * r()。

4) 尽量用 const,enum,inline 代替 #define

inline 关键字用在函数调用开展,在类申明中定义并且实现的函数主动为内联函数。如果须要将其余函数定义为内联函数,则须要在函数实现头申明此关键字,才让编译器尝试去内联,至于具体是否内联,还要求函数体满足肯定条件才行,总体准则是短小精悍。

在应用 define 的场合,留神用 () 来爱护宏函数。例如:#define MAX(a, b) ((a) > (b) ? (a) : (b))

5) struct 在 C 和 C ++ 下的异同,C 语言的 struct 不容许定义函数程序,而 C ++ 语言下的 struct 能够。

6) 所有数据成员一律为 private 类型。如果派生类须要用到,那么在用到的时候再将其改为 protect 类型,否则,一律申明为 private 类型,对外暗藏。在具体申明时,能够按类型来多段申明,比方公有控件,来一个 private,公有数据来另外一个 private。

7) 当类中至多蕴含一个虚函数时,才须要将其析构函数设置为虚函数。不要在结构 / 析构函数中调用虚函数。

8) 以行为为核心的类设计,对外的 public 函数放在后面,须要继承的 protect 虚函数紧随其后,再前面是 private 的虚函数、一般函数以及成员变量。

9) 语法的背地含意是语义,接口设计要有明确的语义,不可不置可否、职责不清。

10) 如底层产生异样,则须要逐级上报,直到有能力解决此异样的层级来解决。如果程序都没解决,则会被 C ++ 零碎捕捉并终止程序运行。异样能够将产生谬误和处理错误拆散。

11) 个别以传值来抛出异样,以 const 援用来捕捉异样,不波及到异样对象的清理工作,无对象切割问题,如本层级解决后还须要持续抛出异样,可调用 throw 来。

12) 优先应用 shared_ptr,它外部工作原理是援用计数,线程平安,反对扩大,举荐应用。

须要更多最新面试题(阿里系、腾讯系、百度系)能够加 qun(563998835)

正文完
 0