主頁 > 資料庫 > PostgreSQL VACUUM 之深入淺出 (一)

PostgreSQL VACUUM 之深入淺出 (一)

2022-02-25 06:46:12 資料庫

前言

VACUUM 是 PostgreSQL MVCC (Multiversion concurrency control) 實作的核心機制之一,是 PostgreSQL 正常運行的重要保證,本文將通過實體演示 PostgreSQL 為什么需要做 VACUUM,以及一步一步精準觸發 AUTOVACUUM, 到 VACUUM 優化實戰,深入淺出,一看就懂,

測驗環境準備

以下測驗是在 PostgreSQL 11 中進行,

通過以下 SQL 創建:

測驗用戶: alvin,普通用戶,非 superuser

測驗資料庫: alvindb,owner 是 alvin

測驗 schema: alvin,owner 也是 alvin

這里采用的是 user 與 schema 同名,結合默認的 search_path("$user", public),這樣操作物件(table, sequence, etc.)時就不需要加 schema 前綴了,

postgres=# CREATE USER alvin WITH PASSWORD 'alvin';
CREATE ROLE
postgres=# CREATE DATABASE alvindb OWNER alvin;
CREATE DATABASE
postgres=# \c alvindb
You are now connected to database "alvindb" as user "postgres".
alvindb=# CREATE SCHEMA alvin AUTHORIZATION alvin;
CREATE SCHEMA
alvindb=# \c alvindb alvin
You are now connected to database "alvindb" as user "alvin".
alvindb=> SHOW search_path;
   search_path   
-----------------
 "$user", public
(1 row)

PostgreSQL 為什么需要做 VACUUM

這要從 PostgreSQL MVCC UPDATE/DELETE 實作講起,

下面通過簡單演示 PostgreSQL 中 UPDATE/DELETE 時底層資料變化,揭秘其 MVCC 設計的藝術,

為了方便看其底層資料,通過 superuser postgres 創建 extension pageinspect:

$ psql -d alvindb -U postgres
alvindb=# CREATE EXTENSION IF NOT EXISTS pageinspect;
CREATE EXTENSION
alvindb=# \dx pageinspect
                              List of installed extensions
    Name     | Version | Schema |                      Description                      
-------------+---------+--------+-------------------------------------------------------
 pageinspect | 1.7     | public | inspect the contents of database pages at a low level
(1 row)

首先,創建測驗表

$ psql -d alvindb -U alvin
alvindb=> 
CREATE TABLE tb_test_vacuum (
    test_id BIGSERIAL PRIMARY KEY,
    test_num BIGINT
);
CREATE TABLE

插入 3 條測驗資料

alvindb=> INSERT INTO tb_test_vacuum(test_num) SELECT gid FROM generate_series(1,3,1) gid;
INSERT 0 3
alvindb=> SELECT * FROM tb_test_vacuum ORDER BY 1 DESC LIMIT 5;
 test_id | test_num 
---------+----------
       3 |        3
       2 |        2
       1 |        1
(3 rows)

查看其底層資料,

alvindb=> SELECT * FROM heap_page_items(get_raw_page('alvin.tb_test_vacuum', 0)) LIMIT 10;
ERROR:  must be superuser to use raw functions

可以看到底層資料只有 superuser 才可以查看,這里另打開一個視窗,用 superuser 用戶 postgres 查看

psql -d alvindb -U postgres
alvindb=# SELECT * FROM heap_page_items(get_raw_page('alvin.tb_test_vacuum', 0)) LIMIT 10;

這里 t_xmin 為其插入時 transaction id,

下面洗掉 2 條資料:

alvindb=> DELETE FROM tb_test_vacuum WHERE test_id = 2;
DELETE 1
alvindb=> DELETE FROM tb_test_vacuum WHERE test_id = 3;
DELETE 1
alvindb=> SELECT * FROM tb_test_vacuum ORDER BY 1 DESC LIMIT 5;
 test_id | test_num 
