大家好,我是二哥呀。
昨天有位读者跑来给我说,滴滴突然找他谈薪了,开的薪资待遇比华为还要好一些,在犹豫要不要接滴滴。
一方面,华为的长期价值高,身边很多同学都劝他去华为;但一方面,自己对互联网还是很向往的,尤其滴滴还是核心的打车业务。
星球里之前也有几个球友拿到滴滴的 offer,有的需要转到 Go 岗,有的就是 Java 后端,并且有球友反馈说,HR 给他们的说法是,滴滴现在有点 WLB。
我也从牛客上统计了一波薪资待遇给大家做个参考,整体不是特别顶,但配得上互联网大厂的水准。
给了 27k,后端岗,还有一些签字费,做业务中台账单计价 硕士 985,Go,给了 23k*15.5,白菜价,工作强度为 1095,技术不是很深 北京邮电大学,国际化部门,给了总包 40+,无打卡,5 天年假,给了签字费,大 SP 硕士211,前端岗,一开始给了 25k,后面打电话又降到了 21k,离谱 硕士双一流,后端岗,给了 26k,实习转正,a 了好久才给这么点,签字费一分没给
从滴滴最新的财报能看得出来,国内市场依然稳固,占 7 成左右;海外市场也能够维持不错的利润。
不过我个人的感受是,目前司机被平台压榨的都比较狠,很多出租车司机都不愿意用打车软件,反而是高端的网约车,抽成还比较乐观。
我有个朋友,之前一个月会跑几趟 GL8,但没有 KPI 的那种,纯粹就是图个生活乐趣。
那接下来,我们就以 Java 面试指南中收录的滴滴面经同学 3 网约车后端开发一面为例,来看看如果想去滴滴的话,应该如何去准备?
能看得出来,滴滴这个面试官非常喜欢MySQL和Redis,所以大家在准备面试的时候,其实不用完全都学,运气也是很大的一部分,有些面试官可能就不喜欢问别的。有个 60% 的量就可以投简历了。
1、《30 天速通 Java.pdf》下载 2、三分恶面渣逆袭在线版:https://javabetter.cn/sidebar/sanfene/nixi.html
滴滴面经同学 3 网约车后端开发一面
MySQL性能慢的原因
可能 SQL 使用了全表扫描,或者未正确使用索引,再或者查询语句过于复杂,如多表 JOIN 或嵌套子查询。
也可能是单表数据量过大,导致查询效率降低。
另外,可以增加一些缓存,如 Redis 来缓存热点数据,减少数据库的访问次数。
联合索引 (a, b, c),where b = 1,能走吗,where a = 1,能走吗
WHERE b = 1
无法利用联合索引,因为缺少 a 的匹配条件,MySQL 会选择全表扫描。
WHERE a = 1
能有效利用联合索引,因为 a 是联合索引的第一个字段,符合最左前缀匹配原则。
MySQL索引原理
MySQL 的默认存储引擎是 InnoDB,它采用的是 B+树索引,B+树是一种自平衡的多路查找树,和红黑树、二叉平衡树不同,B+树的每个节点可以有 m 个子节点,而红黑树和二叉平衡树都只有 2 个。
和 B 树不同,B+树的非叶子节点只存储键值,不存储数据,而叶子节点存储了所有的数据,并且构成了一个有序链表。
这样做的好处是,非叶子节点上由于没有存储数据,就可以存储更多的键值对,再加上叶子节点构成了一个有序链表,范围查询时就可以直接通过叶子节点间的指针顺序访问整个查询范围内的所有记录,而无需对树进行多次遍历。查询的效率会更高。
B+树更扁 有什么好处
内存和磁盘在进行 IO 读写的时候,有一个最小的逻辑单元,叫做页(Page),页的大小一般是 4KB。
那为了提高读写效率,从磁盘往内存中读数据的时候,一次会读取至少一页的数据,比如说读取 2KB 的数据,实际上会读取 4KB 的数据;读取 5KB 的数据,实际上会读取 8KB 的数据。我们要尽量减少读写的次数。
因为读的次数越多,效率就越低。就好比我们在工地上搬砖,一次搬 10 块砖肯定比一次搬 1 块砖的效率要高,反正我每次都搬 10 块(😁)。
对于红黑树、二叉平衡树这种细高个来说,每次搬的砖少,因为力气不够嘛,那来回跑的次数就越多。
树越高,意味着查找数据时就需要更多的磁盘 IO,因为每一层都可能需要从磁盘加载新的节点。
InnoDB默认隔离级别
可重复读是 MySQL 默认的隔离级别。
可重复读级别是怎么实现的
读已提交和可重复读通过 MVCC 机制中的 ReadView 来实现。
可重复读:只在第一次读操作时生成一个 ReadView,后续读操作都使用这个 ReadView,保证事务内读取的数据是一致的。
限流算法
采用令牌桶算法,它就像在帝都买车,摇到号才有资格,没摇到就只能等下一次(😁)。
在实际开发中,我们需要维护一个容器,按照固定的速率往容器中放令牌(token),当请求到来时,从容器中取出一个令牌,如果容器中没有令牌,则拒绝请求。
第一步,使用 Redis 初始化令牌桶:
redis-cli SET "token_bucket" "100"
第二步,使用 Lua 脚本实现令牌桶算法;假设每秒向桶中添加 10 个令牌,但不超过桶的最大容量。
-- Lua 脚本来添加令牌,并确保不超过最大容量
local bucket = KEYS[1]
local add_count = tonumber(ARGV[1])
local max_tokens = tonumber(ARGV[2])
local current = tonumber(redis.call('GET', bucket) or 0)
local new_count = math.min(current + add_count, max_tokens)
redis.call('SET', bucket, tostring(new_count))
return new_count
第三步,使用 Shell 脚本调用 Lua 脚本:
#!/bin/bash
while true; do
redis-cli EVAL "$(cat add_tokens.lua)" 1 token_bucket 10 100
sleep 1
done
第四步,当请求到达时,需要检查并消耗一个令牌。
-- Lua 脚本来消耗一个令牌
local bucket = KEYS[1]
local tokens = tonumber(redis.call('GET', bucket) or 0)
if tokens > 0 then
redis.call('DECR', bucket)
return 1 -- 成功消耗令牌
else
return 0 -- 令牌不足
end
调用 Lua 脚本:
redis-cli EVAL "$(cat consume_token.lua)" 1 token_bucket
手撕:力扣 53.最大子数组和
题解:https://paicoding.com/column/7/53
项目
技术派是一个基于 Spring Boot、MyBatis-Plus、MySQL、Redis、ElasticSearch、MongoDB、Docker、RabbitMQ 等技术栈实现的社区系统。
这个系统旨在为创作者提供一个可以发布文章和教程,并赚取佣金的社区平台,同时又兼顾一些社交属性,比如说用户可以通过阅读、点赞、收藏、评论的形式和作者互动。
与此同时,为了紧跟时代潮流,该系统还为用户提供了一套基于 OpenAI、讯飞星火等多家大模型的派聪明 AI 助手,帮助用户在工作和学习中大幅提效。
Redis持久化
Redis 支持两种主要的持久化方式:RDB 持久化和 AOF持久化。这两种方式可以单独使用,也可以同时使用。
AOF文件存储的是什么类型的数据
AOF 文件存储的是 Redis 所有的写操作命令,比如 SET、HSET、INCR 等。
ending
一个人可以走得很快,但一群人才能走得更远。二哥的编程星球已经有 6600 多名球友加入了,如果你也需要一个良好的学习环境,戳链接 🔗 加入我们吧。这是一个 编程学习指南 + Java 项目实战 + LeetCode 刷题 + 简历精修 的私密圈子,你可以阅读星球专栏、向二哥提问、帮你制定学习计划、和球友一起打卡成长。
两个置顶帖「球友必看」和「知识图谱」里已经沉淀了非常多优质的学习资源,相信能帮助你走的更快、更稳、更远。
如果觉得有帮助,不妨随手点个赞、在看、转发三连吧,如果你想第一时间收到推送,也可以给我加个星标🌟谢谢你看我的文章,我们明天见。
最后,把二哥的座右铭送给大家:没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟。共勉 💪。