秋招Day14 - Redis - 應用

Redis如何實現異步消息隊列?

List配合LPUSHRPOP

另外就是用 Redis 的 Pub/Sub 來實現簡單的消息廣播和訂閱。

但是這兩種方式都是不可靠的,因為沒有 ACK 機制所以不能保證訂閱者一定能收到消息,也不支持消息持久化。

Redis如何實現延時消息隊列?

延時消息隊列在實際業務中很常見,比如訂單超時取消、定時提醒等場景。

可以使用ZSet有序集合,將消息作為 member,把消息的需要執行時的時間戳作為 score。

這樣消息就會按照執行時間自動排序,消費者只需要定期掃描當前時間之前的消息進行處理就可以了。

具體來講,生產者向ZSet中發送消息時計算其應該執行的時間戳,然后通過ZADD命令將消息和時間戳添加到Zset;消費者用ZREMRANGEBYSCORE命令獲取當前時間戳之前的消息進行處理。

Redis支持事務嗎?

Redis支持簡單的事務,用MULTI開啟事務,將一系列命令放入執行隊列,中間可以用DISCARD取消事務隊列,放棄事務執行,最后用EXEC按照先進先出的順序執行隊列里的命令。

WATCH命令用于監視一個或多個key,如果這個key在事務最后執行之前被其它命令改動,那么事務將會被放棄執行

不支持回滾,只有執行和不執行的區別,也不支持多種隔離級別

說一下Redis事務的原理??

MULTI會將客戶端打一個事務的標記,表示先把命令存到隊列里,EXEC的時候再看情況執行(如果中間有DISCARD或者WATCH監控的key被其它命令修改則放棄執行事務),命令隊列按照FIFO執行,由于Redis是單線程的,天然支持原子性,不會被其它命令打斷?

Redis事務為什么不支持回滾?

沒有類似于MySQL那樣的undo log機制,設計理念是簡單高效而不是完整的ACID特性,引入回滾機制會增加復雜性和性能開銷

Redis事務滿足原子性嗎?要怎么改進??

Redis命令執行的實際過程中雖然不會被其它命令打斷,但是如果執行的過程中有報錯,后續的命令仍然會執行,事務不會被回滾,不符合傳統的原子性的定義。

使用Lua腳本代替事務實現報錯時回滾,可以在腳本中處理整個業務邏輯,包括條件檢查錯誤處理,保證要么執行成功,要么回滾到初始狀態。

Redis事務的ACID特性如何實現?

單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,所以 Redis 事務在執行過程中如果某個命令失敗了,其他命令還是會繼續執行,不會回滾

一致性指的是,如果數據在執行事務之前是一致的,那么在事務執行之后,無論事務是否執行成功,數據也應該是一致的。但 Redis 事務并不保證一致性,因為如果事務中的某個命令失敗了,其他命令仍然會執行,就會出現數據不一致的情況。

Redis 是單線程執行事務的,并且不會中斷,直到執行完所有事務隊列中的命令為止。因此,我認為 Redis 的事務具有隔離性的特征。

Redis 事務的持久性完全依賴于 Redis 本身的持久化機制,如果開啟了 AOF,那么事務中的命令作為一個整體記錄到 AOF 文件中,當然也要看 AOF 的 fsync 策略。

如果只開啟了 RDB,事務中的命令可能會在下次快照前丟失。如果兩個都沒有開啟,肯定是不滿足持久性的。

有Lua腳本操作Redis的經驗嗎?

用Lua腳本實現過分布式鎖,因為發現就算一個線程成功獲取了鎖,在設置過期時間的時候如果進程崩潰,由于Redis本身沒有回滾機制,這個鎖將永遠不會被釋放造成死鎖。其次,Lua腳本可以實現只有加鎖者才能釋放鎖的邏輯。

// 解鎖腳本特別重要,必須驗證是自己的鎖才能刪
private final String UNLOCK_SCRIPT = "if redis.call('GET', KEYS[1]) == ARGV[1] then " +"    return redis.call('DEL', KEYS[1]) " +"else " +"    return 0 " +"end";

Redis的管道Pipeline了解嗎?

