第3章
“指针,”林默脱而,“个指针每次步,另个每次两步,如果相遇,就环。”
“如果环,么到环入?”
林默正回答,突然起网到个段子,忍嘴角微微扬。
张劲松注到表:“么,个问题很好笑?”
“,”林默,“就起个段子——面试官问么到环入,应聘者答:用HashMap,如果某个节点被第次访问到,就入。”
镜男皱眉:“虽然也能解决问题,但空复杂度太,面试般么答——”
“,”林默打断,“所以么答。标准解法:指针相遇,把其个指针放回节点,然两个指针都每次步,再次相遇方就环入。”
完,还补句:“原理数推导,需现推导遍吗?”
镜男表变得些微妙,像个茬却到茬。
张劲松旁边着,嘴角笑越越显。
“,”摆摆,“基础题就到儿吧。面点真格。”
示个女始提问。
女,正着林默。得很清秀,戴着副丝边镜,起像刚从毕业没久研究,但神里却透着股锐利。
“叫苏瑶,端组负责。”顿顿,“问个实际景问题。”
林默点:“请。”
“们个商系统,双零点候,个瞬流量峰。假设们用MySQL数据库,么保证并,库超卖?”
个典型“秒杀系统”问题,林默里过类似课程设计。
但没刻回答,而反问:“您理论最优方案,还实际落方案?”
苏瑶挑眉:“两个区别吗?”
“,”林默,“理论最优方案,把库放Redis里,用Lua脚本保证原子性,然用消息队列异步处理订单。但实际落候,考虑Redis挂么办,消息队列积压么办,还考虑用户验、防刷、限流、级——套,代码量能翻倍。”
苏瑶愣,然笑。
笑,之种冰冰质消散半,起像个普通邻姐姐。
“如果让设计,么?”
林默,:“分步。”
“第,端限流,同个用户秒只能点次单按钮,防止脚本狂刷。”
“第,用Redis缓库,用Lua脚本扣减库,保证原子性。扣减成功入步,扣减失败直接返回‘卖完’。”
“第,把成功扣减库请求入消息队列,端务异步处理订单创建、支付等逻辑。如果订单创建失败,回退库。”
顿顿,补充:“当然,最基础版本。如果求更,还考虑Redis集群、数据致性、点key等问题。但得,面试限,您也记。”
苏瑶嘴角抽抽:“……嫌弃记性好?”
“,”林默认真,“怕您嫌话。”
旁边镜男终于逮着,嗤笑:“倒挺替着。过,个问题——刚才方案里,如果Redis扣减库成功,但消息队列处理失败,库么回退?”
林默着,里自己挖坑呢。
但慌忙:“个分两种况。”
“如果消息队列本没挂,只业务处理失败,以消费端捕获异常,然调用个补偿接,回退Redis里库。”
“如果消息队列挂,或者消息丢失,就需用定任务,定期对账——把Redis里成功扣减记录数据库里真实订单对比,现致,介入或者自补偿。”
镜男追