一、手撕总结
1.最长上升子序列变体------环形情况
解题思路:复制一份原始数据在数组后面,不能用原来的dp直接解决,而是使用tail记录最长的序列,tail是vector,使用lower_bound
2.人口最多的年份
考察的是差分数组,然后遍历每年的人口,判断最大值
二、八股
1.Redis集群是否可能出现数据丢失,丢失后如何解决?
回答思路,数据丢失可能有两方面,一方面是主从延迟另一方面是在本没有做好持久化;丢失解决方案第一种是等待从节点确认,第二种是使用AOF和RDB持久化,然后刷盘。
2.Redis的常用命令有哪些?
从使用场景记忆,get set key valuedelete、ttl
3.如果任务队列不加锁,应该如何处理?
减少锁竞争的角度是可以增队列,另一种解决思路是原子比较和交互,用一个版本标识判断
4.Redis常见的数据类型和数据结构?
数据类型有String、list、set、zset、hash底层数据结构有SDS、跳表、红黑树、listpack、quicklist
5.红黑树的构建规则以及时间复杂度是多少?
时间复杂度是log n,构建规则主要是从颜色上去考虑,五点,根是黑色、黑红两种颜色、红的子节点不能是红色、nullptr叶子是黑色、每条路径黑色数量相同
三、场景题
1.小项目怎么升级成超大高并发项目?
回答问题的思路是压测和容量测试,(先测试),然后是单机优化比如IO多路复用、线程池,横向扩展,多机器去优化,还有就是数据库层面、redis层面优化,做限流熔断和降级,最后是再测试和验证。
2.如何设计一个kv缓存数据结构,支TTL超时、高并发,高内存空间利用率
使用map,value里包括存储的内容和过期时间,清理可以用小顶堆或者使用惰性删除和定期处理,
这里如果是lfu的,可以使用两个哈希去设计其中一个是记录key到节点指针,一个是记录频率到链表
3.如何对一个海量的流水表做分库分表?
从业务角度去做拆分,拆分成多个多个表,根据哈路由确到分片,要能够保证数据在一起,要在数据过多扩容和迁移