Pipeline允許客戶端一次性向Redis服務器發送多個命令,不必等待一個命令執行完畢后再發送下一個。Redis服務器按照FIFO的順序執行命令,將所有結果打包發回客戶端。

什么場景下適合使用Pipeline?

需要批量插入、刪除、更新數據時,或者需要執行大量相似命令的時候,比如批量加載熱點數據,統計數據的批量更新、大批量數據的導入導出、批量刪除過期或無效的緩存

了解過Pipeline的底層原理嗎?

底層是緩沖的思想,我在RedisClient類中封裝了一個PipelineAction 內部類,用來緩存命令

PipelineAction的add方法將命令封裝成Runnable對象,放入List中。execute方法調用RedisTemplate的executePipeline方法開啟管道模式將多個命令發送給Redis客戶端。

Redis從輸入緩沖區中讀取到命令后,依次執行這些命令,將執行結果寫入輸出緩沖區,最后再將結果一次性打包返回給客戶端。

Redis分布式鎖如何解決鎖過期問題

具體場景是,A獲取到了分布式鎖并設置了過期時間,但是由于執行的時間過長,任務還沒執行完畢鎖就被釋放了,其他線程就獲取到了鎖,但此時如果A執行完畢,釋放掉的其實是B的鎖。

可以通過鎖的自動續期機制來解決鎖過期的問題,比如Redission的看門狗機制,后臺啟動一個定時任務,隔一段時間就檢查鎖是否還被當前線程持有,如果是則延遲鎖的持有時間,這樣避免了鎖被提前釋放

Redisson了解多少??

Redission是基于Redis的java客戶端,它不只是對Redis進行簡單封裝,還提供了很多分布式的數據結構和服務,比如最常用的分布式鎖?

Redisson 的分布式鎖比 SETNX 完善的得多,它的看門狗機制可以讓我們在獲取鎖的時候省去手動設置過期時間的步驟,它在內部封裝了一個定時任務,每隔 10 秒會檢查一次,如果當前線程還持有鎖就自動續期 30 秒。

另外,Redisson 還提供了分布式限流器 RRateLimiter,基于令牌桶算法實現,用于控制分布式環境下的訪問頻率。

詳細說說Redission的看門狗機制?

Redisson 的看門狗機制是一種自動續期機制,用于解決分布式鎖的過期問題。

基本原理是這樣的:當調用?lock()?方法加鎖時,如果沒有顯式設置過期時間,Redisson 會默認給鎖加一個 30 秒的過期時間,同時啟用一個名為“看門狗”的定時任務,每隔 10 秒(默認是過期時間的 1/3),去檢查一次鎖是否還被當前線程持有,如果是,就自動續期,將過期時間延長到 30 秒。

續期時,Redission?Lua 腳本檢查鎖的 value 是否匹配當前線程,如果匹配就延長過期時間。這樣就能保證只有鎖的真正持有者才能續期

當調用unlock()時,看門狗任務結束,但是如果執行完任務忘記unlock了,看門狗也會自動檢查鎖,如果當前線程已經退出了或者鎖已經不屬于當前線程了,也會停止自動續期

看門狗機制中的鎖檢查和續期過程是原子操作嗎??

在Redis層面是原子的,通過Lua腳本實現原子的批量操作,不會被其他命令打斷,hexists命令和expire操作放在同一個Lua腳本中,是不可分割的,是原子的,要么都成功,要么回滾,確保續期的一定是當前線程持有的鎖

RedLock你了解多少??

是一種分布式鎖算法,用于解決單個Redis實例用作分布式鎖的時候存在的單點故障問題。

通過在多個完全獨立的Redis實例上同時獲取鎖來實現容錯,只要成功的實例數量超過一半就認為獲取鎖成功。

RedLock能不能保證百分百上鎖?

不能,由于網絡分區,因為客戶端不能保證和集群中所有的Redis實例建立連接,比如集群中有五個節點,但是客戶端只能和兩個建立連接,永遠也無法成功獲取半數以上的鎖,從而一定失敗。

