面试场景题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

在刷短视频的时候碰到了这样一个场景题,一时想不出。"10W个请求,QPS1W,抢100件商品,不许超卖"


一、解答

1.面对10W个请求和1WQPS,第一步就是限流,削峰填谷。

2.第二步开始处理,面对100件商品的加减,这属于小数量的加减,可以考虑用单线程来完成,lua刚好是单线程的,所以这里用lua一个个减,注意不要写循环。

lua 复制代码
-- KEYS[1] = stockKey
-- KEYS[2] = orderSetKey
-- ARGV[1] = userId

local stock = tonumber(redis.call("GET", KEYS[1]))
if not stock or stock <= 0 then
    return -1  -- 已售罄
end

-- 判断是否已下单
if redis.call("SISMEMBER", KEYS[2], ARGV[1]) == 1 then
    return -2  -- 重复下单
end

-- 扣库存
redis.call("DECR", KEYS[1])

-- 记录用户
redis.call("SADD", KEYS[2], ARGV[1])

return 1  -- 成功

3.数据持久化

二、解答思想

我一开始考虑用什么中间件,后来想来想去还是传统的redis+mysql,因为redis是基于内存的,够快。后来想到为了保证同一时间只有一个线程操控数据应该加锁,可能就是加分布式锁,这里忘记了分布式锁就是redis或者zookeeper。想法比较简单。

分布式锁要经过3次rpc:加锁、操作、解锁并且是阻塞运行的;而lua是原子性操作只有一次rpc并且是非阻塞,虽然是单线程,但是没有等待时间。

什么时候用分布式锁,什么时候用lua:

分布式锁保证单实例,lua保证原子性;防止重复提交,多台机器布置定时任务,保证不重复前提交,用分布式锁;多个服务同时读写同一条数据,用分布式锁;代码逻辑复杂,包括多个步骤,用分布式锁。保证原子性操作、减少网络开销、批量处理数据用lua。


总结

相关推荐
蝎子莱莱爱打怪16 小时前
XZLL-IM干货系列 03|消息 ID 设计:一个 UUID 搞不定的事,我用两个 ID 解决了
后端·面试·开源
梯度不陡18 小时前
AI 到底能不能从零写软件?ProgramBench 和 RepoZero 给出了两种答案
前端·javascript·面试
胡萝卜术19 小时前
滑动窗口最大值:从暴力到单调队列,层层优化全解析
前端·javascript·面试
沉默王二21 小时前
面试结束后,我反问:“就面个实习至于上这么大强度吗?”面试官:“你对 RAG、Agent、MCP、Skill 理解得很到位,所以要求高一点。”
面试·agent·ai编程
假如让我当三天老蒯1 天前
Options API(选项式 API) 和 Composition API(组合式 API)
前端·vue.js·面试
假如让我当三天老蒯2 天前
前端跨域解决方案(学习用)
前端·javascript·面试
Colin草率地做慢慢地改2 天前
关于QuickStore这个项目的重构(2)- 数据库建表文件
后端·面试·架构
JieE2122 天前
LeetCode 56. 合并区间|超清晰 JS 图解思路,面试高频区间题
javascript·算法·面试
JustHappy3 天前
我汇总了身边朋友的经历才发现,其实第一份实习是最难找的......
前端·后端·面试
uhakadotcom3 天前
在python 的 工程化架构中 ,什么是 薄包装器层?
后端·面试·github