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