快手一面
说一个做的比较复杂的一个项目
java用哪个版本,线上垃圾回收器用的啥,堆多大
CMS有哪些步骤,哪些步骤会stw,G1怎么实现的?G1回收垃圾最大的是怎么做到的,预测模型是咋样的?
redis zset底层的数据结构是什么
Dict+SkipList,查找member时,从Dict查找,找到socre,然后根据score查找元素时,从SkipList查找,得到zrank/zRangeByScore
支持重复score/第一层支持双向链接/支持根据member查找scoreskipList是怎么实现的,层次如何,具体如何添加一个节点,添加多少个层次?
抛硬币,随机化的数据结构。因为链表找某个节点是O(n),查找时可以进行HashMap,O(1),或者通过类似跳跃表冗余多层节点达到O(logn),链表插入一个节点是O(1)
跳表相对于红黑树,占用的空间会比较少,实现更简单,zrange整体性能比红黑树高。https://blog.csdn.net/fengyuyeguirenenen/article/details/124192522JUC有了解么,AQS怎么实现,有哪些数据结构,可重入怎么做的
同步队列 + 多个条件队列,有个记录当前占有锁的线程的字段,如果占有锁的线程是当前线程,则允许再次持有锁,并state++
https://blog.51cto.com/u_14977428/2545025
volatile的原理,怎么实现的?内存屏障怎么做的。
分布式锁怎么实现的?
zk和redis
redission怎么实现的,锁超时了怎么办,lua脚本有什么问题
不同的key,可能会在不同节点上,lua脚本里的key必须保证在同一个节点上。不同节点上会报错,可以用hash tag解决:如果某个业务都通过key{mykey}去储存获取内容,所有的操作都会hash到同一个slot,这个slot所在的节点压力就会变大(不均衡),如果解决?
watchdog,会产生一个定时任务,定期续租。注意不是线程。
https://www.cnblogs.com/qdhxhz/p/11046905.html
1、lua脚本正确性问题,如果lua脚本中的指令存在错误,那么指令指令的过程中发生异常lua脚本会终止执行,所以这种情况lua不能保证指令整体的原子性。
https://blog.csdn.net/qq_32907195/article/details/107971222
https://blog.csdn.net/qq_32907195/article/details/107971222
本地限流用哪个库,guava RateLimiter,limiter底层怎么实现的?
熔断怎么实现的?hystrix底层是什么原理?
分布式限流怎么实现的,分布式限流有什么问题,不会被打挂么?
redis计数器
redis用的是2.0还是3.0,哨兵怎么实现的,redis 主节点挂了,获取锁时会有什么问题?
redis多个主节点的话,get(key)时,怎么知道是哪个节点的?
连哪个就是哪个,根据key做哈希找到对应的节点,找数据时还是用该哈希,从服务端查询,key的映射关系。
在redis3.0中,使用的是crc16(key)/16384,得到slot查找,转发到任意一台服务器,如果该服务器负责该slot,直接处理,如果不是,根据本地路由表重定向到对应节点。
redis-cluster非中心化,无中心化节点,读和写进行转发。codis?mycat?
- redis过期策略?redis LRU怎么实现的?redis是每次执行命令都会检查下其他过期的key吗?
http://www.redis.cn/articles/20161114002.html
https://zhuanlan.zhihu.com/p/365205479
超时使用的数据结构是单独一个字典,维护有超时的key和超时时间戳。定期删除(注意不是定时删除),惰性删除。
https://juejin.cn/post/6844903965927145479
- LRU是内存满时的逐出策略,不是过期策略。
也是随机的,Redis 通过对少量的 key 采样,并淘汰采样的数据中最久没被访问过的 key,避免维护一个LRU链表(大量的空间消耗)和大量节点访问带来频繁的链表节点移动操作(降低性能):https://mp.weixin.qq.com/s/MKJHFxgKqBNyQAJBCzszhw
- zk锁和redis锁有什么区别,为什么用redis锁,原因是?
从性能和可用性方面考虑:https://blog.csdn.net/m0_45406092/article/details/118185561
锁 | 模型 | 高性能 | 可用性 | 一致性 | 问题 |
---|---|---|---|---|---|
zk | CP | 性能一般,不适合大规模写入(过半数确认才能提交),事务操作都在leader节点,保证消息有序处理,其实是有单点问题的,不支持跨机房部署。 | 选主过程会不可用 | 数据是基于ZAB广播的,一致性很强,可靠性强 | |
redis | AP | 基于内存,性能高 | 高 | redis可能出现脑裂,有多个master,主从切换时,因为主从同步是异步的,存在重复拿到锁等问题。主备切换丢失更新 |
- ZooKeeper虽然提供了数据读写更删的操作接口,但它的设计目的不是替代数据库,而是提供一个高可用的协同服务。所以,不能指望ZooKeeper能像数据库那样有很高的吞吐并发。
redis分布式锁有什么问题,怎么解决?
多次拿到锁,如何解决?服务发现用的什么,zk和consul有什么区别,服务发现怎么做负载均衡的?
https://developer.aliyun.com/article/599997
zk事件风暴,zab,强CP,选主期间不可用
consul gossip,主要用于节点间传递节点故障、新节点加入、主从关系变化、槽信息变更等信息
- 流行病算法,能够最终一致的,怎么做到最终一致的,不可能广播所有吧
借助16379这个端口号进行ping/pong通信。
gossip不是一次性广播所有,避免占用无效带宽。默认是1s发送10次,每隔100ms随机选择5个节点,选一个最久没有通信的节点发送ping消息
对哪些长时间没有“被” 随机到的节点进行特殊照顾:每个周期(100ms)内扫描一次本地节点列表,如果发现节点最近一次接受 Pong 消息的时间大于 cluster_node_timeout/2 ,则立刻发送 Ping 消息,防止该节点信息太长时间未更新。
ping消息的内容:携带的其它节点的消息数量至少为3,最大等于集群节点总数-2,其他节点为随机选择+偏好性选择
所以如果redis cluster集群模式,节点数量越多,则通信带宽将需要大大增加,成本也很高。
见:https://www.tuicool.com/articles/Qf2EJrY,https://blog.didispace.com/consul-service-discovery-exp/
Server的节点数量不是越多越好,3个或者5个是推荐的数量,数量越多数据同步的处理越慢(强一致性),取决于最慢返回的那个请求。
半数确认,意思是只收到超过半数的ack即可,实际还是全部同步了的,但是只是有超过半数是确认是成功的。
抽屉理论,保证读取超过半数一定是能拿到一个最新值的。
节点数配置成奇数的集群的容忍度更高,例如配置成5,允许挂掉2台,但是配置成4,则只允许挂掉一台。
consul数据同步使用的是raft协议实现的。consul支持多数据中心。
https://zhuanlan.zhihu.com/p/369178156
https://mdnice.com/writing/92c28485071b4f0fada83416cf8bf1fa
https://cloud.tencent.com/developer/article/1555702
https://blog.csdn.net/m0_47495420/article/details/112418887
https://cloud.tencent.com/developer/article/1024494
https://www.jianshu.com/p/8e0d6cf99d54
consul用到gossip/raft,这两个协议分别是怎么用的?
zab崩溃恢复是什么意思?
自动选主,选择复制数据最多,数据最新的从节点作为主节点?
消息队列有用过哪些,kafka有什么优势。
kafka rebalance时,怎么重新分配消费者,具体怎么实现的?
每个group会选择一个group coordinator(broker),所有的客户端心跳均是向coordinator发送,rebalance时,coordinator的心跳响应会下发需要rebalance,然后客户端会上报join_group(包含订阅的topic),coordinator收到后,响应谁为consumer group leader,并让leader分配算法,之后将分配的结果下发给每个consumer。
https://blog.csdn.net/sinat_27143551/article/details/103033628
- 有用过threadlocal么,在哪些场景用的,为什么会有内存泄漏。value并不是弱引用,防止被回收掉。
- 给定一个1g的文件,只有1m的内存可用,如何找出出现次数最多的前10个单词。
根据单词先哈希成多个小文件,之后一个文件一个文件处理:先统计完该文件每个单词的出现次数,然后遍历一遍维护一个大小为10的小根堆。关键就是把相同单词放到同一个文件里,方便计数并立马出堆,不用维护大量元素。
- 写一个double check单例
- 给定两个整数链表,相加,输出结果链表
a: 1->3->4 b: 5->6->7->8
输出:5 -> 8 -> 1 -> 2
#大厂面试##交通银行总行软开#