跳表能否代替 B+ 树?为什么? 答案是不能,原因就是因为跳表的不同层高节点的数量是随机的,也就是说在最坏的情况下一个查询的时间复杂度会退化成O(n),而b+树的查询时间复杂度却是很稳定的O(logmn),同时跳表高度的随机化也会导致在海量数据的情况下磁盘IO的次数要比b+树多。所以应用是磁盘-based 或需要高效范围查询的话,B+ 树更合适。 为什么 Redis 的有序集合不使用 B+ 树,而选择跳表? 主要原因就是因为跳表的实现简单,代码易于理解和维护,没有了b+树随机插入一个节点的时候会出现的页分裂的问题 现有 1000 万条 URL,内存限制为 10 MB,如何对这些 URL 进行排序? 先进性分块,然后对块中url进行排序,最后我们在内存中维护一个最小堆,然后遍历一次所有的分块push所有分块的最小元素,遍历完成后再pop堆顶元素到一个新的磁盘分块中,同时从被弹出URL所在的文件块读取下一条URL,保证堆的大小一直≤分块的数量。 现有 1000 万库存,要求设计一个支持 20 万 QPS 的秒杀系统,仅考虑减库存环节,如何实现? 首先就是我们可以明确的知道数据库是支持不了这么高的QPS的,所以我们可以引入消息队列起到一个削峰的作用。同时还需要考虑消费函数的幂等性处理,我们可以给每一个商品的库存绑定一个当前版本号,然后生产者在生产扣减库存的操作的时候添加一个递增的操作版本号,这样我们在执行消费函数的时候需要比较当前版本号是不是大于数据库中的版本号,如果大于才执行扣减库存的操作。 当然还可以使用redis做一个预扣减库存的操作,库存预扣减成功后,并不会同步操作数据库生成订单。而是立即返回用户“抢购中”状态,同时将订单信息发送到消息队列
1 3

相关推荐

2025-12-16 13:15
门头沟学院 Java
1.你对图数据库有了解么?介绍一下2.你项目里为什么一定要用netty呢3.我现在有10wTPS 的秒杀接口,用Redisson实现了锁,但线上经常出现锁未释放排查发现是watchdog机制失效,你觉得这种情况该如何彻底解决4.你觉得一定要使用分布式锁解决幂等么,不加这个锁可不可以5.你觉得数据库的行锁和Redis分布式锁或者zk的锁有什么区别6.性能?你觉得行锁性能一定会比分布式锁差么7.线上观察到 GC 日志里出现了这样一条 Full GC 日志:[Full GC (Ergonomics) [PSYoungGen: 65536K->0K(76288K)] [ParOldGen: 1750000K->1750000K(1750000K)],你能不能不靠任何工具,手动推断出这个进程可能的内存配置,以及这次GC的本质问题8.如果你们在业务高峰期观察到 Eden 区被频繁触发 GC,但实际对象存活率很低,你怎么看9.我们一个Kafka topic 被 5 个消费组同时消费,每个 group 负责写不同系统。中间某个group偶发失败,但你不能重放整条消息(因为另外几个已经成功),你怎么保证这组失败消息能精准重试?还能保证幂等?10.手撕:给你一个数组,它里面的元素呢都是正整数。再给你一个目标值,要求就是你在这个数组里面找到这个子数组和要大于等于这个目标值,然后返回结果是返回子数组的最小长度。
查看10道真题和解析
点赞 评论 收藏
分享
牛客网
牛客网在线编程
牛客网题解
牛客企业服务