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

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

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

今年 2 月,京东高调杀入外卖赛道,一上来就甩出三张王牌:0 佣金挖墙脚、百亿补贴砸用户、骑手 “五险一金” 拉人头。这每一招都直戳美团的痛点,尤其是骑手的福利问题,更是引发了广泛关注。面对京东的攻势,美团也迅速做出反应,推出 “护城计划”,降低商家抽佣,豪掷 1000 亿补贴餐饮行业,还放话要建 10 万个 “闪电仓”。双方你来我往,互不相让,这场商战堪称史无前例。
在这场大战中,最开心的莫过于普通群众了。资本打架,百姓得利,各种优惠券满天飞,奶茶、炸鸡的价格也是一降再降。网友们纷纷表示:“这样的商战请再来一打,最好打到奶茶 1 元、炸鸡白送!”

这场外卖江湖的大战,看似是京东和美团在抢订单,实则是本地生活服务的终极对决。京东想通过高频的外卖业务带动低频的电商业务,让用户从 “一年逛两次京东” 变成 “天天点京东”;美团则要守住外卖基本盘,防止即时零售业务被反杀。而骑手们,也在这场大战中成为了 “香饽饽”,福利越来越好。
看到这里,很多小伙伴可能已经迫不及待想要和东哥做兄弟了,当然,是那种坐办公室的兄弟,哈哈。
你别说,我的学员还真就实现了,跟着东哥混了。


