摘要: 识别热点数据通常可通过以下几种方法: 基于访问频率统计:利用日志记录或专门的监控工具,统计一段时间内每个数据项的访问次数。设定一个阈值,当某个数据项的访问次数超过该阈值时,将其视为热点数据。例如,通过分析服务器的访问日志,统计不同数据请求的频率,对于访问频率较高的数据库记录、文件或缓存对象等,标记为 阅读全文
posted @ 2025-03-31 14:23 蒟蒻00 阅读(188) 评论(0) 推荐(0)
摘要: 在高并发情况下,互斥锁的性能会受到一定影响,具体如下: 性能影响 竞争开销:当多个线程同时竞争互斥锁时,未获取到锁的线程会被阻塞,这会导致上下文切换,增加系统开销。上下文切换需要保存和恢复线程的执行状态,涉及到 CPU 寄存器的读写等操作,频繁的上下文切换会消耗大量的 CPU 时间,降低系统性能。 阅读全文
posted @ 2025-03-31 14:05 蒟蒻00 阅读(153) 评论(0) 推荐(0)
摘要: 缓存击穿问题概述 缓存击穿指的是某个热点数据的缓存过期瞬间,大量请求同时访问该数据,这些请求会直接穿透缓存,打到数据库上,从而给数据库带来巨大压力,甚至可能导致数据库崩溃。逻辑过期和互斥锁是两种解决缓存击穿问题的有效策略,下面分别介绍它们的工作原理以及如何配合工作。 逻辑过期解决缓存击穿问题的原理 阅读全文
posted @ 2025-03-31 13:57 蒟蒻00 阅读(157) 评论(0) 推荐(0)
摘要: 确定随机 TTL 的取值范围的 1、基于业务数据的更新频率 首先要分析业务数据的更新特性。如果数据更新较为频繁,那么 TTL 的取值范围应该相对较小。例如,股票价格数据,其价格可能每分钟甚至每秒都在变动,此时 TTL 可以设置在数秒到几分钟的范围,如 5 - 60 秒。这样可以保证缓存数据能及时反映 阅读全文
posted @ 2025-03-31 13:51 蒟蒻00 阅读(78) 评论(0) 推荐(0)
摘要: 缓存雪崩概述 缓存雪崩是指在同一时刻大量缓存数据同时失效,导致大量请求直接穿透缓存访问数据库,使得数据库瞬间承受巨大压力,甚至可能导致数据库崩溃,进而引发整个系统的故障。随机 TTL 和分级缓存是两种常用的防止缓存雪崩的策略,下面分别介绍它们的作用和工作原理。 随机 TTL 防止缓存雪崩的原理及作用 阅读全文
posted @ 2025-03-31 13:38 蒟蒻00 阅读(45) 评论(0) 推荐(0)
摘要: 处理方式 布隆过滤器的误判主要指的是假阳性(False Positive),即布隆过滤器判断某个元素存在于集合中,但实际上该元素并不在集合里。针对这种误判,可采用以下处理方式: 1、回源查询 当布隆过滤器判断元素存在时,为了确认元素是否真的存在,可进一步查询数据源(如数据库)。例如,在缓存系统中,布 阅读全文
posted @ 2025-03-31 13:31 蒟蒻00 阅读(503) 评论(0) 推荐(1)
摘要: 消息队列缓冲:RabbitMQ 会将接收到的判题请求封装成消息,存储在消息队列中。当瞬间有大量判题请求到来时,这些请求不会直接冲击后端的判题服务,而是先进入队列排队。这样就可以将突发的高并发请求分散到一段时间内处理,避免系统因瞬间压力过大而崩溃。 消费者限流:可以在消费者端设置限流机制,即限制消费者 阅读全文
posted @ 2025-03-31 13:07 蒟蒻00 阅读(81) 评论(0) 推荐(0)
摘要: 方式 压力测试:通过模拟大量并发请求来对系统施加压力,观察系统在不同负载条件下的运行情况。可以使用专业的压力测试工具,如 JMeter 等,设置不同的并发用户数、请求频率等参数,模拟系统在高峰时期的负载。 对比测试:分别在使用线程池和 RabbitMQ 进行解耦优化前后,进行相同条件下的压力测试,对 阅读全文
posted @ 2025-03-31 13:02 蒟蒻00 阅读(77) 评论(0) 推荐(0)
摘要: 选择线程池和 RabbitMQ 来对判题服务进行解耦,主要是因为它们能有效提升系统性能、增强可维护性与扩展性,具体如下: 选择原因 线程池:判题服务可能会面临大量的并发请求,线程池可以提前创建一定数量的线程来处理这些请求,避免了每次请求都创建和销毁线程的开销,提高了系统的响应速度和资源利用率。同时, 阅读全文
posted @ 2025-03-31 12:53 蒟蒻00 阅读(53) 评论(0) 推荐(0)
摘要: 高性能:Redis 是基于内存的数据库,内存读写速度极快,能在高并发场景下快速处理大量的限流请求,满足判题接口对性能的高要求。例如,在处理大量并发的判题请求时,Redis 可以在短时间内完成令牌的获取、验证和更新等操作,确保接口的响应速度。 原子性操作:Redis 支持原子性的指令操作,通过 Lua 阅读全文
posted @ 2025-03-31 11:23 蒟蒻00 阅读(52) 评论(0) 推荐(0)
摘要: 拦截器链是一种面向切面编程(AOP)的实现方式,它允许开发者在不修改原有业务逻辑的情况下,在请求处理的过程中插入自定义的逻辑。以下是拦截器链的工作原理以及在登录验证和权限控制中的应用: 拦截器链的工作原理 拦截器定义与注册:开发者首先定义多个拦截器,每个拦截器都实现了特定的接口,通常包含preHan 阅读全文
posted @ 2025-03-31 10:25 蒟蒻00 阅读(35) 评论(0) 推荐(0)
摘要: 数据隔离与线程安全 ThreadLocalMap:它为每个线程提供独立的存储空间,确保不同线程间的数据相互隔离,避免了多线程环境下的并发访问问题,无需额外的同步操作就能保证线程安全。比如在处理多个用户的并发请求时,每个线程可以在自己的 ThreadLocalMap 中安全地存储和访问用户相关信息,不 阅读全文
posted @ 2025-03-31 10:15 蒟蒻00 阅读(62) 评论(0) 推荐(0)
摘要: 潜在问题 内存泄漏风险:ThreadLocalMap 中的 Entry 对 ThreadLocal 的引用是弱引用,当 ThreadLocal 对象在其他地方不再被强引用时,在垃圾回收时会被回收。但是,如果 Entry 中的值没有被及时清理,那么这个 Entry 就会一直存在于 ThreadLoca 阅读全文
posted @ 2025-03-31 10:13 蒟蒻00 阅读(159) 评论(0) 推荐(0)
摘要: 实现线程间数据隔离 在多线程环境下,不同线程可能同时处理多个用户的请求。如果不进行特殊处理,多个线程对共享的用户信息进行访问和修改时,容易出现数据混乱的情况。ThreadLocal 为每个线程提供了独立的存储空间,每个线程可以在自己的 ThreadLocal 中存储和获取用户相关信息,如用户 ID、 阅读全文
posted @ 2025-03-31 10:04 蒟蒻00 阅读(34) 评论(0) 推荐(0)
摘要: 基本原理 ThreadLocal 为每个使用该变量的线程提供独立的变量副本,每个线程都可以独立地修改自己的副本,而不会影响其他线程的副本。这样在多线程环境下,各个线程对 ThreadLocal 变量的操作相互隔离,避免了线程安全问题。 底层实现机制 ThreadLocalMap:ThreadLoca 阅读全文
posted @ 2025-03-31 10:01 蒟蒻00 阅读(64) 评论(0) 推荐(0)