写点什么

当东哥开始卷外卖:奶茶砍半价比拼多多还狠!附京东面试题

作者:王中阳Go
  • 2025-04-28
    湖南
  • 本文字数:4654 字

    阅读完需:约 15 分钟

当东哥开始卷外卖:奶茶砍半价比拼多多还狠!附京东面试题

东哥这波操作太狠了,不是因为商业决策,而是因为送外卖!


4 月 21 日,北京街头惊现一位 “神秘骑手”,定睛一看,竟是刘强东本人。他穿着京东外卖工服,骑着小电驴,穿梭在楼宇间送奶茶炸鸡,这画面简直不要太魔幻。网友们纷纷调侃:“东哥这是要体验生活,还是要抢外卖员的饭碗?”



送完外卖后,刘强东又搞了个大动作 —— 包下海底捞请全体骑手涮火锅。在视频里,他举着酒杯对着穿美团、饿了么工服的骑手喊话:“欢迎兄弟们跳槽来京东!” 这波操作可谓是赚足了眼球,也让京东和美团的外卖大战彻底白热化。



今年 2 月,京东高调杀入外卖赛道,一上来就甩出三张王牌:0 佣金挖墙脚、百亿补贴砸用户、骑手 “五险一金” 拉人头。这每一招都直戳美团的痛点,尤其是骑手的福利问题,更是引发了广泛关注。面对京东的攻势,美团也迅速做出反应,推出 “护城计划”,降低商家抽佣,豪掷 1000 亿补贴餐饮行业,还放话要建 10 万个 “闪电仓”。双方你来我往,互不相让,这场商战堪称史无前例。​


在这场大战中,最开心的莫过于普通群众了。资本打架,百姓得利,各种优惠券满天飞,奶茶、炸鸡的价格也是一降再降。网友们纷纷表示:“这样的商战请再来一打,最好打到奶茶 1 元、炸鸡白送!”​



这场外卖江湖的大战,看似是京东和美团在抢订单,实则是本地生活服务的终极对决。京东想通过高频的外卖业务带动低频的电商业务,让用户从 “一年逛两次京东” 变成 “天天点京东”;美团则要守住外卖基本盘,防止即时零售业务被反杀。而骑手们,也在这场大战中成为了 “香饽饽”,福利越来越好。​


看到这里,很多小伙伴可能已经迫不及待想要和东哥做兄弟了,当然,是那种坐办公室的兄弟,哈哈。


你别说,我的学员还真就实现了,跟着东哥混了。




想必你也希望加入京东这样的优秀企业,今天我就来分享一下我们组织内部整理的京东面经详解,希望能帮助到你。

京东面经分享

go 语言的 map,拉链法

Go 语言的map底层基于哈希表实现,采用拉链法解决哈希冲突。其核心结构是hmap,包含以下关键点:


  1. hmap结构

  2. hmapmap的底层数据结构,包含以下关键字段:

  3. count:键值对数量。

  4. B:哈希桶数组的大小(2^B)。

  5. bucket:指向桶数组的指针。

  6. oldbucket:扩容时临时存储旧桶的指针。

  7. hash0:哈希种子,用于提高哈希分布的随机性。

  8. 桶数组:每个桶(bmap类型)存储 8 个键值对。

  9. bmap结构

  10. 每个bmap包含以下字段:

  11. keys:存储键的数组,长度为 8(uint8类型,实际存储的是指针或值,取决于键类型)。

  12. topbits:记录键的高位哈希值,用于快速判断键是否存在。

  13. overflow:指向溢出桶的指针(当冲突时形成链表)。

  14. flags:标记键是否被占用或删除。

  15. 拉链法实现细节

  16. 哈希冲突处理:当多个键的哈希值映射到同一桶时,通过overflow指针链接到下一个bmap,形成链表。

  17. 扩容机制

  18. count > loadFactor * bucketCnt时触发扩容(默认loadFactor=6.5/8)。

  19. 新桶大小为2^(B+1),元素重新哈希到新桶。

  20. 扩容过程中,旧桶和新桶同时存在,通过oldbucket指针过渡,保证并发读写安全。

  21. 优化点

  22. 每个桶固定存储 8 个键值对,减少指针开销。

  23. 利用 CPU 缓存局部性,连续存储键值对提升访问速度。