---------+----------
       1 |        1
(1 row)

此時在第二個視窗再看其底層資料

alvindb=> SELECT * FROM heap_page_items(get_raw_page('alvin.tb_test_vacuum', 0)) LIMIT 10;

這時你會發現,實際資料并未被洗掉,只是修改了 t_xmaxt_infomask2t_infomaskt_xmax 為洗掉時的 transaction id,t_infomask2t_infomask 為各種標志位,這里顯示的是其二進制轉換后的十進制,

為什么不直接物理洗掉資料呢?

主要是出于以下考慮:

這些被洗掉的資料可能還在被其他事務訪問,所以不能直接洗掉,這就是所謂的 MVCC 中的 multi version,即多版本,不同事務訪問的可能是不同版本的資料,transaction id 可以理解為版本號,其他事務可能還在訪問 t_xmax 為 15400741 或 15400742 的資料,

為什么有的其他資料庫 MVCC 實作底層資料就不是這樣呢?

Oracle 中將要洗掉資料轉移到了 UNDO tablespace 中,供其他事務訪問,以實作 MVCC,

PostgreSQL 為什么這么實作呢?

大家可以想一下,“轉移資料” 與 “改標志位”,哪個 cost 高呢?當然是 “改標志位” 既簡單又高效了!可見 PostgreSQL 設計之巧妙,

另外,PostgreSQL 這樣做還有一個好處,

Oracle DBA 都非常熟悉 ORA-01555: snapshot too old,其原因是 UNDO tablespace 大小畢竟是有限的,存盤的老版本資料也是有限的,Oracle 中解決 snapshot too old 一個辦法就是增大 UNDO tablespace,PostgreSQL 中這樣保留老版本資料,可以說磁盤有多大,“UNDO tablespace” 就有多大,就不會出現類似類似 snapshot too old 這樣的問題,

但凡事都有兩面性,

PostgreSQL 中這樣保留老版本資料有什么弊端呢?

老版本的資料是可能有其他事務需要訪問,但隨著時間的推移,這些事務終將結束,對應老版本的資料終將不被需要,它們將不斷占用甚至耗盡磁盤空間,使資料訪問變得很慢,這就是 PostgreSQL 中的 Bloat ,即膨脹,

PostgreSQL 中的 bloat 問題如何解決呢?

就是 VACUUM,可以理解為“回收空間”,

現在對表 alvin.tb_test_vacuum 進行 VACUUM 操作,

alvindb=> VACUUM VERBOSE tb_test_vacuum;
INFO:  vacuuming "alvin.tb_test_vacuum"
INFO:  scanned index "tb_test_vacuum_pkey" to remove 2 row versions
DETAIL:  CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
INFO:  "tb_test_vacuum": removed 2 row versions in 1 pages
DETAIL:  CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s
INFO:  index "tb_test_vacuum_pkey" now contains 1 row versions in 2 pages
DETAIL:  2 index row versions were removed.
0 index pages have been deleted, 0 are currently reusable.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
INFO:  "tb_test_vacuum": found 2 removable, 1 nonremovable row versions in 1 out of 1 pages
DETAIL:  0 dead row versions cannot be removed yet, oldest xmin: 15400744
There were 0 unused item pointers.
Skipped 0 pages due to buffer pins, 0 frozen pages.
0 pages are entirely empty.
CPU: user: 0.00 s, system: 0.00 s, elapsed: 0.00 s.
VACUUM

可以看到,VACUUM 不僅針對表資料,還包括索引,即不僅表資料可造成 Bloat (膨脹),索引也會,

pageinspect extension 除了可以用 heap_page_items 看底層資料,也可以通過 bt_page_items 看其索引底層資料,在此不再查看索引底層資料,感興趣可以執行如下 function 自行測驗,

SELECT * FROM bt_page_items('index_name', 1);

在第二個視窗重新查看表底層資料:

psql -d alvindb -U postgres
alvindb=# SELECT * FROM heap_page_items(get_raw_page('alvin.tb_test_vacuum', 0)) LIMIT 10;

