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

wangzhongyang007 · · 89 次点击 · · 开始浏览    

> 东哥这波操作太狠了,不是因为商业决策,而是因为送外卖! 4 月 21 日,北京街头惊现一位 “神秘骑手”,定睛一看,**竟是刘强东本人**。他穿着京东外卖工服,骑着小电驴,穿梭在楼宇间送奶茶炸鸡,这画面简直不要太魔幻。网友们纷纷调侃:“东哥这是要体验生活,还是要抢外卖员的饭碗?” ![](https://files.mdnice.com/user/36414/1b26a7d0-a645-4d28-94cf-86e6b7510dec.jpg) 送完外卖后,刘强东又搞了个大动作 —— 包下海底捞请全体骑手涮火锅。在视频里,他举着酒杯对着穿美团、饿了么工服的骑手喊话:“**欢迎兄弟们跳槽来京东**!” 这波操作可谓是赚足了眼球,也让京东和美团的外卖大战彻底白热化。 ![](https://files.mdnice.com/user/36414/fb32ea32-8f8c-4979-839a-56594de71066.png) 今年 2 月,京东高调杀入外卖赛道,一上来就甩出三张王牌:0 佣金挖墙脚、百亿补贴砸用户、骑手 “五险一金” 拉人头。这每一招都直戳美团的痛点,尤其是骑手的福利问题,更是引发了广泛关注。面对京东的攻势,美团也迅速做出反应,推出 “护城计划”,降低商家抽佣,豪掷 1000 亿补贴餐饮行业,还放话要建 10 万个 “闪电仓”。**双方你来我往,互不相让,这场商战堪称史无前例。​** 在这场大战中,最开心的莫过于普通群众了。**资本打架,百姓得利,各种优惠券满天飞**,奶茶、炸鸡的价格也是一降再降。网友们纷纷表示:“这样的商战请再来一打,最好打到奶茶 1 元、炸鸡白送!”​ ![](https://files.mdnice.com/user/36414/ccf89c64-3f94-43c8-ba06-52d7295b078e.jpg) 这场外卖江湖的大战,看似是京东和美团在抢订单,实则是本地生活服务的终极对决。京东想通过高频的外卖业务带动低频的电商业务,**让用户从 “一年逛两次京东” 变成 “天天点京东”**;美团则要守住外卖基本盘,防止即时零售业务被反杀。而骑手们,也在这场大战中成为了 “香饽饽”,福利越来越好。​ 看到这里,很多小伙伴可能已经迫不及待想要和东哥做兄弟了,**当然,是那种坐办公室的兄弟,哈哈。** 你别说,[我的学员](https://mp.weixin.qq.com/s/lgJSqmSTurZEZYKuZc4eKw)还真就实现了,跟着东哥混了。 ![](https://files.mdnice.com/user/36414/b0d1c128-27c4-4d84-8b20-388ca1e83ce8.jpg) ![](https://files.mdnice.com/user/36414/73d043d9-e853-4fcc-904f-d2e37336ac70.jpg) 想必你也希望加入京东这样的优秀企业,今天我就来分享一下我们**组织内部整理的京东面经详解**,希望能帮助到你。 # 京东面经分享 ### go语言的map,拉链法 Go语言的`map`底层基于哈希表实现,采用**拉链法**解决哈希冲突。其核心结构是`hmap`,包含以下关键点: 1. **`hmap`结构**: - `hmap`是`map`的底层数据结构,包含以下关键字段: - `count`:键值对数量。 - `B`:哈希桶数组的大小(`2^B`)。 - `bucket`:指向桶数组的指针。 - `oldbucket`:扩容时临时存储旧桶的指针。 - `hash0`:哈希种子,用于提高哈希分布的随机性。 - **桶数组**:每个桶(`bmap`类型)存储8个键值对。 2. **`bmap`结构**: - 每个`bmap`包含以下字段: - `keys`:存储键的数组,长度为8(`uint8`类型,实际存储的是指针或值,取决于键类型)。 - `topbits`:记录键的高位哈希值,用于快速判断键是否存在。 - `overflow`:指向溢出桶的指针(当冲突时形成链表)。 - `flags`:标记键是否被占用或删除。 3. **拉链法实现细节**: - **哈希冲突处理**:当多个键的哈希值映射到同一桶时,通过`overflow`指针链接到下一个`bmap`,形成链表。 - **扩容机制**: - 当`count > loadFactor * bucketCnt`时触发扩容(默认`loadFactor=6.5/8`)。 - 新桶大小为`2^(B+1)`,元素重新哈希到新桶。 - 扩容过程中,旧桶和新桶同时存在,通过`oldbucket`指针过渡,保证并发读写安全。 - **优化点**: - 每个桶固定存储8个键值对,减少指针开销。 - 利用CPU缓存局部性,连续存储键值对提升访问速度。 --- ### 数据库索引有哪些 数据库索引主要分为以下类型(基于知识库中的分类和扩展): 1. **B+树索引**: - **结构**: - 多级索引树,叶子节点按顺序存储键值及对应数据指针。 - 非叶子节点存储中间键和子节点指针。 - **特点**: - 支持范围查询(如`WHERE id BETWEEN 1 AND 100`)。 - 插入/删除需保持树平衡,性能略低于哈希索引。 - **适用场景**:主键索引、唯一索引、普通索引。 2. **哈希索引**: - **结构**: - 哈希表结构,键通过哈希函数映射到桶位置。 - **特点**: - 仅支持等值查询(如`WHERE id=5`)。 - 不支持范围查询,且数据无序存储。 - **适用场景**:等值查询频繁的场景(如内存数据库)。 3. **全文索引**: - **结构**: - 对文本进行分词,构建倒排索引(词→文档ID列表)。 - **特点**: - 支持模糊匹配(如`WHERE content LIKE '%keyword%'`)。 - 需预处理文本(分词、停用词过滤)。 - **适用场景**:搜索引擎、日志分析。 4. **空间索引**: - **结构**: - 使用R树或四叉树存储地理坐标数据。 - **特点**: - 支持范围查询(如`WHERE distance < 100km`)。 - 处理高维数据效率较高。 - **适用场景**:GIS系统、地图应用。 5. **组合索引**: - **结构**: - 多列组合成一个索引,按列顺序存储。 - **特点**: - 遵循**最左前缀原则**(如索引`(a,b)`可支持`WHERE a=1`,但`WHERE b=2`无效)。 - **适用场景**:多条件联合查询。 --- ### 数据库四大特性 数据库的四大特性(ACID)是事务可靠性的核心保障: 1. **原子性(Atomicity)**: - **实现方式**: - 通过**事务日志(Redo Log)**记录操作,失败时回滚(Rollback)。 - 比如,转账操作若中途失败,日志记录撤销未完成的步骤。 - **示例**: ```sql BEGIN; UPDATE account SET balance = balance - 100 WHERE id=1; -- 步骤1 UPDATE account SET balance = balance + 100 WHERE id=2; -- 步骤2 COMMIT; -- 若步骤2失败,步骤1会被回滚 ``` 2. **一致性(Consistency)**: - **约束维护**: - 通过**外键约束**、**检查约束**等确保数据符合业务规则。 - 例如,订单金额必须大于0。 - **依赖ACID**:一致性依赖其他特性(如原子性避免数据半更新)。 3. **隔离性(Isolation)**: - **隔离级别**: - **Read Uncommitted(RU)**:允许脏读,但无实际应用场景。 - **Read Committed(RC)**:每次查询使用最新快照,避免脏读但可能不可重复读。 - **Repeatable Read(RR)**:事务内快照一致,通过MVCC和间隙锁防幻读。 - **Serializable(SERIALIZABLE)**:串行化执行,通过锁全表。 - **冲突示例**: - **脏读**:事务A读取事务B未提交的数据,B回滚后A数据无效。 - **幻读**:事务A两次查询同一条件,事务B插入新数据导致结果变化。 4. **持久性(Durability)**: - **实现机制**: - **Write-Ahead Logging(WAL)**:先写日志再写数据,崩溃后通过日志恢复。 - **刷盘策略**:`COMMIT`时确保日志写入磁盘(如MySQL的`innodb_flush_log_at_trx_commit=1`)。 --- ### innodb默认隔离级别 InnoDB的默认隔离级别是**可重复读(Repeatable Read,RR)**,其设计原因和实现细节如下: 1. **设计原因**: - **主从复制兼容性**: - 在`STATEMENT`格式的Binlog中,`RR`避免因其他事务修改数据导致主从不一致。 - 例如,`SELECT`后`UPDATE`若在`READ COMMITTED`下可能产生不同结果。 - **用户习惯**:大多数用户期望事务内多次读取结果一致。 2. **实现机制**: - **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**和**锁机制**,具体流程如下: 1. **MVCC实现**: - **行版本管理**: - 每次更新生成新版本,旧版本通过回滚段(Undo Log)保留。 - 事务通过`Read View`过滤不可见版本。 - **Read View结构**: - `min_trx_id`:当前事务ID。 - `max_trx_id`:系统中未提交的事务最大ID。 - `trx_ids`:活跃事务列表。 - **可见性判断逻辑**: ```go if record.trx_id < current_trx_id { // 记录已提交,可见 } else if record.trx_id > max_trx_id { // 未提交,不可见 } else { // 检查trx_ids列表,若存在则不可见 } ``` 2. **锁机制**: - **记录锁(Record Lock)**:锁定具体索引记录。 - **间隙锁(Gap Lock)**:锁定索引区间,防止插入。 - **Next-Key Lock**:记录锁 + 间隙锁,防幻读。 - **示例**: ```sql -- 事务A执行: SELECT * FROM t WHERE id = 1 FOR UPDATE; -- 锁定id=1记录 SELECT * FROM t WHERE id BETWEEN 10 AND 20; -- 锁定区间(10,20) ``` 3. **冲突处理**: - **死锁检测**:InnoDB定期检测锁等待环,自动回滚代价小的事务。 - **锁超时**:通过`innodb_lock_wait_timeout`设置等待时间。 --- ### tcp三次握手 TCP三次握手的详细流程及作用如下: 1. **第一次握手**(SYN=1): - 客户端发送`SYN`包,携带初始序列号`ISN_Client`。 - 客户端进入`SYN_SENT`状态。 - **作用**:请求建立连接,同步客户端初始序列号。 2. **第二次握手**(SYN=1, ACK=1): - 服务端回复`SYN-ACK`包,携带: - `SYN=1`:服务端同意建立连接。 - `ACK=ISN_Client + 1`:确认客户端序列号。 - `ISN_Server`:服务端初始序列号。 - 服务端进入`SYN_RCVD`状态。 - **作用**:确认客户端请求,同步服务端初始序列号。 3. **第三次握手**(ACK=1): - 客户端发送`ACK`包,携带: - `ACK=ISN_Server + 1`:确认服务端序列号。 - 双方进入`ESTABLISHED`状态。 - **作用**:客户端确认服务端的响应,连接正式建立。 4. **关键点**: - **序列号同步**:双方确认初始序列号,确保数据有序传输。 - **防旧连接干扰**: - 若客户端重传`SYN`,服务端的`SYN-ACK`包含`ACK=ISN_Client+1`,避免旧数据包被误处理。 - 若服务端重启后收到旧`SYN`,其`ISN_Server`已变化,导致客户端无法正确响应。 --- ### ip位于哪层?icmp位于哪层?ping命令位于哪层? 1. **IP协议**: - **OSI模型**:**网络层(第三层)**。 - **功能**: - 逻辑寻址(IP地址)。 - 路由选择(通过路由表转发数据包)。 - 分片与重组(处理超过MTU的数据包)。 2. **ICMP协议**: - **OSI模型**:**网络层(第三层)**。 - **功能**: - **错误报告**:如`Destination Unreachable`(目标不可达)。 - **查询与诊断**:如`Echo Request/Reply`(支持`ping`命令)。 - **拥塞控制**:如`Source Quench`(减少发送速率)。 3. **ping命令**: - **实现机制**: - 发送ICMP `Echo Request`包,等待`Echo Reply`响应。 - 计算往返时间(RTT)和丢包率。 - **协议层**:**网络层**,直接依赖IP和ICMP。 - **示例**: ```bash ping 192.168.1.1 # 发送ICMP Echo Request到目标IP,接收Echo Reply ``` --- ### telnet是什么操作?位于哪层? 1. **Telnet定义**: - **功能**:基于**TCP协议**的远程终端协议,用于登录并操作远程主机。 - **典型用途**: - 远程执行命令(如`ls`, `cd`)。 - 配置网络设备(如路由器)。 2. **协议层**: - **OSI模型**:**应用层(第七层)**。 - **依赖层**: - **传输层**:使用TCP(端口23)建立可靠连接。 - **网络层**:IP负责寻址。 3. **工作原理**: - **连接建立**:客户端发起TCP三次握手,与服务端建立连接。 - **数据交互**: - 客户端输入命令,通过TCP发送。 - 服务端响应通过TCP返回。 - **选项协商**(可选): - 通过`IAC`(解释器命令)协商选项,如回显开关、字符集。 - **示例**: ``` Client: IAC WILL ECHO(请求开启回显) Server: IAC DO ECHO(同意请求) ``` 4. **缺点**: - **明文传输**:密码、命令可见,易被窃听。 - **替代方案**:SSH(加密传输,支持密钥认证)。 --- ### https加密过程 HTTPS的加密过程通过**TLS/SSL协议**实现,分阶段详细如下: 1. **客户端Hello**: - 客户端发送支持的协议版本(如TLS 1.2)、加密套件(如`TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384`)、随机数`ClientRandom`。 2. **服务器Hello**: - 服务端选择客户端支持的最高协议版本和加密套件。 - 返回服务端随机数`ServerRandom`和证书(含公钥)。 3. **证书验证**: - 客户端验证证书合法性: - 证书颁发机构(CA)是否可信。 - 主机名是否匹配证书中的域名。 - 证书是否过期或吊销。 4. **密钥交换**(如ECDHE): - **非对称加密**: - 客户端生成预主密钥(Pre-Master Secret),用服务端公钥加密后发送。 - **密钥协商**: - 双方结合`ClientRandom`、`ServerRandom`和预主密钥生成对称密钥(Master Secret)。 5. **加密通信**: - **对称加密**: - 使用AES-256-GCM等算法加密数据,确保机密性和完整性。 - **MAC(消息认证码)**:防止数据篡改(如HMAC-SHA384)。 - **数据传输**: - 应用层数据(如HTTP请求)通过TLS记录层封装后发送。 6. **安全特性**: - **前向安全性**:即使长期密钥泄露,攻击者无法解密之前的通信(因预主密钥每会话生成)。 - **证书吊销检查**:通过OCSP stapling减少延迟。 --- ## 欢迎关注 ❤ 我们搞了一个**免费的面试真题共享群**,互通有无,一起刷题进步。 **没准能让你能刷到自己意向公司的最新面试题呢。** 感兴趣的朋友们可以加我微信:**wangzhongyang1993**,备注:面试群。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

89 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传