东哥这波操作太狠了,不是因为商业决策,而是因为送外卖!
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)。
- 比如,转账操作若中途失败,日志记录撤销未完成的步骤。
示例:
BEGIN; UPDATE account SET balance = balance - 100 WHERE id=1; -- 步骤1 UPDATE account SET balance = balance + 100 WHERE id=2; -- 步骤2 COMMIT; -- 若步骤2失败,步骤1会被回滚
一致性(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
且记录未被删除,且记录的事务已提交。
- 若当前事务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
:活跃事务列表。
可见性判断逻辑:
if record.trx_id < current_trx_id { // 记录已提交,可见 } else if record.trx_id > max_trx_id { // 未提交,不可见 } else { // 检查trx_ids列表,若存在则不可见 }
锁机制:
- 记录锁(Record Lock):锁定具体索引记录。
- 间隙锁(Gap Lock):锁定索引区间,防止插入。
- Next-Key Lock:记录锁 + 间隙锁,防幻读。
示例:
-- 事务A执行: SELECT * FROM t WHERE id = 1 FOR UPDATE; -- 锁定id=1记录 SELECT * FROM t WHERE id BETWEEN 10 AND 20; -- 锁定区间(10,20)
冲突处理:
- 死锁检测: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)和丢包率。
- 发送ICMP
- 协议层:网络层,直接依赖IP和ICMP。
示例:
ping 192.168.1.1 # 发送ICMP Echo Request到目标IP,接收Echo Reply
telnet是什么操作?位于哪层?
Telnet定义:
- 功能:基于TCP协议的远程终端协议,用于登录并操作远程主机。
典型用途:
- 远程执行命令(如
ls
,cd
)。 - 配置网络设备(如路由器)。
- 远程执行命令(如
协议层:
- OSI模型:应用层(第七层)。
依赖层:
- 传输层:使用TCP(端口23)建立可靠连接。
- 网络层:IP负责寻址。
工作原理:
- 连接建立:客户端发起TCP三次握手,与服务端建立连接。
数据交互:
- 客户端输入命令,通过TCP发送。
- 服务端响应通过TCP返回。
选项协商(可选):
- 通过
IAC
(解释器命令)协商选项,如回显开关、字符集。 示例:
Client: IAC WILL ECHO(请求开启回显) Server: IAC DO ECHO(同意请求)
- 通过
缺点:
- 明文传输:密码、命令可见,易被窃听。
- 替代方案:SSH(加密传输,支持密钥认证)。
https加密过程
HTTPS的加密过程通过TLS/SSL协议实现,分阶段详细如下:
客户端Hello:
- 客户端发送支持的协议版本(如TLS 1.2)、加密套件(如
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
)、随机数ClientRandom
。
- 客户端发送支持的协议版本(如TLS 1.2)、加密套件(如
服务器Hello:
- 服务端选择客户端支持的最高协议版本和加密套件。
- 返回服务端随机数
ServerRandom
和证书(含公钥)。
证书验证:
客户端验证证书合法性:
- 证书颁发机构(CA)是否可信。
- 主机名是否匹配证书中的域名。
- 证书是否过期或吊销。
密钥交换(如ECDHE):
非对称加密:
- 客户端生成预主密钥(Pre-Master Secret),用服务端公钥加密后发送。
密钥协商:
- 双方结合
ClientRandom
、ServerRandom
和预主密钥生成对称密钥(Master Secret)。
- 双方结合
加密通信:
对称加密:
- 使用AES-256-GCM等算法加密数据,确保机密性和完整性。
- MAC(消息认证码):防止数据篡改(如HMAC-SHA384)。
数据传输:
- 应用层数据(如HTTP请求)通过TLS记录层封装后发送。
安全特性:
- 前向安全性:即使长期密钥泄露,攻击者无法解密之前的通信(因预主密钥每会话生成)。
- 证书吊销检查:通过OCSP stapling减少延迟。
欢迎关注 ❤
我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。
没准能让你能刷到自己意向公司的最新面试题呢。
感兴趣的朋友们可以加我微信:wangzhongyang1993,备注:面试群。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。