一些面试场景题

5 阅读3分钟

1.怎么防止重复提交?

1.前端拦截

按钮点击后立即禁用按钮,或加遮罩,防止用户多点。

2.Token令牌

进入页面时后端生成唯一Token,前端提交时带上;

后端校验Token,用过就删除,重复提交直接拒绝。

3.后端接口加锁

用Redis+唯一标识(用户ID+接口地址+参数)做分布式锁;

请求进来先加锁,执行完释放,重复请求直接返回“请勿重复提交”

4.数据库唯一约束

关键业务字段加唯一索引,从数据库层面避免重复数据。

总结

前端仅禁按钮+后端Token/Redis锁+数据库唯一索引,三重保证不重复提交。

2.接口怎么做限流?

1.前端限流

按钮点击后禁用,防止频繁点击

2.后端常用限流方法

  • 计数器限流:固定时间内只允许多少次请求。
  • 滑动窗口限流:比计数器更精准,解决临界问题。
  • 漏桶算法:请求先进桶,匀速处理,溢出丢失。
  • 令牌桶算法:按速率放令牌,有令牌才能处理,支持突发流量

3.实际落地

  • 单机:用AtomicInteger、Guava RateLimiter。
  • 分布式:用Redis+Lua实现限流。
  • 网关层:在Gateway、Nginx层直接限流。

总结

单机用Guave,分布式用Redis,网关统一控制,令牌桶最常用。

3.缓存穿透、击穿、雪崩简单说

1.缓存穿透

  • 查不存在的数据,缓存没有,直接查数据库
  • 大量请求→数据库压力大
  • 解决:缓存空值、布隆过滤器

2.缓存击穿

  • 某热点Key过期,大量请求同时查DB
  • 解决:互斥锁、热点Key永不过期

3.缓存雪崩

  • 大量Key同一时间过期或Redis宕机
  • 全部请求打数据库,直接崩掉
  • 解决:过期时间随机、集群、多级缓存

总结

穿透=查不存在;击穿=热点Key挂;雪崩=大片Key挂。

4.为什么要用 Redis?

Redistribution之所以称为互联网架构的“标配”,核心在于它机制的性能和丰富的数据结构

1.极快的速度(核心优势)

  • 基于内存:数据存在内存里,读写速度极快,QPS(每秒查询率)可达十几万甚至几十万。
  • 单线程模型:避免了线程切换的开销,处理效率极高。

2.丰富的数据结构

它不只是个简单的Map,支持多种数据类型,对应不同场景游刃有余。

  • String:缓存用户信息、文章内容。
  • Hash:缓存结构化对象(如商品信息)。
  • List:消息队列、最新列表、排行榜。
  • Set:共同好友、点赞、去重。
  • ZSet(有序集合):排行榜、延迟队列。

3.原子性操作

  • 所有操作都是原子性的(单线程保证),天然支持分布式锁、计数器(如秒杀、库存)等场景,无需担心并发问题。

4.持久化与高可用

  • 持久化:支持RDB和AOF两种策略,可将内容数据保存到磁盘,防止重启丢失。
  • 高可用:支持主从复制、哨兵模式和集群,保证服务稳定不宕机。

5.功能强大

  • 支持发布/订阅模式,可做消息通知。
  • 支持Geo地理位置,实现附近的人、LBS服务。
  • 支持BitMap,海量数据统计(如用户签到、日活统计)。

总结

Redis是基于内存的、高性能的、支持多种数据结构的键值数据库,是缓存、分布式锁、排行榜等场景的首选。