数据库索引有哪些

数据库索引主要分为以下类型(基于知识库中的分类和扩展):


  1. B+树索引

  2. 结构

  3. 多级索引树,叶子节点按顺序存储键值及对应数据指针。

  4. 非叶子节点存储中间键和子节点指针。

  5. 特点

  6. 支持范围查询(如WHERE id BETWEEN 1 AND 100)。

  7. 插入/删除需保持树平衡,性能略低于哈希索引。

  8. 适用场景:主键索引、唯一索引、普通索引。

  9. 哈希索引

  10. 结构

  11. 哈希表结构,键通过哈希函数映射到桶位置。

  12. 特点

  13. 仅支持等值查询(如WHERE id=5)。

  14. 不支持范围查询,且数据无序存储。

  15. 适用场景:等值查询频繁的场景(如内存数据库)。

  16. 全文索引

  17. 结构

  18. 对文本进行分词,构建倒排索引(词→文档 ID 列表)。

  19. 特点

  20. 支持模糊匹配(如WHERE content LIKE '%keyword%')。

  21. 需预处理文本(分词、停用词过滤)。

  22. 适用场景:搜索引擎、日志分析。

  23. 空间索引

  24. 结构

  25. 使用 R 树或四叉树存储地理坐标数据。

  26. 特点

  27. 支持范围查询(如WHERE distance < 100km)。

  28. 处理高维数据效率较高。

  29. 适用场景:GIS 系统、地图应用。

  30. 组合索引

  31. 结构

  32. 多列组合成一个索引,按列顺序存储。

  33. 特点

  34. 遵循最左前缀原则(如索引(a,b)可支持WHERE a=1,但WHERE b=2无效)。

  35. 适用场景:多条件联合查询。



数据库四大特性

数据库的四大特性(ACID)是事务可靠性的核心保障:


  1. 原子性(Atomicity)

  2. 实现方式

  3. 通过**事务日志(Redo Log)**记录操作,失败时回滚(Rollback)。

  4. 比如,转账操作若中途失败,日志记录撤销未完成的步骤。

  5. 示例


     BEGIN;     UPDATE account SET balance = balance - 100 WHERE id=1;  -- 步骤1     UPDATE account SET balance = balance + 100 WHERE id=2;  -- 步骤2     COMMIT;  -- 若步骤2失败,步骤1会被回滚
复制代码


  1. 一致性(Consistency)

  2. 约束维护

  3. 通过外键约束检查约束等确保数据符合业务规则。

  4. 例如,订单金额必须大于 0。

  5. 依赖 ACID:一致性依赖其他特性(如原子性避免数据半更新)。

  6. 隔离性(Isolation)

  7. 隔离级别

  8. Read Uncommitted(RU):允许脏读,但无实际应用场景。

  9. Read Committed(RC):每次查询使用最新快照,避免脏读但可能不可重复读。

  10. Repeatable Read(RR):事务内快照一致,通过 MVCC 和间隙锁防幻读。

  11. Serializable(SERIALIZABLE):串行化执行,通过锁全表。

  12. 冲突示例

  13. 脏读:事务 A 读取事务 B 未提交的数据,B 回滚后 A 数据无效。

  14. 幻读:事务 A 两次查询同一条件,事务 B 插入新数据导致结果变化。

  15. 持久性(Durability)

  16. 实现机制

  17. Write-Ahead Logging(WAL):先写日志再写数据,崩溃后通过日志恢复。

  18. 刷盘策略COMMIT时确保日志写入磁盘(如 MySQL 的innodb_flush_log_at_trx_commit=1)。



innodb 默认隔离级别

