当前位置: 首页 > article >正文

面试官最爱问的10个苍穹外卖技术点:从布隆过滤器到MySQL主从复制

面试官最爱问的10个苍穹外卖技术点从布隆过滤器到MySQL主从复制1. 布隆过滤器在缓存穿透防护中的实战应用缓存穿透是分布式系统常见的高频攻击手段。当恶意请求查询不存在的数据时传统缓存机制会直接穿透到数据库层。我们在苍穹外卖系统中采用布隆过滤器作为第一道防线其核心原理是通过多个哈希函数将元素映射到位数组中。实现方案对比方案类型误判率内存占用实现复杂度适用场景原生BitSet0.1%约10MB/百万数据高对精度要求极高的场景Redis Bitmap0.3%约12MB/百万数据中需要分布式共享的场景Guava BloomFilter0.01%约8MB/百万数据低单机高性能场景在项目中我们最终选择基于Redis的实现方案关键代码如下// 布隆过滤器初始化 public void initFilter(ListString validKeys) { for (String key : validKeys) { long[] offsets hash(key); for (long offset : offsets) { redisTemplate.opsForValue().setBit(BLOOM_KEY, offset, true); } } } // 元素存在性校验 public boolean mightContain(String key) { long[] offsets hash(key); for (long offset : offsets) { if (!redisTemplate.opsForValue().getBit(BLOOM_KEY, offset)) { return false; } } return true; }注意布隆过滤器存在假阳性可能需要配合数据库空值缓存策略使用。我们设置当布隆过滤器返回可能存在时会进行二级缓存检查最后才查询数据库。2. MySQL主从复制与Sharding-JDBC的深度整合苍穹外卖的订单系统采用一主三从的MySQL架构通过binlog实现数据同步。我们在实践中发现主从延迟是影响一致性的关键因素特别是促销期间订单量激增时。主从复制配置要点在my.cnf中配置主服务器[mysqld] server-id1 log-binmysql-bin binlog-formatROW sync_binlog1从服务器配置[mysqld] server-id2 relay-logmysql-relay-bin read_only1使用Sharding-JDBC实现读写分离spring: shardingsphere: datasource: names: master,slave0,slave1 masterslave: load-balance-algorithm-type: round_robin name: ms-group master-data-source-name: master slave-data-source-names: slave0,slave1 props: sql.show: true延迟优化方案采用半同步复制替代异步复制在从库配置中增加slave_parallel_workers8对时效性要求高的查询强制走主库3. Redis高可用架构设计与实战面对日均百万级的订单量我们设计了Redis哨兵集群方案集群拓扑------------ | Sentinel 1 | ------------ | ------------ ------------ ------------ | Master |---| Slave 1 |---| Slave 2 | ------------ ------------ ------------关键配置参数# sentinel.conf sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 5000 sentinel failover-timeout mymaster 60000 sentinel parallel-syncs mymaster 1 # redis.conf maxmemory 8gb maxmemory-policy volatile-lru notify-keyspace-events Ex缓存一致性解决方案采用双删策略public void updateProduct(Product product) { // 先删缓存 redis.del(product.getId()); // 更新数据库 db.update(product); // 异步再删缓存 executor.execute(() - { Thread.sleep(500); redis.del(product.getId()); }); }对于菜品分类等变更频率低的数据设置合理的过期时间4. 分布式锁在订单系统中的正确实现在秒杀场景下我们对比了多种分布式锁方案方案优点缺点适用场景Redis SETNX实现简单、性能高存在锁过期问题短时任务RedLock可靠性高实现复杂、性能较低金融级场景Zookeeper可靠性极高性能差配置管理数据库乐观锁无需额外组件并发能力差低频操作最终采用Redisson实现的分布式锁RLock lock redisson.getLock(orderLock); try { // 尝试加锁最多等待100秒上锁后30秒自动解锁 if (lock.tryLock(100, 30, TimeUnit.SECONDS)) { // 处理业务逻辑 createOrder(); } } finally { lock.unlock(); }重要提示必须设置合理的锁超时时间并确保业务执行时间小于锁自动释放时间避免死锁和业务中断。5. 精确到毫秒的订单超时处理方案针对外卖订单30分钟未支付自动取消的需求我们实现了多级超时控制前端倒计时浏览器端实时显示剩余时间Redis过期键设置30分钟过期事件redisTemplate.opsForValue().set(orderId, unpaid, 30, TimeUnit.MINUTES);延迟队列使用RabbitMQ插件实现精确延时// 发送延迟消息 MessageProperties props new MessageProperties(); props.setDelay(30 * 60 * 1000); // 30分钟 rabbitTemplate.send(order.delay.exchange, order.delay.routingkey, new Message(json.getBytes(), props)); // 消费端处理 RabbitListener(queues order.cancel.queue) public void handleTimeout(Order order) { orderService.cancelUnpaidOrder(order.getId()); }实际测试表明该方案时间误差控制在±100ms内完全满足业务需求。6. 高性能ID生成器的设计与优化针对订单ID生成的特殊需求我们放弃了传统的数据库自增ID采用雪花算法改进方案public class OrderIdGenerator { private final long twepoch 1609459200000L; // 2021-01-01 00:00:00 private final long workerIdBits 5L; private final long maxWorkerId ~(-1L workerIdBits); private final long sequenceBits 12L; private long workerId; private long sequence 0L; private long lastTimestamp -1L; public synchronized long nextId() { long timestamp timeGen(); if (timestamp lastTimestamp) { throw new RuntimeException(时钟回拨异常); } if (lastTimestamp timestamp) { sequence (sequence 1) ((1 sequenceBits) - 1); if (sequence 0) { timestamp tilNextMillis(lastTimestamp); } } else { sequence 0L; } lastTimestamp timestamp; return ((timestamp - twepoch) (workerIdBits sequenceBits)) | (workerId sequenceBits) | sequence; } }该方案在单机环境下可达每秒26万ID生成量完全满足高峰期的订单创建需求。7. 实时配送路径优化算法实践结合骑手位置和餐厅信息我们实现了基于Geohash的智能调度将城市划分为多个Geohash网格使用Redis GEO存储骑手位置GEOADD riders 116.404 39.915 rider_1订单分配时查询3公里内骑手ListGeoRadiusResponse riders redisTemplate.opsForGeo() .radius(riders, new Circle(new Point(116.404, 39.915), new Distance(3, Metrics.KILOMETERS)));实际应用中该方案将平均配送时间缩短了18%骑手接单距离减少23%。8. 支付对账系统的最终一致性实现支付系统采用TCC模式保证事务一致性Transactional public void handlePayment(Payment payment) { // Try阶段 paymentService.freezeBalance(payment.getUserId(), payment.getAmount()); orderService.lockOrder(payment.getOrderId()); // Confirm阶段异步 paymentConfirmQueue.send(payment); } // 消费端 RabbitListener(queues payment.confirm.queue) public void confirmPayment(Payment payment) { try { paymentService.confirmPayment(payment); orderService.confirmOrder(payment.getOrderId()); } catch (Exception e) { // 进入补偿流程 paymentCompensationQueue.send(payment); } }每日对账任务会检查所有支付状态的订单发现异常自动触发补偿机制。9. 智能推荐系统的工程实践基于用户行为的菜品推荐实现用户行为数据收集// 记录用户浏览 Aspect public class BehaviorAspect { AfterReturning(execution(* com..ProductController.detail(..))) public void recordView(JoinPoint jp) { Long userId getCurrentUserId(); Long productId (Long) jp.getArgs()[0]; redisTemplate.opsForZSet().incrementScore( user:view:userId, productId, 1); } }相似度计算基于余弦相似度def similarity(user1, user2): products set(user1.keys()) set(user2.keys()) dot sum(user1[p] * user2[p] for p in products) norm1 sqrt(sum(v**2 for v in user1.values())) norm2 sqrt(sum(v**2 for v in user2.values())) return dot / (norm1 * norm2)实时推荐public ListProduct recommend(Long userId) { // 获取相似用户 SetString similarUsers redisTemplate.keys(user:view:*); // 计算推荐分数 MapLong, Double scores new HashMap(); for (String key : similarUsers) { Long otherId parseUserId(key); if (!otherId.equals(userId)) { Double sim computeSimilarity(userId, otherId); for (Product p : getViewedProducts(otherId)) { scores.merge(p.getId(), sim * p.getScore(), Double::sum); } } } return sortByScore(scores); }10. 全链路监控与性能优化我们建立了从客户端到服务端的全链路监控体系前端监控使用Sentry捕获JS异常Sentry.init({ dsn: https://xxxsentry.io/123, release: 1.0.0 });服务端APM基于SkyWalking实现# agent.config agent.service_nameorder-service collector.backend_serviceskywalking-oap:11800关键指标监控订单创建成功率支付响应时间P99缓存命中率数据库QPS通过Grafana配置的监控看板可以实时掌握系统健康状态-- 慢查询监控 SELECT * FROM mysql.slow_log WHERE start_time NOW() - INTERVAL 1 HOUR ORDER BY query_time DESC LIMIT 10;在多次大促活动中这套监控系统帮助我们及时发现并解决了23个潜在性能瓶颈保障了系统的稳定运行。

