主頁 > 資料庫 > 給技術新人的ODPS優化建議

給技術新人的ODPS優化建議

2023-04-13 07:58:58 資料庫

資料開發基本都是從陌生到熟悉,但是寫多了就會發現各種好用的工具/函式,也會發現各種坑,本文分享了作者從拿到資料到資料開發到資料監控的一些實操經驗,

寫在前面

本檔案是組內的一份演算法ODPS離線開發分享,僅列出了這些年積累下來的一些重要經驗和結論,特別是在演算法日常資料處理和調度中的技巧和配置方法,至于具體為什么,建議大家去阿里云官網查看底層map reduce以及data flow的作業原理,會有更加深刻的體會:)
參考檔案:https://help.aliyun.com/document_detail/89993.html

各種join的用法篇

輸入資料:zhule_a, zhule_b兩張測驗表,具體schema和資料如下(后續為了說明重復資料帶來的問題,會在a和b表中各重復插入一條key=2,ds='20220930'的資料):
read zhule_a;
key
ds
1
20220930
2
20220930
1
20221001
2
20221001
3
20221001

read zhule_b;

key
ds
2
20220930
3
20220930
1
20221001
2
20221001
3
20221001
4
20221001
5
20221001

 

Join/Inner Join
用法:Returns the rows that have matching column values in both the left table and the right table based on the join condition,一句話:找出兩個表中共同的部分,注意笛卡爾積下面的性能優化
1、每張表先選出來subset,然后再join,

-- better way to perform join, select small range of data first.
SELECT A.*, B.*
FROM
(SELECT * FROM A WHERE ds='20180101') A
JOIN
(SELECT * FROM B WHERE ds='20180101') B
ON a.key = b.key;
注意:在進行各種jion操作前,一定要自查左右表是否有重復資料,否則最終重復的結果會以笛卡爾積的數量增長,比如左右表各有兩條重復資料,那么join后重復資料會多達4條!
圖片
2、最好的情況下是大表join小表,然后利用mapjoin來實作,
官方解釋:In the map stage, MAPJOIN loads all data in the specified tables into the memory of the program that performs the JOIN operation. The tables specified for MAPJOIN must be small tables, and the total memory occupied by the table data cannot exceed 512 MB.
Limits on JOIN operations in MAPJOIN:
  • The left table in a LEFT OUTER JOIN operation must be a large table.

  • The right table in a RIGHT OUTER JOIN operation must be a large table.

  • MAPJOIN cannot be used in a FULL OUTER JOIN operation.

  • The left or right table in an INNER JOIN operation can be a large table.


SELECT  /*+ MAPJOIN(b) */
        a.*
FROM    test_a a
JOIN test_b b
ON      a.user_key = b.user_key
;
//就是在sql陳述句前加一個標記說這是mapjoin,把小表別名寫在括號里
一個有趣的點:
當我們用mapjoin時,除了正常的等式,mapjoin還支持不等式,如下面的例子:
圖片

 

Left Join

用法:A LEFT JOIN operation first takes the Cartesian product of the rows in Table A and Table B and returns all the rows of Table A and rows in Table B that meet the join condition. If the join condition finds no matching rows in Table B for a row in Table A, the row in Table A is returned in the result set with NULL values in each column from Table B.一句話:輸出左表的所有記錄,以及右表中符合關聯條件的資料,右表中不符合關聯條件的行,輸出NULL,
  1. 一定要保留左表的內容是,可以選擇用left join,例如加入key_attrs

  2. Right Join和Left Join沒有本質區別,建議定義好左表后都利用Left Join來執行

  3. 如果右表有重復資料的情況,那么最終left join的結果會有重復

圖片

 

Left Semi Join

用法:A LEFT SEMI JOIN operation returns only the rows in Table A that have a matching row in Table B. 對于左表中的一條資料,如果右表存在符合關聯條件的行,則輸出左表,否則不輸出
  1. 當右表沒有重復資料時,和Join是一致的,只會保留相同的列下來

  2. left semi join并不會回傳右表B中的任何資料,所以你沒法在where條件中指定關于右表B的任何篩選條件,下面得例子能夠有更加清晰的對比(例子參考于開源論壇):

