lua腳本在redis中執行是否是原子性?

lua腳本在redis中執行是否是原子性?

以及是否會阻塞其他腳本的執行【客戶端的請求】?

先解答第二個問題:

是的,保持原子執行。這也是redis中支持lua腳本執行的原因。

Lua 腳本在 Redis 中是以原子方式執行的,在 Redis 服務器執行EVAL命令時,在命令執行完畢并向調用者返回結果之前,只會執行當前命令指定的 Lua 腳本包含的所有邏輯,其它客戶端發送的命令將被阻塞,直到EVAL命令執行完畢為止。因此 LUA 腳本不宜編寫一些過于復雜了邏輯,必須盡量保證 Lua 腳本的效率,否則會影響其它客戶端。

Redis 提供了豐富的命令來供我們使用以實現一些計算。Redis 的單個命令都是原子性的,有時候我們希望能夠組合多個 Redis 命令,并讓這個組合也能夠原子性的執行,甚至可以重復使用。Redis 開發者意識到這種場景還是很普遍的,就在 2.6 版本中引入了一個特性來解決這個問題,這就是 Redis 執行 Lua 腳本。

lua腳本是否在redis主線程中執行?

在 Redis 中,Lua 腳本的執行是在主線程中進行的。當客戶端發送 Lua 腳本到 Redis 服務器時,Redis 會將腳本解析并編譯成字節碼,并將其存儲在服務器內部的腳本緩存中。當客戶端再次執行同一個腳本時,Redis 可以直接使用緩存中的字節碼來執行腳本,從而避免了重復解析和編譯的開銷。

因為 Lua 腳本是在 Redis 主線程中執行的,所以執行較長時間的腳本可能會導致阻塞其他客戶端請求的執行。為了避免這種情況,可以將一些長時間執行的操作拆分成多個步驟,使用 Redis 的 Lua 腳本執行和服務器端腳本緩存來優化腳本的性能。同時,還可以使用 Redis 的任務隊列或消息隊列來將長時間執行的操作移動到后臺處理,從而避免阻塞主線程并提高系統的并發性能。