InnoDB 的默认隔离级别是可重复读(Repeatable Read,RR),其设计原因和实现细节如下:


  1. 设计原因

  2. 主从复制兼容性

  3. STATEMENT格式的 Binlog 中,RR避免因其他事务修改数据导致主从不一致。

  4. 例如,SELECTUPDATE若在READ COMMITTED下可能产生不同结果。

  5. 用户习惯:大多数用户期望事务内多次读取结果一致。

  6. 实现机制

  7. MVCC(多版本并发控制)

  8. 隐藏列:每行记录包含DB_TRX_ID(创建事务 ID)、DB_ROLL_PTR(回滚指针)等。

  9. Read View:事务开始时生成,记录活跃事务列表,过滤不可见版本。

  10. 可见性规则

  11. 若当前事务 ID > 记录的DB_TRX_ID且记录未被删除,且记录的事务已提交。

  12. 间隙锁(Gap Lock)

  13. 锁定索引区间(如WHERE id > 100会锁(100, ∞)区间)。

  14. 防止其他事务在区间内插入新行,避免幻读。

  15. Next-Key Lock

  16. 结合记录锁和间隙锁,锁定索引记录及前后区间。

  17. 例如,SELECT ... FOR UPDATE会锁定查询到的记录及可能的间隙。



rr 是怎么实现的