employee (2 columns - e_id and e_name)
10, Tom
20, Jerry 
30, Emily

employee_department_mapping (2 columns - e_id and d_name)
10, IT
10, Sales
20, HR

-- inner join results
SELECT e.e_id, e.e_name, d.d_name FROM 
employee e INNER JOIN employee_department_mapping d
on e.e_id = d.e_id
-- results
10, Tom, IT
10, Tom, Sales
20, Jerry, HR

-- left semi join results
SELECT e.e_id, e.e_name, d.d_name FROM 
employee e LEFT SEMI JOIN employee_department_mapping d
on e.e_id = d.e_id
-- results
10, Tom, IT
20, Jerry, HR

 

Left Anti Join
用法:A LEFT ANTI JOIN operation returns only the rows in Table A that have no matching rows in Table B.一句話:對于左表中的一條資料,如果右表中不存在符合關聯條件的資料,則輸出左表,
  1. 最好用的場景就是找出兩表的差異部分;

  2. 演算法日常調度時可以用于每日新增修改商品的提取,將關鍵欄位放到ON條件中就行

圖片

 

Full Join

用法:A FULL JOIN operation takes the Cartesian product of the rows in Table A and Table B and returns all the rows in Table A and Table B, whether the join condition is met or not. In the result set, NULL values are returned in the columns from the table that lacks a matching row in the other table.一句話:輸出左表和右表的所有記錄,對于不符合關聯條件的資料,未關聯的另一側輸出NULL
  1. 在有增刪改情況下更新下游最新資料時,非常好用,但是知道的人比較少
舉個栗子,其中today_feat是今天新計算的feature table,yest_feat是上一個磁區的feature:

SELECT  COALESCE(a.main_image_url,b.main_image_url) AS main_image_url
        ,COALESCE(a.embedding,b.embedding) AS embedding
FROM    today_feat a
FULL JOIN yest_feat b
ON      a.main_image_url = b.main_image_url

其中full jion的效果如下,正好滿足new,old,updated feature的更新,配合COALESCE很絲滑:

圖片

合理設定Mapper和Reducepriority

 

set odps.instance.priority

目前ODPS更新后只能在開發dev空間生效,通過設定優先級能夠一定程度提升排隊任務的執行優先級,但是目前線上正式環境不會生效了,建議大家優化好自己健康分,同時對于重要的線上調度任務設定好基線,保證產出的時效,

 

set odps.sql.mapper.split.size

官方指導:Changes the input data amount of each Map worker, which is the split size of the input file. You can use this property to indirectly control the number of workers at each Map stage (default value: 256, unit: MB),一句話:如果小檔案很多,可以調大split.size的數值,這樣可以保證在有限資源下更容易申請到Mapper,提升執行的效率,如果資源豐富,想要更多Mapper資源,那就調小split.size的數值,可以申請到更多的Mapper,提升執行效率,酌情處理喲~
舉個栗子: 

-- original sql
CREATE TABLE if not EXISTS tmp_zhl_test LIFECYCLE 1 AS 
SELECT sig, venture, seller_id, COUNT(product_id) as cnt 
FROM sku_main_image_sig
WHERE LENGTH(sig) > 10 --some bad cases may have weird sigs like '#NEXT#'
GROUP BY sig, venture, seller_id
HAVING cnt>2
;
如果是默認設定,553 mappers 和 184 reducers 被分配,大約耗時 3m18s:
圖片
在資源充沛的情況下,我們設定odps.sql.mapper.split.size=64, 可以申請到更多的Mapper去處理檔案的分片,同時更多的reducer也可以被分配到,同樣的SQL代碼執行時間降為: 2m34s. 
同樣的,如果你的資料量超大,但是每條資料本身很小,同時空間資源也有限(畢竟現在資源管控比較嚴格),與其等待9999個Mapper被分配,你可以嘗試設定odps.sql.mapper.split.size=2048(甚至更大)去減少需要分配的Mapper數量,讓任務能夠快速執行:)

 