了解了上面這些知識基本上可以滿足開發一些簡單的 Lua 腳本了。但是實際開發中還是有一些要點的。

  • 務必對 Lua 腳本進行全面測試以保證其邏輯的健壯性,當 Lua 腳本遇到異常時,已經執行過的邏輯是不會回滾的。【如果是redis本身自帶支持的命令呢?都是原子性的,也就是只會存在兩種狀態,成功or失敗】
  • 盡量不使用 Lua 提供的具有隨機性的函數,參見相關官方文檔。
  • 在 Lua 腳本中不要編寫function函數, 整個腳本作為一個函數的函數體。
  • 在腳本編寫中聲明的變量全部使用local關鍵字。
  • 在集群中使用 Lua 腳本要確保邏輯中所有的key分到相同機器,也就是同一個插槽(slot)中,可采用Redis Hash Tag技術。
  • 再次重申 Lua 腳本一定不要包含過于耗時、過于復雜的邏輯。(否則將導致redis宕機, 影響所有使用到redis的服務)

    本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
    如若轉載,請注明出處:http://www.pswp.cn/bicheng/95765.shtml
    繁體地址,請注明出處:http://hk.pswp.cn/bicheng/95765.shtml
    英文地址,請注明出處:http://en.pswp.cn/bicheng/95765.shtml

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

    相關文章

    DeepSeek文獻太多太雜?一招制勝:學術論文檢索的“核心公式”與提問藝術

    如果我們想要完成一次學術論文檢索,那我們可以把它想象成一次精準的“學術尋寶”。你不是在漫無目的地閑逛,而是一名裝備精良的“學術尋寶獵人”,你的目標是找到深藏在浩瀚文獻海洋中的“珍寶”(高價值論文)。1 你的尋…

    Linux內存管理章節一:深入淺出Linux內存管理:從物理內存到ARM32的用戶與內核空間

    引言 如果說操作系統是計算機的心臟,那么內存管理就是它的靈魂脈絡。它默默地工作在Linux內核的最底層,卻決定著整個系統的穩定性、安全性和性能。今天,我們將撥開迷霧,深入探索Linux內存管理的核心概念,并結合熟悉的A…

    ECMAScript (5)ES6前端開發核心:國際化與格式化、內存管理與性能

    好的,我將根據【國際化與格式化】和【內存管理與性能】這兩個主題,為你生成詳細的課件內容,涵蓋概念、應用和實例。 📗 前端開發核心:國際化與格式化、內存管理與性能 1. 國際化與格式化 (Internationalization & …

    3D 可視化數字孿生運維管理平臺:構建 “虛實協同” 的智慧運維新范式

    3D 可視化數字孿生運維管理平臺通過 “物理空間數字化建模 實時數據動態映射 智能分析決策”,將建筑、園區、工業設施等物理實體 1:1 復刻為虛擬孿生體,打破傳統運維 “信息割裂、依賴經驗、響應滯后” 的痛點,實現從 “被動搶修” 到 “主…

    DP-觀察者模式代碼詳解

    觀察者模式: 定義一系列對象之間的一對多關系;當一個對象改變狀態,它的依賴都會被通知。 主要由主題(Subject)和觀察者(Observer)組成。 代碼實現 package com.designpatterns.observer;/*** 定…

    1983:ARPANET向互聯網的轉變

    一、ARPANET早期1969年誕生的ARPANET最初還算不上互聯網,不過在ARPANET構建之初就已經考慮了分組交換:1970年代的ARPANET:其實這個時候我就有疑問,TCP/IP是1983年1月1日更新到ARPANET的,但是1970年代的ARPANET已經連接全美的重要單…

    自動化運維-ansible中的變量運用

    自動化運維-ansible中的變量運用 一、變量命名規則 組成:字母、數字、下劃線。必須以字母開頭。 合法: app_port, web_1, varA非法: 2_var (以數字開頭), my-var (包含其他字符), _private (以下劃線開頭) 避免使用內置關鍵字:例如 hosts, tasks, name…

    深入學習并發編程中的volatile

    volatile 的作用 保證變量的內存可見性禁止指令重排序1.保證此變量對所有的線程的可見性,當一個線程修改了這個變量的值,volatile 保證了新值能立即同步到主內存,其它線程每次使用前立即從主內存刷新。 但普通變量做不到這點,普通…

    使用Java獲取本地PDF文件并解析數據

    獲取本地文件夾下的PDF文件要獲取本地文件夾下的PDF文件,可以使用Java的File類和FilenameFilter接口。以下是一個示例代碼片段:import java.io.File; import java.io.FilenameFilter;public class PDFFileFinder {public static void main(String[] args…

    吳恩達機器學習補充:決策樹和隨機森林

    數據集:通過網盤分享的文件:sonar-all-data.csv 鏈接: https://pan.baidu.com/s/1D3vbcnd6j424iAwssYzDeQ?pwd12gr 提取碼: 12gr 學習來源:https://github.com/cabin-w/MLBeginnerHub 文末有完整代碼,由于這里的代碼和之前的按…

    Shell腳本一鍵監控平臺到期時間并釘釘告警推送指定人

    1. 監控需求客戶側有很多平臺需要定期授權,授權后管理后臺才可正常登錄,為避免授權到期,現撰寫腳本自動化監控平臺授權到期時間,在到期前15天釘釘或其他媒介提醒。2. 監控方案2.1 收集平臺信息梳理需要監控的平臺地址信息&#xf…

    華為HCIE數通含金量所剩無幾?考試難度加大?

    最近網上很火的一個梗——法拉利老了還是法拉利,這句話套在華為HCIE數通身上同樣適用,華為認證中的華為數通和云計算兩大巨頭充斥著大家的視野里面,也更加廣為人知,但隨著時代的發展,華為認證體系的調整,大…

    #數據結構----2.1線性表

    在數據結構的學習中,線性表是最基礎、最核心的結構之一 —— 它是后續棧、隊列、鏈表等復雜結構的 “基石”。今天從 “是什么”(定義)到 “怎么用”(基本操作),徹底搞懂線性表的核心邏輯。 一、先明確&…

    2508C++,skia動畫

    gif動畫原理 先了解一下gif動畫的原理: gif動畫由一系列靜態圖像(或叫幀)組成.這些圖像按特定的順序排列,每一幀都代表動畫中的一個瞬間,幀圖像是支持透明的. 每兩幀之間有指定的時間間隔(一般小于60毫秒),gif播放器每渲染一幀靜態圖像后,即等待此時間間隔,依此邏輯不斷循環渲染…

    AI + 機器人:當大語言模型賦予機械 “思考能力”,未來工廠將迎來怎樣變革?

    一、引言1.1 未來工廠變革背景與趨勢在科技飛速發展的當下,全球制造業正站在變革的十字路口。隨著消費者需求日益多樣化、市場競爭愈發激烈,傳統工廠模式的弊端逐漸顯現。生產效率低下、難以適應個性化定制需求、設備維護成本高昂且缺乏前瞻性等問題&…

    pinia狀態管理的作用和意義

    1. 什么是狀態管理 狀態管理就是統一管理應用中的數據,讓數據在多個組件之間共享和同步。 // 沒有狀態管理 - 數據分散在各個組件中 // 組件A const user ref({ name: 張三, age: 25 })// 組件B const user ref({ name: 張三, age: 25 }) // 重復定義// 組件C c…

    十四、STM32-----低功耗

    一、電源框圖VDDA 供電區域,主要是 ADC 電源以及參考電壓,STM32 的 ADC 模塊配備獨立的供電方 式,使用了 VDDA 引腳作為輸入,使用 VSSA 引腳作為獨立地連接,VREF 引腳為提供給 ADC 的 參考電壓。電壓調節器是 STM32 的…

    一篇文章帶你徹底搞懂 JVM 垃圾收集器

    垃圾收集器是 JVM 內存管理的執行引擎,負責自動回收無用的對象內存。其設計核心是 權衡:主要是吞吐量和停頓時間之間的權衡。沒有“最好”的收集器,只有“最適合”特定場景的收集器。一、核心基礎:分代收集模型主流 HotSpot JVM 采…

    服務器排故隨筆:服務器無法ssh遠程登錄

    文章目錄服務器排故隨筆:服務器無法遠程登錄問題現象解決過程第一步:確認故障描述是否準確第二步:確認網絡是否有問題第三步:確認ssh服務是否有問題第四步:確認防火墻是否放行sshd服務第五步:試試萬能的“重…

    Deeplizard深度學習課程(六)—— 結合Tensorboard進行結果分析

    前言 Tensorboard最初是tensorflow的可視化工具,被用于機器學習實驗的可視化,后來也適配了pytorch。Tensorboard是一個前端web界面,,能夠從文件里面讀取數據并展示它(比如損失、準確率、網絡圖)。具體使用可…