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毫秒=320x10~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)