set odps.sql.reducer.instances

顯示設定reducer的數量(默認值從0到4000),不設定的話會根據任務動態分配,設定后就會分配設定數量的reducer,同樣是上面的例子,當我們設定odps.sql.reducer.instances=1000, 耗時變為2m

 

set odps.sql.mapper(reducer).memory

設定每個Map/Reducer worker的記憶體(默認值是1024,可以設定為256到12288之間的值)一般我們不需要特別設定這個值,但是當任務報錯并說「data exceeds the memory」時,可以根據個人情況來設定這個選項,

在Python UDF中使用第三方庫

在這部分主要和大家分享下如何在ODPS的python udf安裝需要的第三方庫(如numpy,opencv等),以及如果有不同依賴庫之間的版本不兼容問題時的有效解決方法,

 

Upload&Call Package

  • 需要下載第三方庫的安裝包xxx.whl,可以直接下載到自己的電腦上面,這樣可以在離線環境驗證多個版本的一致性(下面介紹),一般來說我們需要去看安裝包需要的python版本號以及兼容機器環境,一般來說都是cp37-cp37m or py2.py3-none-any在中間,然后末尾是x86_64的安裝包;

  • 本地直接將xxx.whl轉換為xxx.zip,利用命令「mv xxx.whl xxx.zip」就行

  • 將zip資源檔案上傳到ODPS對應的環境

  • 在你的UDF中,利用下面的代碼指定資源包的路徑和參考(直接copy就行)

def include_package_path(res_name, lib_name):    
    archive_files = get_cache_archive(res_name)
    dir_names = sorted([os.path.dirname(os.path.normpath(f.name)) for f in archive_files
                        if '.dist_info' not in f.name], key=lambda v: len(v))
    for dir_name in dir_names:
        if dir_name.endswith(lib_name):
            sys.path.insert(0, os.path.dirname(dir_name))
            break
        elif os.path.exists(os.path.join(dir_name, lib_name + '.py')):
            sys.path.insert(0, os.path.abspath(dir_name))
            break

class PostProcess(BaseUDTF):
    def __init__(self):
        include_package_path('opencv_python-3.4.0.zip','cv2')
        include_package_path('numpy-1.16.6.zip','numpy')
  • python UDF寫完后,就可以在創建函式里面的Resources里直接將你的資源名寫進去,這樣在流程啟動后,你的資源才會被有效呼叫起來,

圖片
  • python UDF默認的版本是2.x的,如果你的python版本是3.x,那么需要在ODPS運行前加入下面的指令;同時,部分功能是需要打開沙箱的,所以如果報錯的話,可以加入第二行的沙箱命令,
set odps.sql.python.version = cp37; --use python 3.7, default is 2.x version
set odps.isolation.session.enable = true; 

 

Solve Compatibility Issue

有時候在使用多個庫時,可能會出現不同版本之間的沖突問題(比如在使用opencv庫的時候,如果對應的numpy版本不兼容的話,就會報錯),所以在上傳多個庫的資源包前,需要先確認版本間的兼容性,一般非常不建議大家用不同版本去試,而應該先在本地確定版本后再上傳,可行的步驟如下:
  • 在本地可以用類似conda的工具搭建一個虛擬環境

  • 在本地用pip或者conda install來安裝你需要的三方庫

  • 查詢你下載的三方庫以及依賴庫的版本,比如python-opencv的話可以列印cv2.__version__

  • 把對應版本的xxx.whl包按照上面的方法現在下來并且上傳到ODPS資源中進行依賴

發布任務時的一些額外建議

  • 發布任務配置時,可以靈活使用exclude和extra來去掉或添加你想要的依賴,其中exclude可以去掉你中間產出的臨時表,而extra可以幫你增加雖然不在代碼里但是希望依賴的上游表(這在匯總不同上游表資料寫入下游對應磁區并且希望同時產出下游資料時很有用),
