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.pswp.cn/news/902892.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902892.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902892.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

中建海龍MiC模塊化建筑賦能“好房子”新范式

中國建筑國際集團旗下中建海龍科技有限公司&#xff08;以下簡稱“中建海龍”&#xff09;以科技創新為引擎&#xff0c;持續推動建筑行業向工業化、數字化、綠色化轉型升級。近期&#xff0c;其自主研發的模塊化集成建筑&#xff08;MiC&#xff09;技術成功入選中國建筑首批產…

DDL自聯表

自聯表 create table t_menu (id int AUTO_INCREMENT,name varchar(20),image varchar(20),url varchar(20),pid varchar(20),constraint pk_id primary key(id),constraint fk_id foreign key(pid) references t_menu(id) );

【版本控制】SVN + TortoiseSVN版本管理實用教程(附安裝+開發常用操作)

摘要&#xff1a; 本文將帶你從零開始掌握 SVN 版本控制系統&#xff0c;結合 TortoiseSVN 圖形客戶端工具&#xff0c;深入學習包括安裝、檢出、提交、更新、回滾、沖突解決等常用開發操作&#xff0c;快速上手團隊協作&#xff01; &#x1f9e9; 什么是 SVN&#xff1f; SV…

C語言實現對哈希表的操作:創建哈希表與擴容哈希表

一. 簡介 前面文章簡單了解了哈希表 這種數據結構&#xff0c;文章如下&#xff1a; 什么是哈希表-CSDN博客 本文來學習一下哈希表&#xff0c;具體學習一下C語言實現對哈希表的簡單實現。 二. C語言實現對哈希表的操作 1. 哈希表 哈希表&#xff08;Hash Table&#xff…

UML 活動圖詳解:以機票預訂系統用戶注冊為例

目錄 一、UML 活動圖的基本元素 二、題目原型 三、機票預訂系統用戶注冊的活動圖分析 四、活動圖繪畫 五、總結 在軟件開發過程中&#xff0c;UML&#xff08;統一建模語言&#xff09;活動圖是一種非常重要的工具&#xff0c;它能夠幫助我們清晰地理解系統的業務流程和工…

FX10(CYUSB4014)USB3.2(10Gbps)開發筆記分享(1):硬件設計與開發環境搭建

作者&#xff1a;Hello&#xff0c;Panda 大家早上好&#xff0c;中午好&#xff0c;下午好&#xff0c;晚上好&#xff0c;熊貓君又來了。這次計劃做一個連載&#xff0c;大概6期左右&#xff0c;主要介紹英飛凌最新的FX5/10/20的器件應用。目前&#xff0c;熊貓君手上調試的…

前端項目部署

一、本地服務器部署&#xff1a; 解決頁面刷新404問題&#xff1a; 1、使用 hash 模式 2、當路徑不匹配的時候&#xff0c;直接訪問 index.html 3、使用插件&#xff1a;connect-history-api-fallback https://www.npmjs.com/package/connect-history-api-fallback npm ins…

觀測云數據在Grafana展示的最佳實踐

背景 在當今的數據驅動世界中&#xff0c;組織越來越依賴于實時數據來做出決策。數據可視化是理解和分析這些數據的關鍵工具&#xff0c;它幫助用戶將復雜的數據集轉換成直觀的圖表和儀表板&#xff0c;從而更容易識別趨勢、模式和異常。Grafana&#xff0c;作為一個功能強大的…

架構師面試(三十六):廣播消息

題目 在像 IM、短視頻、游戲等實時在線類的業務系統中&#xff0c;一般會有【廣播消息】業務&#xff0c;這類業務具有瞬時高流量的特點。 在對【廣播消息】業務實現時通常需要同時寫 “系統消息庫” 和更新用戶的 “聯系人庫” 的操作&#xff0c;用戶的聯系人表中會有未讀數…

大模型微調 - transformer架構

什么是Transformer Transformer 架構是由 Vaswani 等人在 2017 年提出的一種深度學習模型架構&#xff0c;首次發表于論文《Attention is All You Need》中 Transformer 的結構 Transformer 編碼器&#xff08;Encoder&#xff09; 解碼器&#xff08;Decoder&#xff09; …

基于華為云 ModelArts 的在線服務應用開發(Requests 模塊)