可以看到,老版本資料已被清除,此時回收的空間新插入的資料使用,但并未回傳給作業系統,

如何將回收的空間真正回傳給作業系統呢?

就是 VACUUM FULL 操作:

alvindb=> VACUUM FULL VERBOSE tb_test_vacuum;
INFO:  vacuuming "alvin.tb_test_vacuum"
INFO:  "tb_test_vacuum": found 0 removable, 1 nonremovable row versions in 1 pages
DETAIL:  0 dead row versions cannot be removed yet.
CPU: user: 0.01 s, system: 0.01 s, elapsed: 0.08 s.
VACUUM

在第二個視窗查看表底層資料:

psql -d alvindb -U postgres
alvindb=# SELECT * FROM heap_page_items(get_raw_page('alvin.tb_test_vacuum', 0)) LIMIT 10;

可以看到,老版本資料已徹底回收了,

但要注意,生產環境需要謹慎使用 VACUUM FULL,因為它將在表上加 ACCESS EXCLUSIVE 鎖,即連 SELECT 也不可以,除非應用端可以計劃不訪問該表,

上面通過 DELETE 演示了為什么需要做 VACUUM,

那么 UPDATE 在 PostgreSQL 中是如何實作的呢?它會不會產生 Bloat (膨脹) 呢?

執行 UPDATE 操作如下:

alvindb=> UPDATE tb_test_vacuum SET test_num = 1 WHERE test_id = 1;
UPDATE 1

在第二個視窗查看表底層資料:

psql -d alvindb -U postgres
alvindb=# SELECT * FROM heap_page_items(get_raw_page('alvin.tb_test_vacuum', 0)) LIMIT 10;

可以看到,UPDATE 其實是 DELETE + INSERT,

為什么 PostgreSQL 如此實作 UPDATE 呢?

是因為 DELETE + INSERT 執行效率高?直接修改原資料不可以么?

因為老版本資料有可能還被其他事務需要!這是 MVCC 實作所需要的,

當然,相比 Oracle 中將老版本資料轉移到 UNDO tablespace, DELETE + INSERT 中的 DELETE 減少了 I/O,因為其只修改了標志位而已,

那么只有 UPDATE 和 DELETE 會產生 Bloat (膨脹) 嗎? INSERT 會嗎?

INSERT 不是只插入資料嗎?它怎么會產生 Bloat (膨脹) 呢?

接下來看下面的 case,

在事務中,ROLLBACK INSERT 的資料:

alvindb=> TRUNCATE tb_test_vacuum;
TRUNCATE TABLE
alvindb=> INSERT INTO tb_test_vacuum(test_num) SELECT gid FROM generate_series(1,1,1) gid;
INSERT 0 1
alvindb=> BEGIN;
BEGIN
alvindb=> INSERT INTO tb_test_vacuum(test_num) SELECT gid FROM generate_series(2,3,1) gid;
INSERT 0 2
alvindb=> ROLLBACK;
ROLLBACK
alvindb=> SELECT * FROM tb_test_vacuum ORDER BY 1 DESC LIMIT 5;
 test_id | test_num 
---------+----------
       8 |        1
(1 row)

在第二個視窗查看表底層資料:

psql -d alvindb -U postgres
alvindb=# SELECT * FROM heap_page_items(get_raw_page('alvin.tb_test_vacuum', 0)) LIMIT 10;

可以看到,在事務中,PostgreSQL 中 ROLLBACK 時并未洗掉已 INSERT 的資料,

進一步測驗 ROLLBACK UPDATE,

alvindb=> TRUNCATE tb_test_vacuum;
TRUNCATE TABLE
alvindb=> INSERT INTO tb_test_vacuum(test_num) SELECT gid FROM generate_series(1,1,1) gid;
INSERT 0 1
alvindb=> BEGIN;
BEGIN
alvindb=> SELECT * FROM tb_test_vacuum ORDER BY 1 DESC LIMIT 5;
 test_id | test_num 
