主頁 > 資料庫 > 詳解事務模式和Lua腳本,帶你吃透Redis 事務

詳解事務模式和Lua腳本,帶你吃透Redis 事務

2023-04-11 08:23:53 資料庫

摘要:Redis事務包含兩種模式:事務模式和Lua腳本,

本文分享自華為云社區《一文講透 Redis 事務》,作者: 勇哥java實戰分享,

準確的講,Redis事務包含兩種模式:事務模式和Lua腳本,

先說結論:

Redis的事務模式具備如下特點:

  • 保證隔離性;
  • 無法保證持久性;
  • 具備了一定的原子性,但不支持回滾;
  • 一致性的概念有分歧,假設在一致性的核心是約束的語意下,Redis 的事務可以保證一致性,

但Lua腳本更具備實用場景,它是另一種形式的事務,他具備一定的原子性,但腳本報錯的情況下,事務并不會回滾,Lua腳本可以保證隔離性,而且可以完美的支持后面的步驟依賴前面步驟的結果,

Lua腳本模式的身影幾乎無處不在,比如分布式鎖、延遲佇列、搶紅包等場景,

1 事務原理

Redis的事務包含如下命令:

事務包含三個階段:

  1. 事務開啟,使用 MULTI , 該命令標志著執行該命令的客戶端從非事務狀態切換至事務狀態 ;
  2. 命令入隊,MULTI 開啟事務之后,客戶端的命令并不會被立即執行,而是放入一個事務佇列 ;
  3. 執行事務或者丟棄,如果收到 EXEC 的命令,事務佇列里的命令將會被執行 ,如果是 DISCARD 則事務被丟棄,

下面展示一個事務的例子,

 redis> MULTI 
 OK
 redis> SET msg "hello world"
 QUEUED
 redis> GET msg
 QUEUED
 redis> EXEC
 1) OK
 1) hello world

這里有一個疑問?在開啟事務的時候,Redis key 可以被修改嗎?

在事務執行 EXEC 命令之前 ,Redis key 依然可以被修改,

在事務開啟之前,我們可以 watch 命令監聽 Redis key ,在事務執行之前,我們修改 key 值 ,事務執行失敗,回傳 nil ,

通過上面的例子,watch 命令可以實作類似樂觀鎖的效果 ,

2 事務的ACID

2.1 原子性

原子性是指:一個事務中的所有操作,或者全部完成,或者全部不完成,不會結束在中間某個環節,事務在執行程序中發生錯誤,會被回滾到事務開始前的狀態,就像這個事務從來沒有執行過一樣,

第一個例子:

在執行 EXEC 命令前,客戶端發送的操作命令錯誤,比如:語法錯誤或者使用了不存在的命令,

 redis> MULTI
 OK
 redis> SET msg "other msg"
 QUEUED
 redis> wrongcommand  ### 故意寫錯誤的命令
 (error) ERR unknown command 'wrongcommand' 
 redis> EXEC
 (error) EXECABORT Transaction discarded because of previous errors.
 redis> GET msg
 "hello world"

在這個例子中,我們使用了不存在的命令,導致入隊失敗,整個事務都將無法執行 ,

第二個例子:

事務操作入隊時,命令和操作的資料型別不匹配 ,入佇列正常,但執行 EXEC 命令例外 ,

 redis> MULTI 
 OK
 redis> SET msg "other msg"
 QUEUED
 redis> SET mystring "I am a string"
 QUEUED
 redis> HMSET mystring name  "test"
 QUEUED
 redis> SET msg "after"
 QUEUED
 redis> EXEC
 1) OK
 2) OK
 3) (error) WRONGTYPE Operation against a key holding the wrong kind of value
 4) OK
 redis> GET msg
 "after"

這個例子里,Redis 在執行 EXEC 命令時,如果出現了錯誤,Redis 不會終止其它命令的執行,事務也不會因為某個命令執行失敗而回滾 ,