想必你也希望加入京东这样的优秀企业,今天我就来分享一下我们组织内部整理的京东面经详解,希望能帮助到你。
京东面经分享
go 语言的 map,拉链法
Go 语言的map
底层基于哈希表实现,采用拉链法解决哈希冲突。其核心结构是hmap
,包含以下关键点:
hmap
结构:hmap
是map
的底层数据结构,包含以下关键字段:count
:键值对数量。B
:哈希桶数组的大小(2^B
)。bucket
:指向桶数组的指针。oldbucket
:扩容时临时存储旧桶的指针。hash0
:哈希种子,用于提高哈希分布的随机性。桶数组:每个桶(
bmap
类型)存储 8 个键值对。bmap
结构:每个
bmap
包含以下字段:keys
:存储键的数组,长度为 8(uint8
类型,实际存储的是指针或值,取决于键类型)。topbits
:记录键的高位哈希值,用于快速判断键是否存在。overflow
:指向溢出桶的指针(当冲突时形成链表)。flags
:标记键是否被占用或删除。拉链法实现细节:
哈希冲突处理:当多个键的哈希值映射到同一桶时,通过
overflow
指针链接到下一个bmap
,形成链表。扩容机制:
当
count > loadFactor * bucketCnt
时触发扩容(默认loadFactor=6.5/8
)。新桶大小为
2^(B+1)
,元素重新哈希到新桶。扩容过程中,旧桶和新桶同时存在,通过
oldbucket
指针过渡,保证并发读写安全。优化点:
每个桶固定存储 8 个键值对,减少指针开销。
利用 CPU 缓存局部性,连续存储键值对提升访问速度。
数据库索引有哪些
数据库索引主要分为以下类型(基于知识库中的分类和扩展):
B+树索引:
结构:
多级索引树,叶子节点按顺序存储键值及对应数据指针。
非叶子节点存储中间键和子节点指针。
特点:
支持范围查询(如
WHERE id BETWEEN 1 AND 100
)。插入/删除需保持树平衡,性能略低于哈希索引。
适用场景:主键索引、唯一索引、普通索引。
哈希索引:
结构:
哈希表结构,键通过哈希函数映射到桶位置。
特点:
仅支持等值查询(如
WHERE id=5
)。不支持范围查询,且数据无序存储。
适用场景:等值查询频繁的场景(如内存数据库)。
全文索引:
结构:
对文本进行分词,构建倒排索引(词→文档 ID 列表)。
特点:
支持模糊匹配(如
WHERE content LIKE '%keyword%'
)。需预处理文本(分词、停用词过滤)。
适用场景:搜索引擎、日志分析。
空间索引:
结构:
使用 R 树或四叉树存储地理坐标数据。
特点:
支持范围查询(如
WHERE distance < 100km
)。处理高维数据效率较高。
适用场景:GIS 系统、地图应用。
组合索引:
结构:
多列组合成一个索引,按列顺序存储。
特点:
遵循最左前缀原则(如索引
(a,b)
可支持WHERE a=1
,但WHERE b=2
无效)。适用场景:多条件联合查询。
数据库四大特性
数据库的四大特性(ACID)是事务可靠性的核心保障:
原子性(Atomicity):
实现方式:
通过**事务日志(Redo Log)**记录操作,失败时回滚(Rollback)。
比如,转账操作若中途失败,日志记录撤销未完成的步骤。
示例:
一致性(Consistency):
约束维护:
通过外键约束、检查约束等确保数据符合业务规则。
例如,订单金额必须大于 0。
依赖 ACID:一致性依赖其他特性(如原子性避免数据半更新)。
隔离性(Isolation):
隔离级别:
Read Uncommitted(RU):允许脏读,但无实际应用场景。
Read Committed(RC):每次查询使用最新快照,避免脏读但可能不可重复读。
Repeatable Read(RR):事务内快照一致,通过 MVCC 和间隙锁防幻读。
Serializable(SERIALIZABLE):串行化执行,通过锁全表。
冲突示例:
脏读:事务 A 读取事务 B 未提交的数据,B 回滚后 A 数据无效。
幻读:事务 A 两次查询同一条件,事务 B 插入新数据导致结果变化。
持久性(Durability):
实现机制:
Write-Ahead Logging(WAL):先写日志再写数据,崩溃后通过日志恢复。
刷盘策略:
COMMIT
时确保日志写入磁盘(如 MySQL 的innodb_flush_log_at_trx_commit=1
)。
innodb 默认隔离级别
InnoDB 的默认隔离级别是可重复读(Repeatable Read,RR),其设计原因和实现细节如下:
设计原因:
主从复制兼容性:
在
STATEMENT
格式的 Binlog 中,RR
避免因其他事务修改数据导致主从不一致。例如,
SELECT
后UPDATE
若在READ COMMITTED
下可能产生不同结果。用户习惯:大多数用户期望事务内多次读取结果一致。
实现机制:
MVCC(多版本并发控制):
隐藏列:每行记录包含
DB_TRX_ID
(创建事务 ID)、DB_ROLL_PTR
(回滚指针)等。Read View:事务开始时生成,记录活跃事务列表,过滤不可见版本。
可见性规则:
若当前事务 ID > 记录的
DB_TRX_ID
且记录未被删除,且记录的事务已提交。间隙锁(Gap Lock):
锁定索引区间(如
WHERE id > 100
会锁(100, ∞)
区间)。防止其他事务在区间内插入新行,避免幻读。
Next-Key Lock:
结合记录锁和间隙锁,锁定索引记录及前后区间。
例如,
SELECT ... FOR UPDATE
会锁定查询到的记录及可能的间隙。
rr 是怎么实现的
RR 的实现依赖 MVCC 和锁机制,具体流程如下:
MVCC 实现:
行版本管理:
每次更新生成新版本,旧版本通过回滚段(Undo Log)保留。
事务通过
Read View
过滤不可见版本。Read View 结构:
min_trx_id
:当前事务 ID。max_trx_id
:系统中未提交的事务最大 ID。trx_ids
:活跃事务列表。可见性判断逻辑:
锁机制:
记录锁(Record Lock):锁定具体索引记录。
间隙锁(Gap Lock):锁定索引区间,防止插入。
Next-Key Lock:记录锁 + 间隙锁,防幻读。
示例:
冲突处理:
死锁检测:InnoDB 定期检测锁等待环,自动回滚代价小的事务。
锁超时:通过
innodb_lock_wait_timeout
设置等待时间。
tcp 三次握手
TCP 三次握手的详细流程及作用如下:
第一次握手(SYN=1):
客户端发送
SYN
包,携带初始序列号ISN_Client
。客户端进入
SYN_SENT
状态。作用:请求建立连接,同步客户端初始序列号。
第二次握手(SYN=1, ACK=1):
服务端回复
SYN-ACK
包,携带:SYN=1
:服务端同意建立连接。ACK=ISN_Client + 1
:确认客户端序列号。ISN_Server
:服务端初始序列号。服务端进入
SYN_RCVD
状态。作用:确认客户端请求,同步服务端初始序列号。
第三次握手(ACK=1):
客户端发送
ACK
包,携带:ACK=ISN_Server + 1
:确认服务端序列号。双方进入
ESTABLISHED
状态。作用:客户端确认服务端的响应,连接正式建立。
关键点:
序列号同步:双方确认初始序列号,确保数据有序传输。
防旧连接干扰:
若客户端重传
SYN
,服务端的SYN-ACK
包含ACK=ISN_Client+1
,避免旧数据包被误处理。若服务端重启后收到旧
SYN
,其ISN_Server
已变化,导致客户端无法正确响应。
ip 位于哪层?icmp 位于哪层?ping 命令位于哪层?
IP 协议:
OSI 模型:网络层(第三层)。
功能:
逻辑寻址(IP 地址)。
路由选择(通过路由表转发数据包)。
分片与重组(处理超过 MTU 的数据包)。
ICMP 协议:
OSI 模型:网络层(第三层)。
功能:
错误报告:如
Destination Unreachable
(目标不可达)。查询与诊断:如
Echo Request/Reply
(支持ping
命令)。拥塞控制:如
Source Quench
(减少发送速率)。ping 命令:
实现机制:
发送 ICMP
Echo Request
包,等待Echo Reply
响应。计算往返时间(RTT)和丢包率。
协议层:网络层,直接依赖 IP 和 ICMP。
示例:
telnet 是什么操作?位于哪层?
Telnet 定义:
功能:基于 TCP 协议的远程终端协议,用于登录并操作远程主机。
典型用途:
远程执行命令(如
ls
,cd
)。配置网络设备(如路由器)。
协议层:
OSI 模型:应用层(第七层)。
依赖层:
传输层:使用 TCP(端口 23)建立可靠连接。
网络层:IP 负责寻址。
工作原理:
连接建立:客户端发起 TCP 三次握手,与服务端建立连接。
数据交互:
客户端输入命令,通过 TCP 发送。
服务端响应通过 TCP 返回。
选项协商(可选):
通过
IAC
(解释器命令)协商选项,如回显开关、字符集。示例:
缺点:
明文传输:密码、命令可见,易被窃听。
替代方案:SSH(加密传输,支持密钥认证)。
https 加密过程
HTTPS 的加密过程通过 TLS/SSL 协议实现,分阶段详细如下:
客户端 Hello:
客户端发送支持的协议版本(如 TLS 1.2)、加密套件(如
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
)、随机数ClientRandom
。服务器 Hello:
服务端选择客户端支持的最高协议版本和加密套件。
返回服务端随机数
ServerRandom
和证书(含公钥)。证书验证:
客户端验证证书合法性:
证书颁发机构(CA)是否可信。
主机名是否匹配证书中的域名。
证书是否过期或吊销。
密钥交换(如 ECDHE):
非对称加密:
客户端生成预主密钥(Pre-Master Secret),用服务端公钥加密后发送。
密钥协商:
双方结合
ClientRandom
、ServerRandom
和预主密钥生成对称密钥(Master Secret)。加密通信:
对称加密:
使用 AES-256-GCM 等算法加密数据,确保机密性和完整性。
MAC(消息认证码):防止数据篡改(如 HMAC-SHA384)。
数据传输:
应用层数据(如 HTTP 请求)通过 TLS 记录层封装后发送。
安全特性:
前向安全性:即使长期密钥泄露,攻击者无法解密之前的通信(因预主密钥每会话生成)。
证书吊销检查:通过 OCSP stapling 减少延迟。
欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:面试群。
版权声明: 本文为 InfoQ 作者【王中阳Go】的原创文章。
原文链接:【http://xie.infoq.cn/article/b2a39b6c7e079a6fd4a8ed513】。文章转载请联系作者。
评论