快手-暑期实习-海外用户增长
首先是简单的自我介绍+项目介绍
然后挑着项目里头问了怎么做的鉴权。
和他讲了使用aop切面编程的这么一个流程。
然后问了这个鉴权主要是使用的什么手段呢?
答:本地使用cookie存token,每次访问token,对比缓存里头的token做登录状态的判断。再根据其中的token匹配到的用户id,进而查询数据库里头的角色,及其对应的menu,使用aop的环绕方法,将两份menu做比对。
那你们用的什么做缓存呢?
redis
redis是吧,可以介绍下redis主要有什么数据类型,以及你们平时使用什么多一点吗?
string、list、map、set、sorted set
我们平时用string和map多一点。因为我们主要用查询多一点点
那你能介绍下,redis里头的缓存雪崩、缓存击穿这类问题吗?
我先跟他讲清楚,我们遇到的这几类问题比较少。然后说我了解到可以blabla
缓存雪崩,就是有一批缓存同时到期,大量请求到达数据库,造成短期内并发压力巨大
缓存击穿,就是使用缓存里头绝对不可能存在的请求,去恶意攻击你的数据库。比如直到你的订单id从大于0的数开始增长。那我使用负数id查询。必定能击穿你的缓存,直达数据库,稍微这些请求多了,就容易使得你的数据库崩溃。
解决方法:
雪崩:
- 预防,给每个key在设定过期时间上, 再额外添加random时间,保证不同时过期。
- 事件中,使用fail-fast的熔断策略,快速抛出异常,减少数据库瞬间压力。
- 使用主从模式和集群模式来尽量保证缓存服务的高可用
- 事后,持久化AOF、RDB保证缓存数据可用。
击穿:
这个复盘的时候发现自己答错了。我回答的是缓存穿透,这里的击穿,其实是某个热点数据失效,导致大量请求击穿缓存层,到达了数据库,
和雪崩的区别只在于,击穿相当于打穿了一个小洞,但是同样有雪崩的效果。
解决方法:
- 互斥锁更新,保证同一个进程针对同一个数据不会并发请求到DB,减小数据库压力
- 随即退避,失效时,线程随机sleep一个很短的时间,过一会儿再来访问。
缓存穿透:
接口层增加权限校验,比如用户鉴权没有的话返回403,id必须大于0等。
其实这里面试官想问我布隆过滤器,我猜的。但是我不太记得了,所以没答,面试官也没有追问我。
布隆过滤器主要是对bitmap的一个进阶实现,就是把元素通过散列函数映射到一个位数组的k个点。
之后检索的时候,只要其中任何一个是0,就一定没有,都是1,则说明很可能存在。优点是快,并且相比较bitmap减少了冲突的概率。
缺点是,删除困难,并且存在一定的误识别率
好的那你对MySQL也挺了解的是吧,我们来问问几个MySQL的问题
可以讲讲联合索引吗?
blabla多个列的索引,最左匹配,底层是b+树
如果以abc列建立索引,查询的时候bc等值,索引会失效吗?
最左匹配原则,第二列等值查询,
索引底层结构讲一下
聚簇索引和非聚簇索引区别?
感觉前边联合索引没答好,问:排序的稳定性和非稳定性讲讲?
然后排序完毕以后,要是是先按第一列,再按的第二列,查找的时候找第二列为某个值的元素?
==这里其实就还是在问联合索引那条语句。回头好好看看==
那我们来聊聊多线程吧。讲一讲为什么要有锁这个东西呢?以及你了解到的Java里头有哪些锁的实现呢?
讲了volatile、synchronized、底层、cas
那你说说,其中的synchronized怎么实现的吧
好,你说说有哪些容器用到了synchronized?
回答hashtable
和hashmap区别?
hashmap扩容流程?
那我们来问问http吧。你说说http和https什么区别?
那你说说你了解的https加密协议?
那你来说说一个请求从浏览器,到返回结果中间经历了什么?
那你来说说,刚才其中的域名、ip地址、数据帧各自是哪一层的东西?
说说数据链路层和网络层区别?
好,我们来做几个题吧
第一题是实现一个懒汉式单例模式,我偷懒只写了不安全的,被要求写了线程安全的,我加了synchronized,不满意又让我写了DCL
第二题是反转链表 II 力扣92题
感谢之前看的hxd的面经
链接在此
给了我很大的帮助。
做完以后,大概就没啥问题了,然后是准备约2面了。希望能有个好结果!冲冲冲
#快手暑期##实习##面经##Java#