綜上,我對 Redis 事務原子性的理解如下:

  1. 命令入隊時報錯, 會放棄事務執行,保證原子性;
  2. 命令入隊時正常,執行 EXEC 命令后報錯,不保證原子性;

也就是:Redis 事務在特定條件下,才具備一定的原子性 ,

2.2 隔離性

資料庫的隔離性是指:資料庫允許多個并發事務同時對其資料進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致資料的不一致,

事務隔離分為不同級別 ,分別是:

  • 未提交讀(read uncommitted)
  • 提交讀(read committed)
  • 可重復讀(repeatable read)
  • 串行化(serializable)

首先,需要明確一點:Redis 并沒有事務隔離級別的概念,這里我們討論 Redis 的隔離性是指:并發場景下,事務之間是否可以做到互不干擾,

我們可以將事務執行可以分為 EXEC 命令執行前和 EXEC 命令執行后兩個階段,分開討論,

  • EXEC 命令執行前

在事務原理這一小節,我們發現在事務執行之前 ,Redis key 依然可以被修改,此時,可以使用 WATCH 機制來實作樂觀鎖的效果,

  • EXEC 命令執行后

因為 Redis 是單執行緒執行操作命令, EXEC 命令執行后,Redis 會保證命令佇列中的所有命令執行完 , 這樣就可以保證事務的隔離性,

2.3 持久性

資料庫的持久性是指 :事務處理結束后,對資料的修改就是永久的,即便系統故障也不會丟失,

Redis 的資料是否持久化取決于 Redis 的持久化配置模式 ,

  1. 沒有配置 RDB 或者 AOF ,事務的持久性無法保證;
  2. 使用了 RDB模式,在一個事務執行后,下一次的 RDB 快斬訓未執行前,如果發生了實體宕機,事務的持久性同樣無法保證;
  3. 使用了 AOF 模式;AOF 模式的三種配置選項 no 、everysec 都會存在資料丟失的情況 ,always 可以保證事務的持久性,但因為性能太差,在生產環境一般不推薦使用,

綜上,redis 事務的持久性是無法保證的 ,

2.4 一致性

一致性的概念一直很讓人困惑,在我搜尋的資料里,有兩類不同的定義,

  • 維基百科

我們先看下維基百科上一致性的定義:

Consistency ensures that a transaction can only bring the database from one valid state to another, maintaining database invariants: any data written to the database must be valid according to all defined rules, including constraints, cascades, triggers, and any combination thereof. This prevents database corruption by an illegal transaction, but does not guarantee that a transaction is correct. Referential integrity guarantees the primary key – foreign key relationship.

在這段文字里,一致性的核心是“約束”,“any data written to the database must be valid according to all defined rules ”,

如何理解約束?這里參考知乎問題 如何理解資料庫的內部一致性和外部一致性,螞蟻金服 OceanBase 研發專家韓富晟回答的一段話:

“約束”由資料庫的使用者告訴資料庫,使用者要求資料一定符合這樣或者那樣的約束,當資料發生修改時,資料庫會檢查資料是否還符合約束條件,如果約束條件不再被滿足,那么修改操作不會發生,

關系資料庫最常見的兩類約束是“唯一性約束”和“完整性約束”,表格中定義的主鍵和唯一鍵都保證了指定的資料項絕不會出現重復,表格之間定義的參照完整性也保證了同一個屬性在不同表格中的一致性,

“ Consistency in ACID ”是如此的好用,以至于已經融化在大部分使用者的血液里了,使用者會在表格設計的時候自覺的加上需要的約束條件,資料庫也會嚴格的執行這個約束條件,

所以事務的一致性和預先定義的約束有關,保證了約束即保證了一致性,

我們細細品一品這句話: This prevents database corruption by an illegal transaction, but does not guarantee that a transaction is correct,

寫到這里可能大家還是有點模糊,我們舉經典轉賬的案例,

我們開啟一個事務,張三和李四賬號上的初始余額都是1000元,并且余額欄位沒有任何約束,張三給李四轉賬1200元,張三的余額更新為 -200 , 李四的余額更新為2200,

