秒杀项目面试总结

1.介绍项目

登录模块:两次md5,防止密码泄漏。分布式session(用到了缓存存sessionid到用户信息,过期时间一周吧,每次登录刷新过期时间),保证多个服务器服务。(参数解析器保证了不用每次都手写用sessionid查缓存用户信息)jsr303校验检查号码格式。全局异常处理器。
用户进入商品列表页,选中要秒杀的商品,点击详情进入商品详情页,点击秒杀,秒杀成功,进入订单详情页。
用户表,
商品表,秒杀商品表(外键商品,库存,秒杀活动时间),
订单表(外键用户和商品),秒杀订单表(外键用户秒杀商品id订单)。
这里注意秒杀商品id和商品id是不同的,所以秒杀订单可以根据用户和秒杀商品id唯一确认一个订单来防止重复秒杀(唯一索引和缓存查询(不需要数据库查询因为这里用的redis数据库)),同时保证用户可以在以前买过该商品的情况下可以进行秒杀。
用户表里面用缓存存uuid-》用户对象可以保存一天的登录状态。

秒杀流程:
系统初始化,商品库存数量添加到Redis中
收到请求,Redis预减库存,库存不足,直接返回,否则发送秒杀商品信息到消息队列里,请求入队,立即返回排队中。
请求出队,后面的逻辑是减商品库存,如果成功就生成订单,失败就设置秒杀结束。(也就是商品被秒杀完然后redis设置该商品秒杀结束,因为是分布式的)
客户端轮询是否秒杀成功(200ms查询一次,这里肯定不能直接查询数据库,需要查询订单缓存,订单在生成到数据库时设置缓存在项目里面是永不过期,并且可以根据这个缓存来保证单个用户秒杀时一定幂等性(相当于一个set查重),主要还是要唯一索引)

页面缓存 + URL缓存 + 对象缓存
前两个缓存一样的,设置60秒,相当于不常更新的商品页面可以60秒更新一次。
对象缓存放了秒杀订单,作用是查询订单来查看是否秒杀成功时更快。

在下订单的模块,在对应的表上建立唯一索引,在Miaosha_order上,user_id和Goods_id上建立联合唯一索引防止重复秒杀保证幂等。
(防超卖就是数据库总体数量不能到负数。)

2.重难点,面试必问(遇到困难怎么解决,网上搜)
必然是秒杀接口的高并发实现,以及一些安全优化。
3.写简历,技术要点
Redis预减库存减少数据库访问(redis都是单线程原子操作可以保证不会有超过库存数的请求进来)
内存标记减少Redis访问
请求先入队缓冲,异步下单,增强用户体验。
防止超卖数据库扣减库存时加条件判断库存大于0。

一、安全优化
1.1 思路(都是用缓存实现)
秒杀接口地址隐藏(先请求path接口生成随机串作为path,用缓存存用户和商品到path的映射,然后前端访问秒杀接口验证时查缓存,因为这个接口的唯一标识就是用户和商品,60秒过期)(其实这里重点是查到随机串存在就行了,因为随机串是不会重复的所以可以是path-》null这样,又或者path-》用户和商品)
数学公式验证码(生成验证码图片的接口在随机生成验证码时加一个用户和商品到验证码结果的缓存,点击秒杀时一块传进去然后用缓存验证,300秒过期)
接口限流防刷的注解,固定窗口限流算法的实现(用缓存存接口uri和用户id到被访问的次数,过期时间假设5秒,那么这五秒多出的访问次数会被限制掉,这样保证了单个用户请求次数不会过多,需要加拦截器)

面试官问题:
redis设置过期时间吗,这里订单对象缓存是不设置过期时间的,过期时间设置为0表示不过期。并且这里不用分布式事务,因为慕课网没教。

你可能感兴趣的:(链表,leetcode,数据结构)