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

Redis 原子操作

文章目录

  • 前言
    • ✅ 一、什么是「原子操作」?
    • 🔍 二、怎么判断一个操作是否原子?
    • 🧪 三、项目中的原子 vs 非原子案例(秒杀系统)
      • ✅ 原子性(OK)
      • ❌ 非原子性(高风险)
    • 💡 四、常见后端场景对比
    • 🛠️ 五、你可以这样判断是否是原子操作:
      • ✅ 建议你在实际开发中记住一句话:


前言

如何判断某个操作是原子性 or 非原子性”,这是所有后端工程师必须理解清楚的高并发设计核心问题。


✅ 一、什么是「原子操作」?

原子性(Atomicity) 指的是一个操作要么全部完成、要么完全不做,不存在中间状态。

✔️ 不可分割、不可被并发干扰。


🔍 二、怎么判断一个操作是否原子?

你在用的系统/工具判断原子性的方法
Redis✅ 单条命令是原子
✅ Lua 脚本是原子
⚠️ 多条 get + set 是非原子
SQL 数据库✅ 一条语句是原子
✅ 在事务(BEGIN...COMMIT)块中是原子
Kafka✅ 单条 produce 是原子
⚠️ 多 topic 发送不是事务除非启用事务
JavaScript 函数❌ 大多数异步 await 链都是非原子
多服务调用❌ 多接口调用天生非原子 → 需要事务协调 / 补偿

🧪 三、项目中的原子 vs 非原子案例(秒杀系统)

✅ 原子性(OK)

// Redis Lua 脚本库存扣减:原子执行
const result = await redis.eval(`local stock = tonumber(redis.call('get', KEYS[1]))if stock <= 0 then return 0 endredis.call('decr', KEYS[1])return 1
`, 1, `seckill:stock:{${skuId}}`);

✔️ 这个 Lua 脚本是一个原子块,Redis 会在单线程中完整执行。


❌ 非原子性(高风险)

// 错误写法:并发读写,导致超卖
const stock = await redis.get(key);
if (stock > 0) {await redis.set(key, stock - 1);
}

⚠️ 两条命令之间可能有 1000 个请求插入 → 超卖。


💡 四、常见后端场景对比

场景原子性正确方案
秒杀扣库存 + 创建订单拆成 2 步:Redis 原子扣库存 + Kafka 异步下单
SQL 中 update ... where ...单条语句原子
多表操作(如扣钱+加余额)使用事务
Redis watch + multi⚠️不是真正原子,执行前可以被干扰
Kafka 多 topic 同时写入开启 Kafka 事务
Redis 脚本 eval推荐使用

🛠️ 五、你可以这样判断是否是原子操作:

提问回答
有没有多个步骤?多步骤一般非原子
中间是否会 awaitawait 就可能被打断
Redis 命令是否是组合逻辑?推荐写成 Lua 脚本
是否包含多个微服务调用?微服务间永远非原子,需要幂等+补偿
有没有使用数据库事务?有事务通常能保证原子性(需正确使用)

✅ 建议你在实际开发中记住一句话:

一个操作,只要会被并发干扰,那它就不是原子操作,必须考虑加锁、脚本、队列或事务。


http://www.xdnf.cn/news/134227.html

相关文章:

  • linux ptrace 图文详解(七) gdb、strace跟踪系统调用
  • 正则表达式三剑客之——awk命令
  • OpenHarmony之电源模式定制开发指导
  • C++入门(下)
  • 【torch\huggingface默认下载路径修改】.cache/torch/ 或 .cache/huggingface
  • 精益数据分析(23/126):把握创业阶段与第一关键指标
  • conda安装cuda+cudnn+pytorch【一条龙服务,以cuda12.1版本为例】
  • Springboot 手搓 后端 滑块验证码生成
  • 在vscode终端中运行npm命令报错
  • IntelliJ IDEA 中配置 Spring MVC 环境的详细步骤
  • 深入理解C++ 中的list容器
  • 在 Java 项目中搭建和部署 Docker 的详细流程
  • Jenkins流水线管理工具
  • Estimands与Intercurrent Events:临床试验与统计学核心框架
  • Flink TaskManager详解
  • Unity开发者快速认识Unreal 的BluePrint(二)
  • 软件测试流程
  • 代理ip和实际ip的区别和联系
  • MySQL的MVCC【学习笔记】
  • stone 3d v3.3.0版本发布,含时间线和连接器等新功能
  • 零信任架构:重塑网络安全的IT新范式
  • Redis ⑥-string | hash | list
  • 金仓数据库征文-政务领域国产化数据库更替:金仓 KingbaseES 应用实践
  • 使用springboot+easyexcel实现导出excel并合并指定单元格
  • VuePress可以做什么?
  • Keras中Lambda层的常用方法
  • 告别默认配置!Xray自定义POC开发指南
  • Linux字符设备驱动开发的详细步骤
  • ubuntu22.04 命令行修改静态ip
  • 贝叶斯优化GAM回归(matlab代码)