拼多多面试: 设计“砍一刀”算法,怎么防止被刷破产?90% 的人死在了“最后 0.01 元”

📅 发布时间:2026/7/6 3:45:22 👁️ 浏览次数:
拼多多面试: 设计“砍一刀”算法,怎么防止被刷破产?90% 的人死在了“最后 0.01 元”
上一篇我们聊了“千万级对账”那是后台的资金底裤。今天我们聊聊前台最疯狂的“病毒营销引擎”——拼多多的“砍一刀”。有个粉丝去面拼多多Temu 部门二面被问了一个非常硬核的场景题面试官“我们要上线一个送手机的‘砍一刀’活动。手机成本 2000 块。 面对海量并发和黑产刷单你怎么设计算法和架构保证用户能领到手机但公司绝不会亏本”粉丝答“用 Redis 原子减每次随机砍个金额……” 面试官打断“随机万一前 10 个人每人砍 200手机不就白送了或者黑产搞 1000 个机器号来砍我们岂不是要破产”这道题考的不是简单的减法而是“概率论控制成本”与“人性博弈”。 今天 Fox 就带你拆解这套让全中国人民“又爱又恨”的系统。一、 核心算法不是“随机”是“看人下菜碟”首先要明确“砍一刀”绝不是真随机它是一个基于“用户价值User Value”的动态定价游戏。如果手机成本 2000 元平台愿意付出的获客成本CAC是 200 元。算法的核心目标必须让你拉够价值 200 元的“人头”才能给你手机。算法策略价值系数 芝诺悖论1. 每一刀砍多少取决于“谁在砍”你以为金额是随机的错算法会根据用户画像计算权重新用户贵客权重 10.0。一刀下去砍20 元。激励你继续拉新老用户熟客权重 0.1。一刀下去砍0.2 元。因为你已经没啥拉新价值了黑产号垃圾权重 0.001。一刀下去砍0.01 元。2. 永远砍不完的“最后一刀”当进度条达到 99% 时算法进入“收敛模式”。 剩余金额不再是“钱”而是一个数学极限。 假设还差 1 元算法会把这 1 元切分成无限份0.5 0.2 0.1 ...无论你拉多少人金额永远无限逼近 0却很难等于 0。这就是数学上的“芝诺悖论”。// 伪代码基于权重的动态砍价 public BigDecimal cut(User helper) { // 1. 获取帮砍人的画像权重 (0.01 ~ 10.0) BigDecimal weight UserProfileService.getWeight(helper.getId()); // 2. 计算基准金额 (剩余金额 * 衰减系数) BigDecimal base remainAmount.multiply(DECAY_RATE); // 3. 最终金额 基准 * 权重 // 4. 兜底逻辑最小不能少于 1 分钱对应存储的 10000 微 return calculate(base, weight); }二、 架构设计高并发下的“防刷墙”算法保证了不亏架构要保证“不崩”。1. 金额存储Integer 优于 BigDecimal坑点在 Redis 里存浮点数String进行计算慢且有精度风险。解法“去小数点化”。将金额单位转为“微”1 元 1,000,000 微。 Redis 里存的是Long类型的整数Lua 脚本执行DECRBY是纳秒级的且绝对精准。2. 解决“大 V 热 Key”问题如果某个大 V 分享了链接瞬间涌入 100 万人帮砍Redis 单个 Key 会被打爆。解法“本地缓存LocalCache前置”。对于超级热单在应用服务器JVM层做一层缓存拦截 90% 的无效查询。写入时利用 MQ削峰填谷串行处理砍价请求前端只显示“砍价中...”。三、 核心风控与黑产的“图灵博弈”这是面试官最想听的部分。如果 1000 个机器人瞬间把 2000 元砍完了算法再好也没用。1. 设备指纹 行为生物学不要只看 IP。要看陀螺仪、按压面积。真人在砍价时手指按压屏幕的面积是变化的手机会有轻微物理抖动而脚本的数据是死板的。策略识别为机器人的执行“风控降权”——前端提示砍价成功后台实际扣减金额为0。2. 终极杀招强制图灵测试现在的高级云控脚本已经能模拟陀螺仪了。怎么办解法在砍价的关键节点如最后 1 元、最后 0.01 元强制弹出“滑动拼图”或“选字验证码”。 这一招能直接废掉 99% 的自动化脚本因为打码平台的响应速度赶不上用户的并发速度。四、 致命争议为什么最后变成了“金币”很多人骂拼多多“明明显示还差 0.01 元我拉了人怎么变成了送金币” 这其实是技术与法务的“保命策略”。技术真相数据库里的金额已经拆分到1 微0.000001 元了但前端只能显示 2 位小数。继续砍金额用户会发现数字“不动了”看起来像 Bug。产品黑魔术——“单位置换Unit Switch”为了让游戏继续系统会把“金额模式”切换为“道具模式”。还差 0.01 元 - 抽到“10 个金币” - 100 金币换 0.01 元。还差 1 金币 - 抽到“1 个碎片” - 10 个碎片换 1 金币。本质通过不断贬值货币单位把进度条无限拉长让你永远觉得“只差一点点”。五、 面试标准回答模板下次面试被问到“设计砍一刀”请按这个套路输出“面试官这个系统的核心不是随机算法而是‘基于 CAC获客成本的动态定价模型’。算法层利用‘用户价值权重’和‘芝诺悖论’确保金额无限收敛但不为零。存储层Redis 中使用‘Long 类型单位微’存储金额避免浮点数精度问题提升 Lua 执行效率。风控层组合使用‘生物探针’陀螺仪和‘关键节点验证码’图灵测试拦截脚本。产品策略在精度耗尽时启用‘单位置换’切金币/碎片既规避了技术尴尬又合法地延长了用户留存。”写在最后“砍一刀”的本质不是技术而是对人性的精准计算。 技术保证了“平台不亏”而心理学保证了用户“觉得能赢”。 当你理解了这一点你写的代码就不再是冷冰冰的逻辑而是商业的引擎。觉得有收获的点个赞转发给那个总让你“砍一刀”的朋友https://mp.weixin.qq.com/s/Ut_zXkmZzF9CTItXTU6i9w