基于華為云 ModelArts 的在線服務應用開發&#xff08;Requests 模塊&#xff09; 一、本節目標 了解并掌握 Requests 模塊的特點與用法學會通過 PythonRequests 訪問華為云 ModelArts 在線推理服務熟悉 JSON 模塊在 Python 中的數據序列化與反序列化掌握 Python 文件 I/O 的基…

python pymysql如何保證數據庫更新成功

python pymysql如何保證數據庫更新成功 在使用Python的PyMySQL庫與MySQL數據庫交互時,確保數據庫更新操作成功執行,可以通過以下幾種方式: 使用execute()和commit() 當執行一個更新(UPDATE)、插入(INSERT)或刪除(DELETE)操作時,你需要調用execute()方法來執行SQL語句…

【數據可視化-30】Netflix電影和電視節目數據集可視化分析

&#x1f9d1; 博主簡介&#xff1a;曾任某智慧城市類企業算法總監&#xff0c;目前在美國市場的物流公司從事高級算法工程師一職&#xff0c;深耕人工智能領域&#xff0c;精通python數據挖掘、可視化、機器學習等&#xff0c;發表過AI相關的專利并多次在AI類比賽中獲獎。CSDN…

【深度強化學習 DRL 快速實踐】逆向強化學習算法 (IRL)

Inverse Reinforcement Learning (IRL) 詳解 什么是 Inverse Reinforcement Learning&#xff1f; 在傳統的強化學習 (Reinforcement Learning, RL) 中&#xff0c;獎勵函數是已知的&#xff0c;智能體的任務是學習一個策略來最大化獎勵 而在逆向強化學習 (Inverse Reinforc…

入侵檢測系統(IDS)與入侵防御系統(IPS):功能對比與部署實踐

入侵檢測系統&#xff08;IDS&#xff09;與入侵防御系統&#xff08;IPS&#xff09;&#xff1a;功能對比與部署實踐 在網絡安全防御體系中&#xff0c;入侵檢測系統&#xff08;Intrusion Detection System, IDS&#xff09;與入侵防御系統&#xff08;Intrusion Preventio…

P12167 [藍橋杯 2025 省 C/Python A] 倒水

P12167 [藍橋杯 2025 省 C/Python A] 倒水 題目描述 小藍有 n n n 個裝了水的瓶子&#xff0c;從左到右擺放&#xff0c;第 i i i 個瓶子里裝有 a i a_i ai? 單位的水。為了美觀&#xff0c;小藍將水循環染成了 k k k 種顏色&#xff0c;也就是說&#xff0c;第 i i i …

短視頻矩陣系統可視化剪輯功能開發,支持OEM

在短視頻營銷與內容創作競爭日益激烈的當下&#xff0c;矩陣系統中的可視化剪輯功能成為提升內容產出效率與質量的關鍵模塊。它以直觀的操作界面和強大的編輯能力&#xff0c;幫助創作者快速將創意轉化為優質視頻。本文將結合實際開發經驗&#xff0c;從需求分析、技術選型到核…

制作一款打飛機游戲22:表格導出

編輯器功能擴展 今天&#xff0c;我想讓編輯器能夠處理一個數組&#xff0c;這是編輯器將要編輯的東西&#xff0c;它只編輯數組。這些區域在后續的不同版本的編輯器中會有不同的含義&#xff0c;但現在我想創建一個模板&#xff0c;能夠加載一個二維數組&#xff0c;并將二維…

AI數據分析的利器:解鎖BI工具的無限潛力

在數字化浪潮席卷全球的今天&#xff0c;數據已成為企業最寶貴的資產之一。如何高效、準確地分析這些數據&#xff0c;挖掘其中的價值&#xff0c;成為企業決策的關鍵。AI數據分析&#xff0c;作為新時代的數據分析利器&#xff0c;正逐漸改變著企業的決策方式。而BI&#xff0…

【每天一個知識點】IPv4(互聯網協議版本4)和IPv6(互聯網協議版本6)

IPv4&#xff08;互聯網協議版本4&#xff09;和IPv6&#xff08;互聯網協議版本6&#xff09;是用于在互聯網上標識和定位設備的兩種主要協議。它們的主要區別在于地址空間、結構、以及一些附加功能。以下是兩者的對比&#xff1a; 1. 地址長度 IPv4: 地址長度為32位&#xf…