從應用層面來看,這個事務明顯不合法,因為現實場景中,用戶余額不可能小于 0 , 但是它完全遵循資料庫的約束,所以從資料庫層面來看,這個事務依然保證了一致性,

Redis 的事務一致性是指:Redis 事務在執行程序中符合資料庫的約束,沒有包含非法或者無效的錯誤資料,

我們分三種例外場景分別討論:

  1. 執行 EXEC 命令前,客戶端發送的操作命令錯誤,事務終止,資料保持一致性;
  2. 執行 EXEC 命令后,命令和操作的資料型別不匹配,錯誤的命令會報錯,但事務不會因為錯誤的命令而終止,而是會繼續執行,正確的命令正常執行,錯誤的命令報錯,從這個角度來看,資料也可以保持一致性;
  3. 執行事務的程序中,Redis 服務宕機,這里需要考慮服務配置的持久化模式,
  • 無持久化的記憶體模式:服務重啟之后,資料庫沒有保持資料,因此資料都是保持一致性的;
  • RDB / AOF 模式: 服務重啟后,Redis 通過 RDB / AOF 檔案恢復資料,資料庫會還原到一致的狀態,

綜上所述,在一致性的核心是約束的語意下,Redis 的事務可以保證一致性,

  • 《設計資料密集型應用》

這本書是分布式系統入門的神書,在事務這一章節有一段關于 ACID 的解釋:

Atomicity, isolation, and durability are properties of the database,whereas consistency (in the ACID sense) is a property of the application. The application may rely on the database’s atomicity and isolation properties in order to achieve consistency, but it’s not up to the database alone. Thus, the letter C doesn’t really belong in ACID.

原子性,隔離性和持久性是資料庫的屬性,而一致性(在 ACID 意義上)是應用程式的屬性,應用可能依賴資料庫的原子性和隔離屬性來實作一致性,但這并不僅取決于資料庫,因此,字母 C 不屬于 ACID ,

很多時候,我們一直在糾結的一致性,其實就是指符合現實世界的一致性,現實世界的一致性才是事務追求的最終目標,

為了實作現實世界的一致性,需要滿足如下幾點:

  1. 保證原子性,持久性和隔離性,如果這些特征都無法保證,那么事務的一致性也無法保證;
  2. 資料庫本身的約束,比如字串長度不能超過列的限制或者唯一性約束;
  3. 業務層面同樣需要進行保障 ,

2.5 事務特點

我們通常稱 Redis 為記憶體資料庫 , 不同于傳統的關系資料庫,為了提供了更高的性能,更快的寫入速度,在設計和實作層面做了一些平衡,并不能完全支持事務的 ACID,

Redis 的事務具備如下特點:

  • 保證隔離性;
  • 無法保證持久性;
  • 具備了一定的原子性,但不支持回滾;
  • 一致性的概念有分歧,假設在一致性的核心是約束的語意下,Redis 的事務可以保證一致性,

從工程角度來看,假設事務操作中每個步驟需要依賴上一個步驟回傳的結果,則需要通過 watch 來實作樂觀鎖 ,

3 Lua 腳本

3.1 簡介

Lua 由標準 C 撰寫而成,代碼簡潔優美,幾乎在所有作業系統和平臺上都可以編譯,運行,Lua 腳本可以很容易的被 C/C ++ 代碼呼叫,也可以反過來呼叫 C/C++ 的函式,這使得 Lua 在應用程式中可以被廣泛應用,

Lua 腳本在游戲領域大放異彩,大家耳熟能詳的《大話西游II》,《魔獸世界》都大量使用 Lua 腳本,Java 后端工程師接觸過的 api 網關,比如 Openresty ,Kong 都可以看到 Lua 腳本的身影,

從 Redis 2.6.0 版本開始, Redis內置的 Lua 解釋器,可以實作在 Redis 中運行 Lua 腳本,

