网站icp备案 去哪,做网站一班需要多少钱,分销是怎么做的,工作室名字第一个问题#xff1a;介绍一下最近做的项目
第二个问题#xff1a;我对你项目有个地方比较感兴趣啊。就是你用的那个二级缓存#xff0c;你的吞吐量有多大啊#xff0c;为什么需要使用二级缓存#xff1f;
答#xff1a; 在二级缓存策略下#xff0c;笔记详情接口的吞…第一个问题介绍一下最近做的项目
第二个问题我对你项目有个地方比较感兴趣啊。就是你用的那个二级缓存你的吞吐量有多大啊为什么需要使用二级缓存
答 在二级缓存策略下笔记详情接口的吞吐量为 9282/s , 平均响应时间为 10ms, 相比较直接走数据库查询肯定是快的非常多。
第三个问题缓存和数据库的一致性是如何保证的呢
第四个问题Redis是集中缓存Caffeine是本地缓存通常来说MQ的消息是机器中的一个实例去消费的那其他实例的缓存如何解决
第五个问题我们在生产环境上它一个服务可能部署多台机器。消费不会每台机器都消费同一个消息吧所以你的代码应该考虑这种场景。
第六个问题什么叫缓存穿透
当用户访问的数据既不在缓存中,也不在数据库中导致请求在访问缓存时发现缓存缺失再去访问数据库时发现数据库也没有要访问的数据没办法构建缓存数据来服务后续的请求。当有大量这样的请求到来时数据库的压力骤增这就是缓存穿透问题。
第七个问题讲解一下布隆过滤器的原理
布隆过滤器由[初始值都为0的位图数组]和[N个哈希函数]两部分组成。当我们写入数据库时在布隆过滤器里做个标记这样在下次查询数据是否存在数据库时只需要查询布隆过滤器如果查询到数据没有被标记说明不在数据库中。 布隆过滤器会通过3个操作完成标记
第一步使用N个哈希函数分别对数据进行哈希计算得到N个哈希值第二步将第一步得到的 N 个哈希值队位图数组的长度取模得到每个哈希值在位图数组的对应位置、第三步将每个哈希值在位图数组的对应位置设置为1。
第八个问题讲一下令牌桶和漏桶的区别吧。
令牌桶与漏桶算法对比
8.1. 令牌桶Token Bucket
工作原理令牌以固定速率生成并存储在桶中请求需要消耗令牌来进行处理。令牌可以积攒允许一定的突发流量。特性 允许突发流量请求可以等待令牌控制流量的平均速率 适用场景API 限流、网络流量控制、带宽管理等。
8.2. 漏桶Leaky Bucket
工作原理请求进入桶后以固定速率处理如果桶满了新的请求会被丢弃。没有突发流量输出速率恒定。特性 不允许突发流量固定速率输出超过容量的请求会丢失 适用场景防止流量洪峰、稳定带宽控制、视频流输出等。
8.3. 令牌桶与漏桶的区别
特性令牌桶Token Bucket漏桶Leaky Bucket流量控制允许突发流量流量灵活不允许突发流量流量平稳请求处理请求可以等待令牌请求超出容量会被丢弃输出速率可变速率平滑流量恒定速率输出典型应用API 限流、带宽控制防止流量洪峰、视频流稳定输出
总结
令牌桶适合平滑控制并允许突发流量的场景。漏桶适合对输出速率有严格要求并不允许突发流量的场景。
第九个问题 Ratelimiter令牌桶实现流量削峰防止打垮数据库那么这个令牌桶是本地限流吗还是全局限流
本项目采用的是本地API进行的局部限流没有存到Redis进行全局限流。全局限流是不管加多少机器要求整个服务一秒。
第十个问题能说一下Java中线程池中有哪些参数以及其中的作用。
第十一个问题如果使用无界队列作为线程池中的阻塞队列会有什么情况。
如果在线程池中使用 无界队列如 LinkedBlockingQueue作为阻塞队列可能会导致以下几个问题
线程池的核心线程无法及时释放
无界队列没有大小限制意味着可以无限制地接受任务。当任务被提交到线程池时任务会被放入队列中即使所有线程池中的工作线程都忙碌队列也会继续接收新的任务。这样线程池的核心线程数可能会一直存在而不会有线程因任务完成而被释放。 结果线程池的核心线程数不会因为任务排队而减少可能会导致线程池中的线程始终处于活动状态浪费系统资源。
内存占用过大
如果无界队列不断积压任务且没有适当的控制机制如监控队列长度或主动抛弃任务等可能会导致内存被任务堆积消耗甚至导致 内存溢出。虽然无界队列不会像有界队列那样会阻塞新任务的提交但无止境的任务积压会占用大量内存。 结果内存消耗增大可能导致 OutOfMemoryError 或系统性能下降。
无法控制队列的积压
使用无界队列时线程池的负载可能无法被有效控制。线程池会尽最大能力执行任务但是队列会无限制增长从而影响系统的稳定性。没有队列大小的限制无法保证任务的积压程度导致任务可能会一直等待而得不到及时执行。 结果可能出现某些任务长时间没有执行系统响应时间不可预测甚至导致任务丢失如果不处理好队列。
可能导致线程池过载
在一些极端情况下如果系统不断提交任务而没有足够的工作线程来执行这些任务尽管线程池会尝试分配空闲线程执行任务但由于无界队列的存在任务会无限制地积压这就会导致线程池的负载过重可能导致 资源耗尽如 CPU 和内存等。 结果系统的性能会严重下降甚至可能崩溃。
任务的延迟执行
无界队列可能导致任务的执行延迟因为任务会被推入队列中等待执行而队列的大小没有限制可能会导致任务在队列中等待很长时间。虽然不会立即丢失任务但任务的执行时间变得不可预测系统的响应性降低。 6. 没有流量控制
有界队列能够有效地控制队列中的任务量防止提交过多任务给线程池。而无界队列则没有这个控制能力线程池可能会因为接收过多任务而导致过载这样无法动态地应对高负载的情况。
解决方法
使用有界队列可以为队列设置大小限制防止任务积压过多。常用的有界队列如 ArrayBlockingQueue。 使用自定义拒绝策略当队列满时可以通过 RejectedExecutionHandler 设置拒绝策略抛弃任务、抛出异常、或者直接将任务提交到外部队列等。 动态调整线程池大小可以通过合理的核心线程数和最大线程数来控制线程池的并发能力避免过度并发。
总的来说使用无界队列时需要谨慎合理配置线程池和队列确保系统的稳定性和性能。如果没有适当的流量控制和任务限制机制可能导致系统过载、内存消耗过大或者任务积压问题。