Redis 原子操作

文章目录

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

前言

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


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

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

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


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

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

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

✅ 原子性(OK)

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

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


❌ 非原子性(高风险)

ts 复制代码
// 错误写法:并发读写,导致超卖
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 推荐使用

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

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

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

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


相关推荐
梁辰兴1 小时前
软件工程:数据结构设计
数据库·软件工程·设计原则·设计方法·梁辰兴·数据库结构设计·数据库结构类型
AC赳赳老秦1 小时前
风控岗应用:OpenClaw 采集公开司法与经营异常数据,自动生成企业风险评估报告
大数据·c语言·数据库·人工智能·python·php·openclaw
灯澜忆梦2 小时前
【MySQL18】进阶篇 | MySQL管理
数据库·mysql
zcmodeltech2 小时前
智能制造教学实训沙盘模型多系统协同控制系统设计:基于STM32与Modbus RTU的工业机器人-智慧工厂-数字孪生全场景联动方案
数据库·stm32·嵌入式硬件·机器人·制造·多分类
AI多Agent协作实战派3 小时前
AI多Agent协作系统实战(四十):AI说“没有错误“,系统判了“测试失败“——一个正则的误判
数据库·人工智能
隔窗听雨眠3 小时前
OceanBase接入DeepSeek:数据库与AI的深度融合如何改写企业数据规则
数据库·人工智能·oceanbase
playboy1344 小时前
工作室 NAS 存储故障-办公室所有数据无法访问怎么办
数据库
byxdaz4 小时前
jeston平台交叉编译Poppler库与预览pdf文件
数据库
SilicoCode5 小时前
江科大STM32入门:FLASH闪存详解——从结构原理到读写保护
数据库·mongodb
谷哥的小弟5 小时前
腾讯云服务器安装Redis Stack图文教程
服务器·redis·腾讯云·redis stack