---------+----------
      12 |        1
(1 row)
alvindb=> UPDATE tb_test_vacuum SET test_num = test_num + 1 WHERE test_id = 12; 
UPDATE 1
alvindb=> SELECT clock_timestamp();
        clock_timestamp        
-------------------------------
 2021-11-14 18:25:11.651518+08
(1 row)

此時在第二個視窗查看表底層資料:

接下來在第一個視窗 ROLLBACK:

alvindb=> ROLLBACK;
ROLLBACK
alvindb=> SELECT clock_timestamp();
        clock_timestamp        
-------------------------------
 2021-11-14 18:25:35.948455+08
(1 row)
alvindb=> SELECT * FROM tb_test_vacuum ORDER BY 1 DESC LIMIT 5;
 test_id | test_num 
---------+----------
      12 |        1
(1 row)

再在第二個視窗查看表底層資料:

如果反復測驗會發現,如果 COMMIT,其會修改標志位;如果 ROLLBACK ,PostgreSQL 什么也不做,因為標志位未修改,其仍不可見,即使 t_xmax 為 0,

相比 Oracle 中的 UPDATE 先將老版本中資料轉移到 UNDO,ROLLBACK 再利用 UNDO 中原資料恢復,PostgreSQL 中的 ROLLBACK 避免了兩次不必要的 IO,既提高了性能,又節省了時間

根據上面實驗,可以看到 UPDATE/DELETE/ROLLBACK 都有可能造成 Bloat (膨脹),如果頻繁更新的表長時間未做 VACUUM,VACUUM 完之后仍會占用很大空間,Bloat (膨脹) 仍然存在,生產又不能隨便做 VACUUM FULL 回收空間 ,

那么如何有效減少 Bloat (膨脹)?

在計劃內大量更新資料等情況,可以根據需要手動 VACUUM,這樣回收的空間可供下次大量更新資料使用,這樣可以有效減少 Bloat (膨脹),

VACUUM 除了回收空間,還有其他作用嗎?

transaction id (事務 id) 是 32 位的,即最多有 2 的 32 次方,即 4294967296 個事務 id,中國人口按 14 億算,一人也就能分配 3 個事務 id,所以 transaction id 范圍是非常有限的,那么 PostgreSQL 是如何解決這個問題的呢?

從下圖可以看出,PostgreSQL 是回圈利用 transaction id 的,這樣,transaction id 就無窮無盡的了,

以當前 transaction id 是 100 為例,大于 100 的約 21 億 個事務對事務 100 不可見,小于 100 的約 21 億 個事務對事務 100 可見,如果 transaction id 一直沒有回收,直至 transaction id 耗盡,就會產生 wraparound (回卷) 問題,原來可見的突然變得不可見了,資料就“憑空消失”了,

那么 VACUUM 是如何回收 transaction id 的?是通過 FREEZE 對所有事務可見的資料,由于篇幅有限,且實際作業中基本不需要對 FREEZE 相關引數進行優化,FREEZE 將通過另外一篇文章單獨講述,本文不對 FREEZE 展開,

應用程式一般會有頻繁的更新,不斷造成 Bloat (膨脹) 及消耗 transaction id,總不能都手動 VACUUM 吧?

有沒有自動的方式呢?當然!

優質文章推薦

PostgreSQL VACUUM 之深入淺出

華山論劍之 PostgreSQL sequence

[PG Upgrade Series] Extract Epoch Trap

[PG Upgrade Series] Toast Dump Error

GitLab supports only PostgreSQL now

MySQL or PostgreSQL?

PostgreSQL hstore Insight

ReIndex 失敗原因調查

PG 資料匯入 Hive 亂碼問題調查

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

標籤:其他

上一篇:iceberg合并小檔案沖突測驗

下一篇:Flutter:為什么我不能創建一個全為0值的DateTime物件?

標籤雲
其他(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