相关文章:

面试官最爱问的10个苍穹外卖技术点:从布隆过滤器到MySQL主从复制

面试官最爱问的10个苍穹外卖技术点:从布隆过滤器到MySQL主从复制 1. 布隆过滤器在缓存穿透防护中的实战应用 缓存穿透是分布式系统常见的高频攻击手段。当恶意请求查询不存在的数据时,传统缓存机制会直接穿透到数据库层。我们在苍穹外卖系统中采用布隆过…...

SystemVerilog调度“潜规则”:从一段让你怀疑人生的代码说起(附避坑指南)

SystemVerilog调度“潜规则”:从一段让你怀疑人生的代码说起(附避坑指南) 第一次看到下面这段代码时,我盯着仿真波形图足足愣了五分钟: module counter;logic [3:0] count 0;initial begin$display("A: count %…...

Windy API避坑指南:为什么你的气象图层总是加载失败?

Windy API避坑指南:为什么你的气象图层总是加载失败? 在开发气象可视化项目时,Windy API因其丰富的气象数据和直观的图层展示功能而备受青睐。然而,许多开发者在集成过程中常遇到图层加载失败、数据不显示等问题。本文将深入分析这…...

OpenClaw+nanobot自动化办公:QQ机器人配置与会议纪要生成

OpenClawnanobot自动化办公:QQ机器人配置与会议纪要生成 1. 为什么选择OpenClawnanobot组合 去年夏天,我接手了一个需要频繁记录会议内容的工作。每次会议后手动整理纪要耗费大量时间,直到发现OpenClaw这个开源自动化框架。但真正让我眼前一…...

用Python脚本批量处理Paraview数据:自动化可视化全流程指南

用Python脚本批量处理Paraview数据:自动化可视化全流程指南 在工程仿真和科学计算领域,数据可视化是理解复杂现象的关键环节。Paraview作为一款开源的跨平台数据分析和可视化工具,凭借其强大的并行处理能力和丰富的渲染功能,已成为…...

RMBG-2.0模型解释性研究:可视化分析分割决策过程

RMBG-2.0模型解释性研究:可视化分析分割决策过程 1. 引言 当我们使用RMBG-2.0进行图像背景去除时,经常会惊叹于它精准的分割效果——无论是复杂的发丝边缘还是半透明物体,都能处理得相当出色。但你是否好奇过,这个模型究竟是如何…...

二自由度机械臂的自适应控制与滑模控制对比研究

二自由度机械臂RBF自适应控制/传统滑模控制在机器人控制领域,二自由度机械臂是一个经典的控制对象。本文将对比两种控制方法:径向基函数(RBF)自适应控制和传统滑模控制。通过理论分析和仿真实验,探讨这两种方法在机械臂…...

Windows系统下非Docker方式快速搭建Ollama与Open WebUI大模型运行环境

1. 环境准备:Windows系统的基础配置 在Windows系统上搭建大模型运行环境,首先需要确保你的电脑满足基本硬件要求。根据我的实测经验,至少需要16GB内存才能流畅运行Llama3这类8B参数的模型。如果打算尝试更大的模型(如70B版本&…...

5种ComfyUI工作流迁移技术:从单节点到企业级部署的全流程指南

5种ComfyUI工作流迁移技术:从单节点到企业级部署的全流程指南 【免费下载链接】ComfyUI 最强大且模块化的具有图形/节点界面的稳定扩散GUI。 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI 问题定位:工作流迁移的核心挑战与案例分析…...

Leather Dress Collection 算法优化指南:Token高效管理与上下文长度扩展

Leather Dress Collection 算法优化指南:Token高效管理与上下文长度扩展 你是不是遇到过这样的情况:想用大模型处理一篇长文档,或者进行多轮深度对话,结果没聊几句,模型就“失忆”了,或者直接提示“上下文…...

Apollo Save Tool:一站式革新PS4存档管理的智能解决方案

Apollo Save Tool:一站式革新PS4存档管理的智能解决方案 【免费下载链接】apollo-ps4 Apollo Save Tool (PS4) 项目地址: https://gitcode.com/gh_mirrors/ap/apollo-ps4 你是否曾因PS4游戏存档丢失而懊恼?或渴望尝试其他玩家的游戏进度却无法实现…...

零代码构建企业级后台管理系统:Pear Admin Flask实战指南

零代码构建企业级后台管理系统:Pear Admin Flask实战指南 【免费下载链接】pear-admin-flask Pear admin is a front-end development framework based on layui 项目地址: https://gitcode.com/gh_mirrors/pe/pear-admin-flask 在现代企业级应用开发中&…...

AI绘画神器FLUX.1-dev部署教程:开箱即用,无需复杂配置

AI绘画神器FLUX.1-dev部署教程:开箱即用,无需复杂配置 1. 为什么选择FLUX.1-dev? 在当今AI绘画领域,FLUX.1-dev以其独特的生成质量和效率脱颖而出。这个由Black Forest Labs开发的开源模型采用了新一代生成架构,能够…...

ThingsPark嵌入式MQTT客户端逆向解析与移植指南

项目标题“thingspark example”在当前主流嵌入式开源生态中并无对应知名库或官方仓库。经全面检索 GitHub、GitLab、SourceForge 及 STM32Cube、ESP-IDF、Zephyr、Arduino Library Manager 等权威平台,未发现名为thingspark的标准化嵌入式中间件、IoT 接入框架或 H…...

信息工程专业毕业设计入门指南:从选题到系统实现的完整技术路径

作为一名刚刚完成毕业设计的信息工程专业学生,我深知从零开始一个项目的迷茫与挑战。选题天马行空、技术栈眼花缭乱、代码写着写着就成了一团乱麻……这些都是我亲身踩过的坑。今天,我想把自己摸索出来的这条“从选题到实现”的完整路径梳理出来&#xf…...

nanobot部署教程:基于Jupyter+WebShell的OpenClaw本地开发环境搭建步骤

nanobot部署教程:基于JupyterWebShell的OpenClaw本地开发环境搭建步骤 1. 开篇:认识你的超轻量级AI助手 如果你正在寻找一个能快速部署、功能强大且代码极其精简的个人AI助手,那么nanobot绝对值得你花十分钟了解一下。它不像那些动辄几十万…...

硬件工程师实战笔记:用这3种方法搞定PCB上的阻抗匹配(附常见误区)

硬件工程师实战笔记:PCB阻抗匹配的3种核心方法与高频设计避坑指南 在高速数字电路和射频系统设计中,信号完整性从来不是选择题而是必答题。去年参与某毫米波雷达项目时,团队曾因一段15mm长的微带线阻抗偏差导致整机灵敏度下降3dB,…...

3大核心功能深度解析:BilibiliDown如何成为B站视频下载的专业解决方案

3大核心功能深度解析:BilibiliDown如何成为B站视频下载的专业解决方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.c…...

Python入门:2.注释与变量的全面解析

【Python入门系列】第2讲:注释与变量的全面解析(2026最新版) 这一讲我们来彻底搞懂Python中最基础却又非常重要的两个内容:注释 和 变量。 掌握好它们,你才能写出清晰、可读、可维护的代码,尤其是在团队协…...

Onekey:Steam Depot清单自动化获取工具的技术赋能指南

Onekey:Steam Depot清单自动化获取工具的技术赋能指南 【免费下载链接】Onekey Onekey Steam Depot Manifest Downloader 项目地址: https://gitcode.com/gh_mirrors/one/Onekey 价值定位:重新定义Steam清单获取效率 本节概述Onekey如何通过自动…...

有声书制作新选择:IndexTTS 2.0实测,一人演绎多种角色情绪

有声书制作新选择:IndexTTS 2.0实测,一人演绎多种角色情绪 1. 为什么有声书创作者需要IndexTTS 2.0 有声书制作一直面临三大痛点:角色音色单一、情绪表达生硬、后期制作耗时。传统解决方案要么依赖专业配音演员(成本高&#xff…...

Bypass Paywalls Clean:如何优雅地获取付费内容?

Bypass Paywalls Clean:如何优雅地获取付费内容? 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字信息时代,优质内容往往被付费墙隔离&#x…...

零基础玩转LongCat-Image-Edit:一句话让图片里的猫变狗,效果惊艳

零基础玩转LongCat-Image-Edit:一句话让图片里的猫变狗,效果惊艳 1. 什么是LongCat-Image-Edit? LongCat-Image-Edit是美团LongCat团队开源的一款文本驱动图像编辑模型。它最大的特点就是能用一句话指令修改图片内容,而且只改动…...

Mac开发环境配置:OpenClaw与Qwen3.5-4B-Claude联调实录

Mac开发环境配置:OpenClaw与Qwen3.5-4B-Claude联调实录 1. 环境准备:从零开始的Mac配置 当我第一次尝试在Mac上部署OpenClaw时,本以为会像其他开源项目一样简单。但实际走完整个流程才发现,从Xcode工具链到Node版本管理&#xf…...

RTKLIB 2.4.2 保姆级安装与配置避坑指南:从下载到RTKNAVI实时定位

RTKLIB 2.4.2 从零到精通的实战指南:避坑技巧与高阶配置 第一次打开RTKLIB压缩包时,面对密密麻麻的文件夹和数十个可执行文件,大多数新手都会陷入迷茫——该从哪里开始?为什么同样的配置别人能跑通而自己总是报错?本文…...

OpenClaw本地部署避坑指南:完美对接ollama的GLM-4.7-Flash

OpenClaw本地部署避坑指南:完美对接ollama的GLM-4.7-Flash 1. 为什么选择OpenClawGLM-4.7-Flash组合 去年我在尝试构建个人AI助手时,测试过多个开源框架与模型的组合。最终发现OpenClaw与ollama部署的GLM-4.7-Flash这对搭档,在响应速度和本…...

解密Unity圆角矩形Shader:为什么你的长方形圆角总是不完美?

Unity圆角矩形Shader深度优化:从原理到完美实现的实战指南 在游戏UI和2D场景设计中,圆角矩形几乎无处不在——从按钮到对话框,从血条到卡片式布局。但许多开发者都会遇到一个看似简单却令人头疼的问题:为什么我的长方形圆角总是变…...

告别数据焦虑:用多模态小样本学习,5个真实案例教你搞定冷启动项目

告别数据焦虑:用多模态小样本学习,5个真实案例教你搞定冷启动项目 当你的新项目只有几十张标注图片、几百条文本记录时,传统深度学习模型往往会陷入"数据饥渴"的困境。但现实中的创新机会往往出现在数据稀缺的领域——比如医疗机构…...

7款重塑音频体验的开源工具:用open-source-mac-os-apps构建全场景处理体系

7款重塑音频体验的开源工具:用open-source-mac-os-apps构建全场景处理体系 【免费下载链接】open-source-mac-os-apps serhii-londar/open-source-mac-os-apps: 是一个收集了众多开源 macOS 应用程序的仓库,这些应用程序涉及到各种领域,例如编…...

GTE语义搜索在嵌入式设备上的优化部署方案

GTE语义搜索在嵌入式设备上的优化部署方案 1. 引言:嵌入式设备上的语义搜索挑战 想象一下,你正在开发一款智能家居设备,用户可以通过自然语言查询来控制家电。比如用户说"把客厅弄亮点",设备需要理解这是调高灯光亮度…...