后台开发面试题(持续完善中)

本文深入探讨了C++的特性,包括静态库与动态库的区别、多态原理、内存布局等,同时详细分析了Redis的数据类型实现,如String、Hash、List、Set和SortedSet,以及其高效的运行机制、事务处理、主从同步和数据淘汰策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++

  1. c++11
  2. 静态库与动态库:静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库;编译之后程序文件大,但加载快,隔离性好。动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。
  3. sizeof 编译时确定还是运行时确定:sizeof在c99的动态数组里运行时确定,在c++里是编译时确定,返回是的字节数;sizeof(类型,指针,数组),sizeof(数组)返回的是数组所占空间的大小;strlen(数组)表示数组所占的字节数。strlen运行时确定,strlen表示 char * 的有效长度(不包含0)(0结束)。https://www.cnblogs.com/zpcdbky/p/5857656.html
  4. volatile 原理
  5. new 与 malloc
  6. 多态的原理,虚表虚指针等
  7. 内存布局,静态库加载后在哪里?共享内存挂载后在哪里?
  8. 智能指针原理,几种智能指针的对比
  9. 类的4个默认函数;如何禁止类的拷贝;析构函数何时要设为虚函数?为什么?构造函数为什么不能虚函数?构造函数调用顺序;析构函数调用顺序
  10. static 的具体用法,const 的用法
  11. c++ 四中类型转换的区别
  12. 字节对齐
  13. 手写string的实现
  14. gdb 多线程多、进程的调试
  15. pstack 的使用

java

linux

  1. 基本命令 top awk sed grep sort uniq netstat

数据结构

vector

  1. vector就是动态数组.它也是在堆中分配内存,元素连续存放;
  2. 插入数据 当size > cap 时,成倍扩容,申请一片2*size的连续空间,将原先的内容拷贝过去,并删除原先的空间;当vector 的size 过大的时候,会引起线程较大的延时(阻塞)
  3. 预估vector容量大小,初始化vector的时候rerserve至该大小,避免扩容;或者采用多个vector存储。

map/set

  1. 采用红黑树实现,空间不连续
  2. 自定义的key_class 作为key 需要在key_class中实现 bool operator <(const key_class& other) const 函数

unordered_map/unordered_set

  1. 底层采用哈希实现,数组(桶,hash函数确定)+链表
  2. 自定义的class 作为key 需要实现 hash 函数及 equal 函数
  3. 当元素个数 > 桶个数* 哈希因子后,会进行扩容操作,重新分配更多的桶,将老元素一一遍历存入新桶中。如果哈希表中元素个数过多,会引起当前线程的阻塞
  4. 预估数据量,初始化时调用rehash;或者采用多个hash表存储。

平衡二叉树 B树 B+树 B*树

  1. 平衡二叉树:二叉树,叶子节点的高度相差不超过1
  2. 红黑树:根结点黑色;叶子节点黑色;红节点的儿子黑色;每条路径黑色节点数目相同。ordered_map 采用红黑树实现,因为平衡二叉树在删除节点时需要旋转o(logn),而红黑树只需要旋转3次
  3. B树:平衡多叉树,非叶子节点包含多个元素;叶子节点处于同一层
  4. B+树:数据只存在于叶子节点;叶子节点快之间增加指针
  5. B*树:兄弟结点间,增加指针(链表)

设计模式

  1. 单例模式(懒汉、饿汉、线程安全)
  2. 代理模式与装饰模式
  3. 观察者模式
  4. 工厂模式
  5. 状态机模式

网络

  1. 7层或5层网络模型
  2. 滑动窗口与拥塞控制,快恢复与慢重传
  3. tcp 与 udp 的差别
  4. nagle 算法
  5. time_wait 及close_wait 产生原因及后果
  6. 三次握手 四次挥手 状态图
  7. select poll epoll
  8. 阻塞与非阻塞 同步与异步的差别
  9. epoll 水平触发与边缘触发区别,为什么边缘触发一定要使用非阻塞模式?
  10. reactor 与 proactor
  11. 打开一个网页,具体发生了啥

操作系统

  1. 死锁的几个要素
  2. 用户态与内核态
  3. 线程与进程的差别
  4. 线程同步与进程通信的方式

redis

数据类型及底层实现

