Redis持久化:RDB与AOF的权衡

一、引子:Redis宕机后数据去哪了? Redis是内存数据库,数据存储在内存中。那么问题来了:Redis宕机后,数据还在吗? 1.1 场景:双11大促数据丢失事故 场景:电商网站,双11大促 00:00:00 - 大促开始,流量暴增 00:00:01 - Redis缓存:10万个商品详情、50万个用户Session 00:05:00 - 服务器断电(机房故障) 00:05:01 - Redis进程被杀,内存数据全部丢失 00:10:00 - 服务器恢复,Redis重启 00:10:01 - Redis启动成功,但数据为空! 问题: 1. 所有商品详情缓存丢失 → 10万次数据库查询 2. 所有用户Session丢失 → 50万用户被强制登出 3. 缓存预热需要10分钟 → 数据库压力巨大 4. 用户体验极差 → 大量用户流失 损失: - 用户流失:50万用户 × 10% = 5万用户 - 订单损失:5万用户 × 20% = 1万单 - GMV损失:1万单 × 200元 = 200万元 核心问题:Redis是内存数据库,断电后数据丢失,需要持久化。 1.2 持久化的本质 持久化:将内存中的数据保存到磁盘,重启后可以恢复。 为什么需要持久化? 原因1:数据安全 - Redis宕机、服务器断电、进程被杀 - 内存数据丢失 - 持久化后可以恢复 原因2:快速恢复 - 没有持久化:需要从数据库重新加载(10分钟+) - 有持久化:直接加载持久化文件(1分钟) 原因3:数据备份 - 定期备份持久化文件 - 灾难恢复(机房火灾、磁盘损坏) Redis的两种持久化方式: ...

2025-11-03 · maneng

Redis高可用架构:主从复制、哨兵、集群

一、引子:单机Redis的三大困境 假设你正在运行一个电商网站,使用单机Redis作为缓存。随着业务增长,你会遇到三个核心问题: 1.1 问题1:单点故障(可用性) 场景:双11大促,凌晨0点 00:00:00 - Redis单机宕机(内存不足OOM) 00:00:01 - 所有请求打到数据库 00:00:02 - 数据库连接池耗尽(1000个请求/秒) 00:00:03 - 数据库CPU 100% 00:00:05 - 网站503错误,用户无法下单 00:00:10 - 运维手动重启Redis 00:00:15 - Redis启动成功,但缓存为空 00:00:20 - 缓存预热中(需要10分钟) 00:10:00 - 系统恢复正常 损失: - 10分钟宕机时间 - 订单损失:10分钟 × 1000单/分钟 = 1万单 - GMV损失:1万单 × 200元/单 = 200万元 核心问题:单点故障导致系统不可用,无容灾能力。 可用性计算: 假设:Redis每月宕机1次,每次10分钟 可用性 = (30天 × 24小时 × 60分钟 - 10分钟) / (30天 × 24小时 × 60分钟) = (43200 - 10) / 43200 = 99.977% 看起来还不错?但实际上: - 1年12次宕机,累计120分钟 = 2小时 - 如果恰好在大促期间宕机,损失巨大 - 高可用系统要求:99.99%(年宕机时间 < 52分钟) 1.2 问题2:容量瓶颈(可扩展性) 场景:业务增长,数据量暴增 第1个月: - 商品数量:10万 - 缓存数据量:2GB - 单机Redis:4GB内存(够用) 第6个月: - 商品数量:100万 - 缓存数据量:20GB - 单机Redis:4GB内存(不够用!) 解决方案1:垂直扩展(加内存) - 4GB → 16GB(成本翻倍,但有上限) - 最大:512GB(成本极高,且有物理上限) 解决方案2:水平扩展(加机器) - 需要Redis集群(数据分片) 核心问题:单机内存有限,垂直扩展有上限,需要水平扩展。 ...

2025-11-03 · maneng

Redis实战:分布式锁、消息队列、缓存设计