使用 Lua 腳本的好處 :

  • 減少網路開銷,將多個請求通過腳本的形式一次發送,減少網路時延,
  • 原子操作,Redis會將整個腳本作為一個整體執行,中間不會被其他命令插入,
  • 復用,客戶端發送的腳本會永久存在 Redis 中,其他客戶端可以復用這一腳本而不需要使用代碼完成相同的邏輯,

Redis Lua 腳本常用命令:

3.2 EVAL 命令

命令格式:

 EVAL script numkeys key [key ...] arg [arg ...]

說明:

  • script是第一個引數,為 Lua 5.1腳本;
  • 第二個引數numkeys指定后續引數有幾個 key;
  • key [key ...],是要操作的鍵,可以指定多個,在 Lua 腳本中通過KEYS[1], KEYS[2]獲取;
  • arg [arg ...],引數,在 Lua 腳本中通過ARGV[1], ARGV[2]獲取,

簡單實體:

 redis> eval "return ARGV[1]" 0 100 
 "100"
 redis> eval "return {ARGV[1],ARGV[2]}" 0 100 101
 1) "100"
 2) "101"
 redis> eval "return {KEYS[1],KEYS[2],ARGV[1]}" 2 key1 key2 first second
 1) "key1"
 2) "key2"
 3) "first"
 4) "second"

下面演示下 Lua 如何呼叫 Redis 命令 ,通過redis.call()來執行了 Redis 命令 ,

 redis> set mystring 'hello world'
 OK
 redis> get mystring
 "hello world"
 redis> EVAL "return redis.call('GET',KEYS[1])" 1 mystring
 "hello world"
 redis> EVAL "return redis.call('GET','mystring')" 0
"hello world"

3.3 EVALSHA 命令

使用 EVAL 命令每次請求都需要傳輸 Lua 腳本 ,若 Lua 腳本過長,不僅會消耗網路帶寬,而且也會對 Redis 的性能造成一定的影響,

思路是先將 Lua 腳本先快取起來 , 回傳給客戶端 Lua 腳本的 sha1 摘要, 客戶端存盤腳本的 sha1 摘要 ,每次請求執行 EVALSHA 命令即可,

EVALSHA 命令基本語法如下:

 redis> EVALSHA sha1 numkeys key [key ...] arg [arg ...] 

實體如下:

 redis> SCRIPT LOAD "return 'hello world'"
 "5332031c6b470dc5a0dd9b4bf2030dea6d65de91"
 redis> EVALSHA 5332031c6b470dc5a0dd9b4bf2030dea6d65de91 0
 "hello world"

4 事務 VS Lua 腳本

從定義上來說, Redis 中的腳本本身就是一種事務, 所以任何在事務里可以完成的事, 在腳本里面也能完成, 并且一般來說, 使用腳本要來得更簡單,并且速度更快,

因為腳本功能是 Redis 2.6 才引入的, 而事務功能則更早之前就存在了, 所以 Redis 才會同時存在兩種處理事務的方法,

不過我們并不打算在短時間內就移除事務功能, 因為事務提供了一種即使不使用腳本, 也可以避免競爭條件的方法, 而且事務本身的實作并不復雜,

-- https://redis.io/

Lua 腳本是另一種形式的事務,他具備一定的原子性,但腳本報錯的情況下,事務并不會回滾,Lua 腳本可以保證隔離性,而且可以完美的支持后面的步驟依賴前面步驟的結果,

Lua 腳本模式的身影幾乎無處不在,比如分布式鎖、延遲佇列、搶紅包等場景,

不過在撰寫 Lua 腳本時,要注意如下兩點:

  1. 為了避免 Redis 阻塞,Lua 腳本業務邏輯不能過于復雜和耗時;
  2. 仔細檢查和測驗 Lua 腳本 ,因為執行 Lua 腳本具備一定的原子性,不支持回滾,

 

點擊關注,第一時間了解華為云新鮮技術~

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/549704.html

標籤:其它

上一篇:postgresSQL Extended Query執行程序和sharding-proxy的處理

下一篇:GreatSQL社區月報 | 2023.03

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more