http://www.cnblogs.com/jaycekon/p/6227442.html

  1. String:动态数组实现
  2. Hash:ziplist与dict(hashtable)
  3. List: ziplist或linkedlist
  4. Set:整数集合或者hashtable
  5. Sorted Set:ziplist 或者 skiplist与hashtable结合

持久化方式

  1. rdb: 全量同步,生成rdb文件(多长时间内有多少次变更就save):恢复数据的速度快,但是丢的数据会比较多
  2. aof:增量同步:文件大,恢复慢,消耗资源多;但是容易读懂,数据最多丢失一秒钟的

主从同步(复制)的步骤

  1. 从服务器向主服务器发送SYNC命令;主服务器收到sync命令后,后台生成rdb文件,并缓冲区记录所有的写命令;
  2. 主redis生成rdb文件完毕之后,将rdb文件发给送从redis;从redis收到rdb文件,加载rdb文件,将从数据库的状态更新至主开始生成rdb文件时的状态;
  3. 主redis将缓冲区的命令传播给从redis

内存管理与数据淘汰策略

maxmemory-policy volatile-lru #默认是noeviction,即不进行数据淘汰

  • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据

过期键值淘汰策略

默认是定期删除与惰性删除的结合

  • 定时删除:设置定时器,到时间删除
  • 定期删除: 过一段时间,全库扫描一次,删除过期的
  • 惰性删除:每次get的时候检查一次

zset 解决的问题

topN 及排行榜问题

hash 的渐进式rehash 过程

rehashidx从0到n-1,rehash 完毕后置为-1
http://redisbook.com/preview/dict/incremental_rehashing.html

redis4.0 的异步删除

ht 中的size及used
https://www.cnblogs.com/svan/p/7054129.html

redis 的线程模型

reactor,one loop per thread
https://www.cnblogs.com/barrywxx/p/8570821.html

redis 为什么高效

https://blog.youkuaiyun.com/chenyao1994/article/details/79491337

  • 纯内存操作,数据结构简单,查找o(1)
  • 单线程,没有锁及线程切换开销
  • reactor,基于事件触发,非阻塞,IO多路复用

redis的事务实现方式

哨兵主从

redis-cluster 与codis 集群方案 异同与优劣

redis 与memcache 对比

mysql

  1. 几种引擎的区别及选取
  2. 事务隔离等级
  3. mvcc
  4. B+ 树做InnoDB的索引的理由
  5. mysql 锁粒度,乐观锁 悲观锁
  6. 索引种类,建索引的原则,联合索引,聚簇索引
  7. 分库分表如何防击穿
  8. 分布式事物的解决方案

算法

  1. 洗牌算法 http://www.matrix67.com/blog/archives/879
  2. 贪婪问题
  3. 全排列问题
  4. 最长公共子串
  5. 深度优先 广度优先
  6. 二叉树的深度、宽度,二叉树到某个节点的路径,二叉树中某两个节点的最近根节点
  7. 快排,堆排序,优化方案
  8. top N
  9. 山谷积水 https://blog.youkuaiyun.com/Thomas0713/article/details/83051990https://blog.youkuaiyun.com/weixin_42018258/article/details/80626637
  10. 一维数组的极值点求取(log2n的复杂度)
  11. 找出数据中唯一出现一次的数字https://blog.youkuaiyun.com/u011960402/article/details/17750993
  12. 二叉树两个结点的公共祖先https://blog.youkuaiyun.com/qq_25827845/article/details/74612786

中间件

  1. rpc
  2. rocketmq 与kafka
  3. zookeeper

高并发案例

  1. 全局唯一id的方案
  2. 缓存与db 一致性的方案
  3. 中心化缓存的操作方式、优缺点
  4. LRU 的具体实现
  5. 分布式锁的几种方案
  6. 设计一个秒杀系统
  7. 数据平滑迁移的方案 https://blog.youkuaiyun.com/admin1973/article/details/65629412

https://blog.youkuaiyun.com/sofia1217/article/details/44905461
https://blog.youkuaiyun.com/qq_19320865/article/details/78497278
https://blog.youkuaiyun.com/m0_37947204/article/details/80103151
https://blog.youkuaiyun.com/u011960402/article/details/17750993

mysql 相关
https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=2651961620&idx=1&sn=d858c302799cad451656129885214767&chksm=bd2d0cc88a5a85de11ed376570f78a22954e88aad06f0138b3fbfb7be1968699421ac0b99889&scene=21#wechat_redirect
《MySQL实战45讲》林晓冰

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值