一、分布式锁:从SETNX到Redlock 1.1 为什么需要分布式锁? 场景:秒杀系统的超卖问题 // ❌ 错误:单机锁无法解决分布式超卖 @Service public class SeckillService { @Autowired private ProductRepository productRepository; /** * 秒杀下单(单机锁) */ public synchronized Order seckill(Long productId, Long userId) { // 1. 检查库存 Integer stock = productRepository.getStock(productId); if (stock <= 0) { throw new SoldOutException("商品已售罄"); } // 2. 扣减库存 productRepository.decrementStock(productId); // 3. 创建订单 return orderService.createOrder(productId, userId); } } // 问题: // 假设有3台服务器(Server A、B、C) // T1: Server A:检查库存=1(通过) // T2: Server B:检查库存=1(通过) // T3: Server A:扣减库存=0,创建订单1 // T4: Server B:扣减库存=-1(超卖!),创建订单2 // synchronized只能锁住单机JVM内的线程 // 无法锁住分布式环境的多个进程 核心问题:分布式环境下,单机锁无效,需要分布式锁。 ...

2025-11-03 · maneng

MySQL第一性原理:为什么我们需要数据库?

引言 “如果你不能简单地解释一件事,说明你还没有真正理解它。” —— 理查德·费曼 作为一名后端开发者,你一定写过这样的代码: @Autowired private UserRepository userRepository; public User findUser(Long id) { return userRepository.findById(id); } 这行代码背后,数据库帮你做了什么? 持久化存储:数据写入磁盘,重启不丢失 快速检索:1亿条数据中找到目标行,只需10微秒 并发控制:1万个并发请求,数据不会错乱 事务保证:转账操作要么全成功,要么全失败 故障恢复:系统崩溃后,数据可以完整恢复 但你有没有想过: 为什么不用文件存储数据?(txt、csv、json) 为什么不用内存存储数据?(HashMap、Redis) 为什么一定要用MySQL这样的关系型数据库? 今天,我们从第一性原理出发,通过对比文件、内存、MySQL三种存储方案,深度剖析数据库解决的核心问题。 本文不会教你怎么写SQL,而是回答为什么需要数据库。 一、引子:用户注册功能的三种实现 让我们从一个最简单的需求开始:用户注册功能。 需求: 用户注册时,存储用户名和密码 检查用户名是否已存在 用户登录时,验证用户名和密码 按注册时间范围查询用户 性能要求: 支持100万用户 注册和登录响应时间 < 100ms 支持1000并发 我们将用三种方式实现,看看它们的差异。 1.1 场景A:文件存储(users.txt) 实现思路:将用户数据存储在文本文件中,每行一个用户,逗号分隔字段。 /** * 用户服务 - 文件存储实现 */ public class FileUserService { private static final String FILE_PATH = "users.txt"; /** * 注册用户(追加到文件末尾) */ public void register(String username, String password) { // 1. 检查用户名是否已存在 if (exists(username)) { throw new RuntimeException("用户名已存在"); } // 2. 追加到文件 try (FileWriter fw = new FileWriter(FILE_PATH, true)) { String line = username + "," + hashPassword(password) + "," + System.currentTimeMillis() + "\n"; fw.write(line); } catch (IOException e) { throw new RuntimeException("注册失败", e); } } /** * 检查用户名是否存在(全文件扫描) */ public boolean exists(String username) { try (BufferedReader br = new BufferedReader(new FileReader(FILE_PATH))) { String line; while ((line = br.readLine()) != null) { // O(n) 全表扫描 String[] parts = line.split(","); if (parts[0].equals(username)) { return true; } } } catch (IOException e) { e.printStackTrace(); } return false; } /** * 登录验证(全文件扫描) */ public boolean login(String username, String password) { String hashedPassword = hashPassword(password); try (BufferedReader br = new BufferedReader(new FileReader(FILE_PATH))) { String line; while ((line = br.readLine()) != null) { // O(n) 全表扫描 String[] parts = line.split(","); if (parts[0].equals(username) && parts[1].equals(hashedPassword)) { return true; } } } catch (IOException e) { e.printStackTrace(); } return false; } /** * 按注册时间范围查询(全文件扫描+过滤) */ public List<User> findByRegisteredDateRange(long startTime, long endTime) { List<User> result = new ArrayList<>(); try (BufferedReader br = new BufferedReader(new FileReader(FILE_PATH))) { String line; while ((line = br.readLine()) != null) { // O(n) 全表扫描 String[] parts = line.split(","); long registeredTime = Long.parseLong(parts[2]); if (registeredTime >= startTime && registeredTime <= endTime) { result.add(new User(parts[0], parts[1], registeredTime)); } } } catch (IOException e) { e.printStackTrace(); } return result; } private String hashPassword(String password) { // 简化版,实际应该用BCrypt return Integer.toString(password.hashCode()); } } 文件内容示例: ...

2025-11-03 · maneng

风险与边界:跨境电商的终局思考

系列文章:本文是《跨境电商第一性原理》系列的第6篇(完结篇),建议按顺序阅读: 跨境电商第一性原理:为什么跨境比国内复杂100倍? 最小可行模型:一笔跨境交易的完整推演 从个体到平台:规模化如何重构跨境电商 跨境金融系统:支付即合规的深层逻辑 供应链智能化:从成本管理到价值创造 风险与边界:跨境电商的终局思考(本文·完结篇) 一、引子:一次税改引发的行业震荡 1.1 2016年4月8日:跨境电商的"黑色星期五" 2016年4月8日,中国跨境电商行业迎来了历史性的转折点。 当天凌晨零点,三项新政同时生效: 新政1:税收新政 ├─ 取消免税额(原50元以下免税) ├─ 调整税率结构 └─ 部分商品税负增加30-50% 新政2:正面清单 ├─ 限定可进口商品范围 ├─ 首批清单仅1142项 └─ 部分热销品类被剔除(如生鲜) 新政3:通关单要求 ├─ 所有商品需提供通关单 ├─ 通关单办理周期:2-3个月 └─ 大量商品无法及时取得 时间:从宣布到实施仅2周 行业准备时间:严重不足 行业震荡数据: 第一周(4月8-15日): ├─ 跨境电商交易量暴跌:70% ├─ 郑州保税仓:10万包裹积压无法清关 ├─ 宁波保税仓:20万包裹退运 └─ 商家投诉热线被打爆 第一个月(4月): ├─ 30%的中小跨境电商倒闭 ├─ 50%的平台暂停新品上架 ├─ 行业GMV下降:50% └─ 供应链合作伙伴大量违约 案例:某母婴跨境电商 ├─ 主营商品:奶粉、辅食、纸尿裤 ├─ 新政影响: │ └─ 奶粉需要配方注册(需6-12个月) │ └─ 保税仓库存1000万元无法销售 │ └─ 3个月后资金链断裂 └─ 结果:倒闭 案例:某化妆品平台 ├─ 主营:日韩化妆品 ├─ 新政影响: │ └─ 部分品牌无法提供通关单 │ └─ SKU从2000个 → 800个(减少60%) │ └─ GMV下降65% └─ 结果:裁员50%,勉强存活 1.2 政策的深层逻辑 为什么要改? ...

2025-11-02 · maneng

供应链智能化:从成本管理到价值创造

系列文章:本文是《跨境电商第一性原理》系列的第5篇,建议按顺序阅读: 跨境电商第一性原理:为什么跨境比国内复杂100倍? 最小可行模型:一笔跨境交易的完整推演 从个体到平台:规模化如何重构跨境电商 跨境金融系统:支付即合规的深层逻辑 供应链智能化:从成本管理到价值创造(本文) 一、引子:3000万库存的困局 1.1 真实场景:年底的库存盘点 2023年12月31日,跨境电商平台"环球优品"的仓库经理老王正在进行年度库存盘点。 盘点结果让所有人震惊: 总库存: ├─ 账面价值:3000万元 ├─ SKU数量:2000个 ├─ 总件数:50万件 └─ 占用仓库面积:5000㎡ 库存分类: 畅销品(20%): ├─ 库存占比:30%(900万元) ├─ 库存周转天数:30天 └─ 状态:✅ 健康 滞销品(50%): ├─ 库存占比:40%(1200万元) ├─ 库存周转天数:180天 └─ 状态:⚠️ 预警 呆滞品(30%): ├─ 库存占比:30%(900万元) ├─ 库存周转天数:>365天 └─ 状态:❌ 严重 问题汇总: 1. 1200万元的商品卖不动(滞销) 2. 900万元的商品可能永远卖不出去(呆滞) 3. 资金占用成本:3000万 × 6%/年 = 180万元/年 4. 仓储成本:5000㎡ × 45元/㎡ × 12月 = 270万元/年 5. 货损货差:3000万 × 2% = 60万元/年 总成本:180 + 270 + 60 = 510万元/年 占年GMV比例:510万 / 30000万 = 1.7% CEO的质问: ...

2025-11-02 · maneng

跨境金融系统:支付即合规的深层逻辑

系列文章:本文是《跨境电商第一性原理》系列的第4篇,建议按顺序阅读: 跨境电商第一性原理:为什么跨境比国内复杂100倍? 最小可行模型:一笔跨境交易的完整推演 从个体到平台:规模化如何重构跨境电商 跨境金融系统:支付即合规的深层逻辑(本文) 一、引子:一笔支付为什么被拒绝? 1.1 真实场景:订单支付失败 2023年双11,上海白领小张想在京东国际买一款日本SK-II面霜,价格1433元。 支付流程: 20:00:00 小张下单,选择商品 20:00:30 进入支付页面 20:00:45 选择支付宝支付 20:01:00 输入支付密码 20:01:05 支付宝扣款成功(显示"支付成功") 20:01:10 跳转回商城 20:01:15 ❌ 页面显示:"订单支付失败,请重新下单" 小张很困惑: 支付宝明明已经扣款了 为什么还说支付失败? 钱去哪里了? 客服回复: “您好,因为您使用的支付宝账户实名信息与订单收货人不一致,系统自动拒绝了该笔交易。款项将在1-3个工作日原路退回。” 小张更困惑了: 我用的是我爸的支付宝付款(我自己的额度用完了) 商品是寄给我自己的 国内电商(天猫、京东)都可以这样付款,为什么跨境不行? 1.2 同样的场景,不同的结果 场景A:国内电商(天猫) 小张在天猫买一瓶面霜(1500元) ├─ 收货人:小张 ├─ 支付人:爸爸(用爸爸的支付宝) └─ 结果:✅ 支付成功,正常发货 流程: 1. 下单 → 支付 → 扣款 → 发货 2. 没有任何限制 3. 支付人和收货人可以不一致 场景B:跨境电商(京东国际) 小张在京东国际买一瓶面霜(1433元) ├─ 收货人:小张 ├─ 支付人:爸爸(用爸爸的支付宝) └─ 结果:❌ 支付失败,订单取消 原因: 1. 海关要求:支付人 = 订单收货人 = 物流收货人 2. 目的:防止盗用他人身份避税、防止洗钱 3. 这是强制性的合规要求,无法绕过 1.3 核心问题:为什么跨境支付不同? 国内支付: └─ 核心目的:完成资金转移 └─ 监管重点:防欺诈 └─ 身份要求:支付人实名即可 跨境支付: └─ 核心目的:完成资金转移 + 合规留痕 └─ 监管重点:防欺诈 + 防洗钱 + 防逃税 + 防资本外流 └─ 身份要求:支付人 = 收货人(三方一致) 额外的复杂度来自哪里? ├─ 外汇管制(涉及人民币与外币兑换) ├─ 跨境资金流动(涉及国际收支统计) ├─ 税收征管(涉及个人年度额度管理) └─ 反洗钱(涉及资金来源合法性) 结论: ...

2025-11-02 · maneng

从个体到平台:规模化如何重构跨境电商

系列文章:本文是《跨境电商第一性原理》系列的第3篇,建议按顺序阅读: 跨境电商第一性原理:为什么跨境比国内复杂100倍? 最小可行模型:一笔跨境交易的完整推演 从个体到平台:规模化如何重构跨境电商(本文) 一、引子:一个个人代购的困境 1.1 个人代购的黄金时代(2010-2014) 2012年的秋天,在日本早稻田大学读研究生的小李开始了他的副业——帮国内朋友代购日本商品。 运作方式非常简单: 微信接单 → 周末去涩谷商场采购 → EMS国际快递寄回 → 微信收款 数据画像: 订单量:5-10单/月 客单价:500-1000元 利润率:10-20%(赚50-100元/单) 月收入:500-1000元(零花钱) 时间投入:5小时/周(周末采购) 用户画像: 都是朋友或朋友的朋友(强信任关系) 需求明确(指定品牌型号) 时效不敏感(7-10天可接受) 愿意等待(理解留学生时间有限) 核心优势: ✅ 信任成本低:朋友关系,无需担保 ✅ 运营成本低:无库存,无店租,无员工 ✅ 风险可控:先收款再采购,零库存风险 ✅ 可持续:不影响学业,额外收入 结论:这是一个简单、低成本、可持续的个人创业模式。 1.2 规模扩大的尝试(2014-2015) 2014年,小红书、洋码头等跨境电商平台兴起,“海淘"成为热词。小李的朋友圈开始疯狂扩散: 朋友的朋友 朋友的同事 同事的朋友 完全陌生的客户 转折点来了:订单量从 5单/月 → 50单/月(10倍增长)。 新问题开始涌现 问题1:时间严重不足 之前:5单/月 × 30分钟/单 = 2.5小时/月 现在:50单/月 × 30分钟/单 = 25小时/月 采购时间: - 周末去商场:4-5小时 - 需要跑多个商场(断货) - 排队结账:30分钟 - 打包发货:2小时 总计:每周需要7-8小时(学业开始受影响) 问题2:库存压力显现 热门商品经常断货: - SK-II神仙水:每次限购2瓶,客户要10瓶 - 花王纸尿裤:只有M码,客户要L码 - 龙角散:限购1盒,客户要5盒 解决方案:提前囤货 - 囤货成本:50,000元 - 占用资金:2个月 - 滞销风险:某些商品3个月卖不出去 问题3:物流成本飙升 ...

2025-11-02 · maneng

跨境电商第一性原理:为什么跨境比国内复杂100倍?

引子:一瓶面霜的两种命运 2025年1月15日,晚上10点,两位消费者几乎同时想买一瓶SK-II神仙水。 场景A:小王的国内电商之旅(简单模式) 小王打开天猫,搜索"SK-II神仙水",选择"天猫旗舰店": 时间轴 系统流程 ───────────────────────────────────────────────── 22:00:00 下单 天猫订单系统 商品:SK-II神仙水 价格:1,290元 22:00:15 支付成功 微信支付 ├─ 扣款:1,290元 └─ 到账:商家账户 22:05:00 仓库拣货 江苏常州仓库 ├─ 拣货员扫描货位 └─ 取出商品 22:10:00 打包完成 自动打包线 ├─ 装箱 ├─ 称重 └─ 生成快递单 22:15:00 发货 顺丰快递 ├─ 揽收扫描 └─ 进入物流网络 次日18:00 签收完成 小王家中 ├─ 快递员配送 └─ 小王签收 耗时:22小时 涉及的主体:3个 买家(小王) 卖家(SK-II官方旗舰店) 物流公司(顺丰快递) 涉及的系统:3个 电商平台(天猫) 支付系统(微信支付) 物流系统(顺丰) 关键节点:5个 下单 → 支付 → 拣货 → 发货 → 签收 场景B:小李的跨境电商之旅(复杂模式) 小李打开京东国际,搜索"SK-II神仙水",选择"保税仓发货": 时间轴 系统流程 ───────────────────────────────────────────────── 22:00:00 下单 京东国际订单系统 商品:SK-II神仙水(日本进口) 价格:1,050元 22:00:01 订单推送海关 → 海关单一窗口 ├─ 订单编号:JD202511021234567 ├─ 商品信息:50+字段 ├─ 收货人信息:姓名/身份证/电话/地址 └─ 海关接收:返回受理编号 22:00:15 支付成功 微信支付 ├─ 商品价格:820元 ├─ 税费:230元(9.1%综合税) └─ 实付:1,050元 22:00:18 支付单推送海关 → 海关单一窗口 ├─ 支付单号:PAY202511021234567 ├─ 支付金额:1,050元 ├─ 支付人身份:小李(实名认证) └─ 海关接收:等待三单齐全 22:05:00 保税仓拣货 杭州保税仓 ├─ 拣货任务生成 ├─ 拣货员PDA扫描 └─ 商品取出 22:15:00 打包完成 保税仓打包区 ├─ 装箱 ├─ 称重:0.5kg └─ 生成面单 22:16:00 物流单推送海关 → 海关单一窗口 ├─ 运单号:SF202511021234567 ├─ 物流公司:顺丰速运 ├─ 收货人信息:小李(与订单一致) └─ 海关接收:三单齐全 22:17:00 三单对碰 海关系统自动校验 ├─ 校验1:订单金额 = 支付金额 ✅ ├─ 校验2:订单收货人 = 支付人 = 运单收货人 ✅ ├─ 校验3:三单时间在24小时内 ✅ ├─ 校验4:商品已备案 ✅ └─ 结论:对碰成功 22:18:00 海关放行 海关系统 ├─ 放行指令下发 ├─ 税费已扣除 └─ 允许出库 22:20:00 保税仓出库 通过卡口 ├─ 卡口扫描(检查放行状态) ├─ 包裹放行 └─ 交给物流公司 22:30:00 物流揽收 顺丰快递 ├─ 揽收扫描 └─ 进入国内配送流程 次日18:00 签收完成 小李家中 ├─ 快递员配送 └─ 小李签收 耗时:20小时(比国内还快!) 涉及的主体:7个 ...

2025-11-02 · maneng

最小可行模型:一笔跨境交易的完整推演

引子:如果没有监管会怎样? 在开始推演之前,让我们做一个思想实验: 假设:世界上没有国界、没有海关、没有监管,跨境买卖就像在同一个城市里一样简单。 场景: 张三(日本东京)有一瓶SK-II神仙水,想卖200元 李四(中国上海)想买 他们如何完成这笔交易? 最简方案: 步骤1:达成协议 └─ 张三在论坛发帖:"SK-II神仙水,200元包邮" └─ 李四看到,私信张三:"我要了" 步骤2:支付 └─ 李四通过支付宝转账200元给张三 步骤3:发货 └─ 张三用EMS国际快递发货 步骤4:收货 └─ 李四3天后收货,确认收货 完成! 看起来很简单? 但这个"理想模型"有致命的问题: 问题1:信任风险 ├─ 张三收钱不发货怎么办? ├─ 商品是假货怎么办? ├─ 商品破损谁负责? └─ 李四收货不付款怎么办? 问题2:合规风险 ├─ 没有报关,算走私吗? ├─ 没有缴税,违法吗? └─ 商品安全谁来保证? 问题3:效率问题 ├─ 每次都要谈判,太慢 ├─ 每次都担心被骗,心累 └─ 如果每天有1万笔这样的交易呢? 结论: 这个模型只适合"熟人之间的一次性交易" 无法规模化、无法建立信任、无法合规 所以,我们必须一步步引入新的机制 接下来,让我们用渐进式推演的方法,从这个最简模型出发,逐步加入: 海关监管(解决合规问题) 支付系统(解决信任问题) 物流系统(解决效率问题) 规模化设计(解决量级问题) 每一步,我们都要回答三个问题: 为什么需要?(问题是什么) 带来了什么?(新的复杂度) 如何解决?(设计方案) 场景1:加入海关监管 1.1 为什么需要海关? 问题场景: 假设:没有海关监管 后果1:税收流失 └─ 张三卖了100瓶SK-II,每瓶赚100元 └─ 国家没有收到任何税收 └─ 累计1万笔这样的交易 → 税收流失100万元 后果2:商品安全隐患 └─ 张三卖的是假货 └─ 李四买到后皮肤过敏 └─ 没有监管,无法追责 后果3:不公平竞争 └─ 张三的商品不缴税,售价200元 └─ 王五开实体店,缴税后售价300元 └─ 王五无法竞争,倒闭 后果4:数据盲区 └─ 国家不知道进口了什么 └─ 无法制定产业政策 └─ 外汇管理失控 从国家角度看,必须监管! ...

2025-11-02 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...