高频八股总结1
线程池的原理,核心线程与非核心线程的区别?线程池是一种多线程处理形式,其核心思想是预先创建一定数量的线程,这些线程存放在一个“池”里,当有任务提交时,就从池中选取一个空闲线程来执行任务。执行完毕后,线程并不会销毁,而是回到池中等待下一次的任务。线程池的好处在于减少在创建和销毁线程上所花的时间和资源消耗,提高了程序响应速度和并发量。
线程池的原理
任务提交:当有任务提交到线程池时,线程池会首先检查核心线程是否都在执行任务。如果核心线程有空闲,则直接使用核心线程执行任务;如果核心线程都在忙,则将任务放入任务队列中等待。
任务队列:如果任务队列未满,任务会被放入队列中等待执行;如果任务队列已满,线程池会检查当前线程数是否小于最大线程数。如果小于,则创建非核心线程执行任务;如果已达到最大线程数,则根据拒绝策略处理任务。
线程复用:线程执行完任务后,会继续从任务队列中获取新的任务执行,而不是销毁。这样可以避免频繁创建和销毁线程的开销。
线程回收:非核心线程在空闲超过一定时间(keepAliveTime)后会被回收,而核心线程默认会一直存活,除非设置了allowCoreThreadTimeOut为 ...
项目分布式Session知识点拷打
技术点拆解:分布式Session(Redis + Hash)以下是对该技术点的详细拆解,帮助你应对面试中的深度追问:
1. 核心实现原理技术要点:• 传统Session的问题: • 单机Session:集群环境下用户请求可能路由到不同服务节点,导致登录态丢失。 • Session复制:同步开销大(如Tomcat Session Replication),性能差。• Redis分布式Session方案: • 用户登录后生成唯一Token(如JWT),Token作为Key,用户信息作为Value存入Redis。 • 每次请求通过Token从Redis获取用户信息,实现无状态会话。• Hash结构优化: • String存储:SET session:token1 '{"userId":1,"name":"Alice"}' → 内存占用高,修改需全量更新。 • Hash存储:HSET session:token1 userId 1 name Alice → 支持字段级读写,内存更省(z ...
项目Spring Task知识点拷打
技术点拆解:Spring Task定时任务(订单超时取消)
1. 核心实现原理技术要点:• Spring Task基础: • 基于@Scheduled注解实现定时任务,支持cron表达式、固定速率(fixedRate)、固定延迟(fixedDelay)等配置。 • 示例代码: @Component public class OrderTimeoutTask { @Scheduled(cron = "0 0/5 * * * ?") // 每5分钟执行一次 public void cancelTimeoutOrders() { // 查询超时未支付订单并取消 } } ``` • **项目应用场景**: • **订单超时取消**:用户下单后若未在15分钟内支付,自动取消订单并释放库存。 • **数据统计**:每日凌晨统计前一日订单数据生成报表。 ---#### **2. 高频面试问题与回答示 ...
项目websocket知识点拷打
技术点拆解:WebSocket实时通信(来单提醒/催单)以下是对该技术点的详细拆解,帮助你应对面试中的深度追问:
1. 核心实现原理技术要点:• WebSocket协议:基于TCP的全双工通信协议,服务端可主动推送消息,避免HTTP轮询的资源浪费。• 握手过程:客户端通过HTTP Upgrade请求建立连接(Connection: Upgrade,Upgrade: websocket)。• 项目应用场景: • 来单提醒:商家端实时接收新订单通知。 • 客户催单:用户发起催单后,商家端立即收到提醒。
2. 高频面试问题与回答示例Q1:为什么选择WebSocket而不是HTTP轮询?回答示例:
“HTTP轮询需要客户端频繁发起请求,无效查询多(如90%的请求无新订单),浪费带宽和服务器资源。WebSocket只需一次HTTP握手即可建立长连接,后续双向通信无额外开销,延迟更低(从轮询的秒级降至毫秒级),适合实时性要求高的场景。”
扩展追问:• WebSocket与Server-Sent Events(SSE)的区别:
“SSE仅支持服务端到客户端的单 ...
项目Redis缓存优化知识点拷打
技术点拆解:Redis缓存优化(菜品缓存 + 内存优化)以下是对该技术点的详细拆解,帮助你应对面试中的深度追问:
1. 核心实现原理技术要点:• 缓存目的:减少高并发下对数据库的频繁查询(如菜品信息读多写少)。• 缓存策略: • 缓存穿透:查询不存在的数据 → 缓存空值(NULL)+ 短过期时间。 • 缓存雪崩:大量缓存同时过期 → 随机过期时间(基础时间 + 随机偏移)。 • 缓存击穿:热点Key过期后突发请求 → 互斥锁(Redis分布式锁)重建缓存。• 数据结构优化: • Hash vs String: ◦ String存储:SET user:1 '{"name":"Alice","age":25}' → 内存占用高,修改需反序列化整个对象。 ◦ Hash存储:HSET user:1 name Alice age 25 → 支持单字段读写,内存更省(ziplist编码优化)。
2. 高频面试问题与回答示例Q1:如何保证缓存与数据库的一致性?回答示例:
...
项目Redis+Lua知识点拷打
技术点拆解:分布式锁(Redis + Lua)以下是对该技术点的详细拆解,帮助你应对面试中的深度追问:
1. 核心实现原理技术要点:• 分布式锁目的:在分布式系统中保证同一时刻只有一个客户端能执行关键操作(如扣减库存)。• Redis实现方案: • Lua脚本保证原子性:将SETNX(设置锁)、EXPIRE(设置过期时间)合并为一个原子操作。 • 锁标识唯一性:使用UUID作为锁的Value,防止误删其他客户端的锁。 • 过期时间:根据业务预估最大执行时间设置(如10秒),避免死锁。
代码示例:
-- Lua脚本:获取锁(原子操作)local key = KEYS[1]local value = ARGV[1]local expire = ARGV[2]local result = redis.call('SET', key, value, 'NX', 'PX', expire)return result
2. 高频面试问题与回答示例Q1:为什么用Lua脚本?直接用SETNX+EXPIRE不行吗?回答示例: ...
项目JWT知识点拷打
技术点拆解:登录与身份验证(JWT + ThreadLocal)
1. 核心实现原理技术要点:• JWT结构: • Header(算法类型,如HS256)、Payload(用户信息+过期时间)、Signature(签名=HMACSHA256(base64UrlEncode(header) + “.” + base64UrlEncode(payload), secret))。 • 示例:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c• ThreadLocal作用: • 在拦截器中解析Token,将用户信息存入ThreadLocal,后续业务层直接通过ThreadLocal.get()获取用户上下文,避免频繁传参。
2. 高频面试问题与回答示例Q1:为什么选择JWT而不是传统的Session-Cookie方案 ...
项目详细拷打
一、项目概述回答模板:
“我负责的是基于Spring Boot的校园点餐系统,分为客户端(微信小程序)和商家端(Web管理后台)。核心功能包括在线点餐、订单管理、高并发库存控制、实时通知等。我重点解决了分布式锁防超卖、JWT无状态认证、Redis缓存优化、WebSocket实时通信等技术难点。”
二、技术点拆解与追问预测1. 登录与身份验证(JWT + ThreadLocal)引导问题:• 为什么选择JWT而不是Session?• 如何保证Token的安全性?• ThreadLocal可能有什么风险?
技术要点:• JWT结构:Header(算法)、Payload(用户数据)、Signature(签名防篡改)。• 无状态优势:适合分布式系统,减少服务端存储压力。• 安全问题: • Token泄露风险 → 结合HTTPS、设置较短过期时间。 • 主动失效困难 → 用Redis维护黑名单(如用户注销时记录未过期的Token)。• ThreadLocal内存泄漏: • 原因:Tomcat线程池复用线程,未remove()导致用户信息残留。 • 解决:拦截器销毁前调用T ...
简历知识点
一、技术基础1. Java核心 • 集合:HashMap底层结构(数组+链表/红黑树)、ConcurrentHashMap分段锁机制、ArrayList vs LinkedList • 并发:synchronized锁升级过程、ReentrantLock的AQS实现、线程池参数(核心/最大线程数、队列类型) • JVM:内存分区(堆、栈、方法区)、GC算法(CMS/G1区别)、OOM排查工具(jstat、MAT)
2. 数据库 • 事务:ACID特性、脏读/不可重复读/幻读场景、MVCC实现原理 • 索引:B+树结构、最左前缀原则、覆盖索引优化、索引失效场景(如LIKE “%xx”) • 锁:行锁 vs 表锁、死锁检测(SHOW ENGINE INNODB STATUS)
3. Spring框架 • IOC:Bean生命周期、依赖注入方式(构造器 vs @Autowired) • AOP:动态代理(JDK/CGLIB)、切面执行顺序(@Order)、事务传播机制
4. Redis • 缓存 ...
苍穹外卖技术要点1
1. 登录及身份验证(JWT + ThreadLocal + 拦截器)实现步骤:
引入依赖:在pom.xml中引入JWT和Spring Security相关依赖:
<dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>
生成JWT Token:在用户登录成功后,生成JWT Token并返回给客户端:
public String generateToken(User user ...