如果各個 Redis 實例之間存在明顯的時鐘漂移,或者客戶端在獲取鎖的過程中耗時過長,比如網絡延遲、GC 停頓等,都可能會導致鎖在獲取完成前就過期,從而獲取失敗。

項目中有用到Redis分布式鎖嗎?

有使用到Redis分布式鎖防止用戶多端登陸同時大量調用人臉識別攻擊操作繞過閾值檢查

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

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

相關文章

因果語言模型、自回歸語言模型、僅解碼器語言模型都是同一類模型

因果語言模型、自回歸語言模型、僅解碼器語言模型都是同一類模型 flyfish 因果語言模型(causal Language Models) 自回歸語言模型(autoregressive language models) 僅解碼器語言模型(decoder-only language models&am…

jvm架構原理剖析篇

簡單題(5道) 考查內容:JVM運行時數據區域 題干:Java虛擬機棧的主要作用是? A. 存儲對象實例 B. 存儲方法調用和局部變量 C. 存儲靜態字段 D. 存儲字節碼指令 正確答案:B 解析:虛擬機棧用于存儲方…

智鏈萬物:人工智能驅動的產業智能化革命

當生成式AI在藝術與創意領域掀起風暴,大型語言模型重塑信息交互方式時,一場更為基礎、影響更為深遠的變革,正在全球實體經濟的根基處悄然發生并加速推進——這就是產業智能化。它并非簡單的“機器換人”,而是人工智能(…

python中上下文管理器 與 try finally有什么區別

目錄 主要區別代碼對比何時使用哪種方式 主要區別 語法簡潔性 上下文管理器使用 with 語句,語法更簡潔優雅try-finally 需要顯式編寫異常處理代碼,更冗長 代碼復用性 上下文管理器可以封裝為類或函數,便于在多處復用try-finally 通常需要在每…

人體屬性識別+跌倒檢測:兒童行為監測與安全升級

智慧幼兒園的AI智能檢測盒應用實踐 背景:傳統園區管理的三大痛點 傳統幼兒園管理長期面臨三大核心挑戰:一是安全監控依賴人工巡查,存在視覺盲區與響應延遲,如某連鎖幼兒園曾因人工巡查疏漏,導致3起兒童跌倒事故未能及…

【ESP32-IDF筆記】09-UART配置和使用

環境配置 Visual Studio Code :版本1.98.2 ESP32:ESP32-S3 ESP-IDF:V5.4 支持型號:ESP32、ESP32-C2、ESP32-C3、ESP32-C5、ESP32-C6、ESP32-C61、ESP32-H2、ESP32-P4、 ESP32-S2、ESP32-S3 簡介 通用異步接收器/發送器 (UART) …

在 .NET Core 和 React 中使用 WebSockets 和 SignalR 進行實時數據傳輸

對于需要即時更新和通知的應用程序來說,實時數據傳輸至關重要。在 .NET Core 中,WebSocket 和 SignalR 提供了強大的工具來實現客戶端和服務器之間的實時通信。在本指南中,我們將探討如何在 .NET Core 應用程序中使用 WebSocket 和 SignalR 實…

第八十六篇 大數據排序算法:從廚房整理到分布式排序的智慧

目錄一、基礎排序算法:生活場景中的計算智慧1.1 冒泡排序:圖書館的書籍整理1.2 插入排序:廚房調料的整理藝術二、高效排序算法:大數據處理的利器2.1 快速排序:音樂APP的智能歌單2.2 歸并排序:學校成績單的合…

開源 | V3.1.1慧知開源重卡運營充電樁平臺 - 重卡運營充電樁平臺管理解決方案;企業級完整代碼 多租戶、模擬器、多運營商、多小程序;

【開源免費版】推薦一套企業級開源充電樁平臺:完整代碼包含多租戶、硬件模擬器、多運營商、多小程序,汽車 電動自行車、云快充協議;——(慧哥)慧知開源充電樁平臺;https://liwenhui.blog.csdn.net/article/details/148242725?spm…

ONLYOFFICE 協作空間 企業版使用秘籍-8.使用虛擬數據房間,處理機密文檔更安全

在當今快節奏的社會中,信息已成為極其關鍵的資源,因此,保護敏感數據至關重要。ONLYOFFICE 協作空間中的虛擬數據房間(VDR)提供了一個安全便捷的工作空間,確保文檔受到嚴密保護的同時,也能實現輕…

系統架構設計師論文分享-論軟件架構復用

我的軟考歷程 摘要 2023年2月,我所在的公司通過了研發紗線MES系統的立項,該項目為國內紗線工廠提供SAAS服務,旨在提升紗線工廠的數字化和智能化水平。我在該項目中擔任架構設計師,負責該項目的架構設計工作。本文結合我在該項目…

虛擬主機與獨立服務器如何選擇

在搭建和維護網站時,選擇合適的服務器套餐至關重要。虛擬主機和獨立服務器是兩種常見的選擇,它們各有優缺點,適用于不同需求的用戶。本文將深入探討這兩種服務器類型的特點,以幫助您為您的網站選擇最合適的服務器解決方案。虛擬主…

NFC的安全技術體系

NFC(近場通信)技術因廣泛應用于移動支付、身份認證、門禁控制等敏感場景,其安全技術體系是保障用戶數據與交易安全的核心。該體系涵蓋數據傳輸安全、存儲安全、身份認證、防攻擊機制等多個維度,通過硬件隔離、加密算法、協議規范等…

Echarts3D柱狀圖-圓柱體-文字在柱體上垂直顯示的實現方法

全部代碼 <!DOCTYPE html> <html lang"en" style"height: 100%"> <head><meta charset"utf-8"><title>3D柱狀圖-圓柱體-文字豎排</title> </head> <body style"height: 100%; margin: 0"…

【算法訓練營Day08】字符串part2

文章目錄 反轉字符串里的單詞右旋字符串KMP算法雙指針法總結 反轉字符串里的單詞 題目鏈接&#xff1a;151. 反轉字符串中的單詞 雙指針法解題邏輯 head指針遍歷字符串遍歷到單詞首單詞&#xff0c;生成end指針移動到單詞尾部遇到完整單詞收集&#xff0c;壓入棧中head指針移動…

如何使用backtrace定位Linux程序的崩潰位置

在嵌入式Linux開發中&#xff0c;特別是復雜軟件&#xff0c;多人協作開發時&#xff0c;當某人無意間寫了一個代碼bug導致程序崩潰&#xff0c;但又不知道崩潰的具體位置時&#xff0c;單純靠走讀代碼&#xff0c;很難快速的定位問題。 本篇就來介紹一種方法&#xff0c;使用…

十大排序算法匯總

好的&#xff0c;下面為你整理一篇面試全覆蓋、極其深入的十大排序算法總結博客&#xff0c;涵蓋算法原理、復雜度、穩定性、應用場景、工程實踐、C與Python實現&#xff08;含詳細注釋&#xff09;&#xff0c;并對比分析各種排序的優缺點與適用情境。內容力求結構清晰、講解透…

零基礎 “入坑” Java--- 七、數組(二)

文章目錄 一、數組轉字符串二、數組的拷貝三、求數組中元素的平均值四、查找數組中指定元素&#xff08;順序查找&#xff09;五、數組排序&#xff08;冒泡排序&#xff09;六、查找數組中指定元素&#xff08;二分查找&#xff09;七、判斷兩個數組中的元素是否相等八、填充數…

【C++ 真題】P1104 生日

P1104 生日 題目描述 cjf 君想調查學校 OI 組每個同學的生日&#xff0c;并按照年齡從大到小的順序排序。但 cjf 君最近作業很多&#xff0c;沒有時間&#xff0c;所以請你幫她排序。 輸入格式 輸入共有 n 1 n 1 n1 行&#xff0c; 第 1 1 1 行為 OI 組總人數 n n n&…

Oracle DB和PostgreSQL,OpenGauss主外鍵一致性的區別

針對于unique索引在主外鍵上的表現&#xff0c;o和PG的行為確實不一致&#xff0c;測試樣例&#xff1a;PG:測試1&#xff1a;test# CREATE TABLE gdb_editingtemplates ( objectid INTEGER NOT NULL, globalid VARCHAR(38) DEFAULT {00000000-0000-0000-0000-000000000000} …