『C++』2020年最新阿里C/C++ Linux后台开发面试题及答案


『C++』2020年最新阿里C/C++ Linux后台开发面试题及答案
文章图片
『C++』2020年最新阿里C/C++ Linux后台开发面试题及答案
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;结合服务器性能调节并发情况 。


推荐阅读