RR 的实现依赖 MVCC 锁机制,具体流程如下:


  1. MVCC 实现

  2. 行版本管理

  3. 每次更新生成新版本,旧版本通过回滚段(Undo Log)保留。

  4. 事务通过Read View过滤不可见版本。

  5. Read View 结构

  6. min_trx_id:当前事务 ID。

  7. max_trx_id:系统中未提交的事务最大 ID。

  8. trx_ids:活跃事务列表。

  9. 可见性判断逻辑


     if record.trx_id < current_trx_id {         // 记录已提交,可见     } else if record.trx_id > max_trx_id {         // 未提交,不可见     } else {         // 检查trx_ids列表,若存在则不可见     }
复制代码


  1. 锁机制

  2. 记录锁(Record Lock):锁定具体索引记录。

  3. 间隙锁(Gap Lock):锁定索引区间,防止插入。

  4. Next-Key Lock:记录锁 + 间隙锁,防幻读。

  5. 示例


     -- 事务A执行:     SELECT * FROM t WHERE id = 1 FOR UPDATE;  -- 锁定id=1记录     SELECT * FROM t WHERE id BETWEEN 10 AND 20;  -- 锁定区间(10,20)
复制代码


  1. 冲突处理

  2. 死锁检测:InnoDB 定期检测锁等待环,自动回滚代价小的事务。

  3. 锁超时:通过innodb_lock_wait_timeout设置等待时间。



tcp 三次握手

TCP 三次握手的详细流程及作用如下:


  1. 第一次握手(SYN=1):

  2. 客户端发送SYN包,携带初始序列号ISN_Client

  3. 客户端进入SYN_SENT状态。

  4. 作用:请求建立连接,同步客户端初始序列号。

  5. 第二次握手(SYN=1, ACK=1):

  6. 服务端回复SYN-ACK包,携带:

  7. SYN=1:服务端同意建立连接。

  8. ACK=ISN_Client + 1:确认客户端序列号。

  9. ISN_Server:服务端初始序列号。

  10. 服务端进入SYN_RCVD状态。

  11. 作用:确认客户端请求,同步服务端初始序列号。

  12. 第三次握手(ACK=1):

  13. 客户端发送ACK包,携带:

  14. ACK=ISN_Server + 1:确认服务端序列号。

  15. 双方进入ESTABLISHED状态。

  16. 作用:客户端确认服务端的响应,连接正式建立。

  17. 关键点

  18. 序列号同步:双方确认初始序列号,确保数据有序传输。

  19. 防旧连接干扰

  20. 若客户端重传SYN,服务端的SYN-ACK包含ACK=ISN_Client+1,避免旧数据包被误处理。

  21. 若服务端重启后收到旧SYN,其ISN_Server已变化,导致客户端无法正确响应。



ip 位于哪层?icmp 位于哪层?ping 命令位于哪层?

  1. IP 协议

  2. OSI 模型网络层(第三层)

  3. 功能

  4. 逻辑寻址(IP 地址)。

  5. 路由选择(通过路由表转发数据包)。

  6. 分片与重组(处理超过 MTU 的数据包)。

  7. ICMP 协议

  8. OSI 模型网络层(第三层)

  9. 功能

  10. 错误报告:如Destination Unreachable(目标不可达)。

  11. 查询与诊断:如Echo Request/Reply(支持ping命令)。

  12. 拥塞控制:如Source Quench(减少发送速率)。

  13. ping 命令

  14. 实现机制

  15. 发送 ICMP Echo Request包,等待Echo Reply响应。

  16. 计算往返时间(RTT)和丢包率。

  17. 协议层网络层,直接依赖 IP 和 ICMP。

  18. 示例


     ping 192.168.1.1     # 发送ICMP Echo Request到目标IP,接收Echo Reply
复制代码



telnet 是什么操作?位于哪层?

  1. Telnet 定义

  2. 功能:基于 TCP 协议的远程终端协议,用于登录并操作远程主机。

  3. 典型用途

  4. 远程执行命令(如ls, cd)。

  5. 配置网络设备(如路由器)。

  6. 协议层

  7. OSI 模型应用层(第七层)

  8. 依赖层

  9. 传输层:使用 TCP(端口 23)建立可靠连接。

  10. 网络层:IP 负责寻址。

  11. 工作原理

  12. 连接建立:客户端发起 TCP 三次握手,与服务端建立连接。

  13. 数据交互

  14. 客户端输入命令,通过 TCP 发送。

  15. 服务端响应通过 TCP 返回。

  16. 选项协商(可选):

  17. 通过IAC(解释器命令)协商选项,如回显开关、字符集。

  18. 示例


       Client: IAC WILL ECHO(请求开启回显)         Server: IAC DO ECHO(同意请求)  
复制代码


  1. 缺点

  2. 明文传输:密码、命令可见,易被窃听。

  3. 替代方案:SSH(加密传输,支持密钥认证)。



https 加密过程

HTTPS 的加密过程通过 TLS/SSL 协议实现,分阶段详细如下:


  1. 客户端 Hello

  2. 客户端发送支持的协议版本(如 TLS 1.2)、加密套件(如TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384)、随机数ClientRandom

  3. 服务器 Hello

  4. 服务端选择客户端支持的最高协议版本和加密套件。

  5. 返回服务端随机数ServerRandom和证书(含公钥)。

  6. 证书验证

  7. 客户端验证证书合法性:

  8. 证书颁发机构(CA)是否可信。

  9. 主机名是否匹配证书中的域名。

  10. 证书是否过期或吊销。

  11. 密钥交换(如 ECDHE):

  12. 非对称加密

  13. 客户端生成预主密钥(Pre-Master Secret),用服务端公钥加密后发送。

  14. 密钥协商

  15. 双方结合ClientRandomServerRandom和预主密钥生成对称密钥(Master Secret)。

  16. 加密通信

  17. 对称加密

  18. 使用 AES-256-GCM 等算法加密数据,确保机密性和完整性。

  19. MAC(消息认证码):防止数据篡改(如 HMAC-SHA384)。

  20. 数据传输

  21. 应用层数据(如 HTTP 请求)通过 TLS 记录层封装后发送。

  22. 安全特性

  23. 前向安全性:即使长期密钥泄露,攻击者无法解密之前的通信(因预主密钥每会话生成)。

  24. 证书吊销检查:通过 OCSP stapling 减少延迟。



欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。


没准能让你能刷到自己意向公司的最新面试题呢。


感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:面试群。

发布于: 刚刚阅读数: 6
用户头像

王中阳Go

关注

靠敲代码在北京买房的程序员 2022-10-09 加入

【微信】wangzhongyang1993【公众号】程序员升职加薪之旅【成就】InfoQ专家博主👍掘金签约作者👍B站&掘金&CSDN&思否等全平台账号:王中阳Go

评论

发布
暂无评论
当东哥开始卷外卖:奶茶砍半价比拼多多还狠!附京东面试题_面经_王中阳Go_InfoQ写作社区