--exclude input or output tables (especially those tmp tables)--@exclude_input=lsiqg_iqc_sku_product_detection_result--@exclude_output=lsmp_sku_image_url_bizdate
-- include input or output tables (especially those separate venture tables)--@extra_input=lsiqg_iqc_sku_product_detection_result--@extra_output=lsmp_sku_image_url_bizdate
  • 如果在SQL代碼程序中你需要使用臨時表來過渡中間產出的資料(避免SQL嵌套過于嚴重,影響運行效率),建議一定在臨時表中加入一個時間戳,ex. lsiqg_iqc_input_tmp_${bizdate}不然在補資料或者遇到任務堵塞兩個任務同時在調度時,或產生overwrite的一系列問題,
  • 如果存在上游表存在多個磁區,但是每個磁區處理邏輯一樣的話(比如不同國家的磁區表處理邏輯其實一樣),非常建議在第一步里就把不同磁區表的資料匯總起來,可以重新增加一個磁區(如venture)來存放融合后的資料,如下示例:

INSERT OVERWRITE TABLE sku_main_image_sig PARTITION (ds = '${bizdate}',venture)
SELECT  id
        ,image_url
        ,venture
FROM    (
            SELECT  id
                    ,image_url
                    ,'ID' AS venture
            FROM    auction_image_id
            WHERE   ds = MAX_PT('auction_image_id')
            UNION
            SELECT  id
                    ,image_url
                    ,'PH' AS venture
            FROM    auction_image_ph
            WHERE   ds = MAX_PT('auction_image_ph')
            UNION
            SELECT  id
                    ,image_url
                    ,'VN' AS venture
            FROM    auction_image_vn
            WHERE   ds = MAX_PT('auction_image_vn')
            UNION
            SELECT  id
                    ,image_url
                    ,'SG' AS venture
            FROM    auction_image_sg
            WHERE   ds = MAX_PT('auction_image_sg')
            UNION
            SELECT  id
                    ,image_url
                    ,'MY' AS venture
            FROM    auction_image_my
            WHERE   ds = MAX_PT('auction_image_my')
            UNION
            SELECT  id
                    ,image_url
                    ,'TH' AS venture
            FROM    auction_image_th
            WHERE   ds = MAX_PT('auction_image_th')
        ) union_table
;
  • 對于重要的資料表,一定要設定監控,防止資料丟失、不正常產出等問題,具體的方法又可以分兩類:

    • 設定任務基線(baseline)來保證任務優先級,這樣調度的時間更有保障

    • 設定warning的短信/電話或者DQC的監控規則來具體監控資料

簡單的任務可以直接在任務中心查看詳情中設定:

圖片
圖片
對于更加細致的資料層面監控可以通過DQC平臺進行配置,比如無資料產出,資料波動,資料最大/最小值監控等,
圖片

寫在最后

資料開發基本都是從陌生到熟悉,但是寫多了就會發現各種好用的工具/函式,也會發現各種坑,個人拿到資料到資料開發到資料監控的一些經驗是:
  1. 拿到資料第一時間驗證資料的重復性,有效性;如果是組內問題就反饋,上游鏈路問題就自己過濾;

  2. 寫完資料的每一部分都先驗證合理性,這樣會提高最終資料的成功率;

  3. 一般節點上線后,會主動去觀察3-4天,確保輸出是符合預期的(如果會發現應該穩定的資料反而猛然增加or減少,那很可能是資料邏輯有問題);

  4. 定義合理的資料監控,可以避免資料為空,資料波動過大,資料欄位不合理等問題;

Enjoy Data Engineering!!

 

作者|周慧玲(逐樂)

本文來自博客園,作者:古道輕風,轉載請注明原文鏈接:https://www.cnblogs.com/88223100/p/ODPS-optimization-suggestions-for-technical-newcomers.html

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

標籤:MySQL

上一篇:云圖說|云資料庫GaussDB如何做到卓越性能

下一篇:sql 連續活躍天數

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