Redis的大key和熱key如何解決

文章目錄

  • Redis大Key
    • 一、什么是Redis大Key
    • 二、大Key的產生原因
    • 三、大Key的影響
    • 四、大Key的解決方案
      • 1. 檢測大Key
      • 2. 解決方案
        • (1) 數據拆分
        • (2) 使用壓縮算法
        • (3) 使用合適的數據結構
        • (4) 設置合理的過期時間
        • (5) 合理清理
        • (6) 配置優化
    • 五、預防措施
    • 總結
  • Redis熱key
    • 一、熱Key問題的本質
      • 1. 什么是熱Key
      • 2. 熱Key的危害
    • 二、熱Key的識別方法
      • 1. 使用Redis內置命令
      • 2. 使用slowlog分析
      • 3. 客戶端埋點統計
      • 4. 使用第三方工具
    • 三、熱Key問題的解決方案
      • 1. 本地緩存方案
      • 2. Key拆分方案
      • 3. 多級緩存方案
      • 4. 讀寫分離方案
      • 5. 數據分片方案
      • 6. 緩存永不過期方案
      • 7. 請求合并方案
    • 四、預防熱Key的最佳實踐
    • 五、云服務商的熱Key解決方案
      • 阿里云Redis
      • AWS ElastiCache
    • 六、總結

Redis大Key

在這里插入圖片描述

Redis大Key問題是Redis使用過程中常見的性能瓶頸之一,它會對Redis的性能、穩定性和資源利用率產生顯著影響。下面我將從大Key的定義、產生原因、影響以及解決方案幾個方面進行全面分析。

一、什么是Redis大Key

Redis大Key并沒有統一的固定標準,通常根據業務場景而定,主要分為以下幾種情況:

  1. 字符串類型(String):單個Key的Value特別大,一般認為在普通業務場景下,如果單個String類型的value大于1MB,或者在高并發低延遲場景中大于10KB,就可能被視為大Key

  2. 集合數據類型:如Hash、Set、ZSet、List等,其中的元素數量過多或總體數據量過大。例如,一個Hash類型Key的成員數量雖只有1000個,但這些成員的Value總大小達到100MB,或者一個ZSet類型的Key成員數量達到10000個

  3. 內存占用過高:比如阿里云Redis定義中,一個String類型的Key其值達到5MB,或一個ZSet類型的Key成員數量達到10000個,都被視為大Key

二、大Key的產生原因

大Key的產生通常有以下幾種原因:

  1. 業務設計不合理:最常見的原因是在沒有合理拆分的情況下,直接將大量數據(如大的JSON對象或二進制文件數據)存儲在一個鍵中

例如:

  • 緩存大數據(圖片和視頻元數據)

  • 明星或網紅粉絲列表

  • 商品頁所有信息

  1. 未能處理Value動態增長問題:隨著時間推移,如果持續向某個鍵的Value中添加數據,而又沒有相應的定期刪除機制、合理的過期策略或大小限制,Value的大小最終會增長到難以管理的程度

    • 不斷累積的微博粉絲列表、熱門評論或直播彈幕

    • 緩存時間設置不合理,導致數據不斷累積

      5

  2. 程序Bug:軟件開發中的錯誤可能導致某些鍵的生命周期超出預期,或者其包含的元素數量異常增長

    • 負責消費LIST類型鍵的業務代碼發生故障,導致該Key的成員只增不減

    • 數據結構使用不當,如List中重復添加數據

  3. 存儲大量數據的容器:如list、set等,隨著業務增長,數據量不斷增加

三、大Key的影響

大Key會對Redis系統產生多方面的負面影響:

  1. 讀取成本高:大Key由于體積大,讀取時會消耗更多的時間,增加延遲,尤其是在網絡傳輸中會占用更多帶寬

  2. 寫操作易阻塞:Redis采用單線程模型處理請求,操作大Key會阻塞其他命令的執行,導致整個Redis服務響應變慢

  3. 慢查詢與主從同步異常:大Key的讀寫操作時間長,可能觸發Redis的慢查詢日志記錄;在主從復制場景下,大Key的同步也會比小Key慢

  4. 內存問題:大Key占據大量內存空間,容易觸發Redis的內存淘汰策略,造成重要數據被意外移除;在極端情況下可能導致Redis實例因內存耗盡而崩潰(OOM)

  5. 集群架構下的內存資源不均衡:在Redis集群中,若某個分片上有大Key,該分片的內存使用率將遠高于其他分片,打破集群間內存使用的均衡狀態

  6. 持久化效率降低:AOF與RDB持久化操作會因大Key耗費更多時間

四、大Key的解決方案

1. 檢測大Key

在解決問題前,首先需要檢測和識別大Key:

  1. redis-cli --bigkeys:Redis自帶的命令,可以查詢當前Redis中所有key的信息,對整個數據庫中的鍵值對大小情況進行統計分析

    redis-cli --bigkeys
    
  2. MEMORY USAGE命令:Redis 4.0后推出的命令,可以返回指定key的內存使用情況

    MEMORY USAGE keyname
    
  3. RDB Tools:使用Redis RDB Tools等第三方工具分析RDB文件,找出大Key

    rdb -c memory dump.rdb --bytes 10240 -f bigkeys.csv
    
  4. Lua腳本遍歷:編寫Lua腳本遍歷所有Key并統計大Key

2. 解決方案

(1) 數據拆分

將大Key拆分成多個小Key是最常見的解決方案:

  • 按業務邏輯拆分:例如,對于一個包含全品類商品銷售數據的大Key,可以按照品類拆分為多個小的鍵

  • 按時間范圍拆分:對于時間序列數據,可以按照時間范圍進行拆分

  • 分片存儲:如將用戶訂單按用戶ID分桶存儲

示例代碼:

// 原始大Key存儲
RedisTemplate.opsForValue().set("bigKey", largeValue);// 拆分后的存儲
for (int i = 0; i < largeValue.size(); i++) {RedisTemplate.opsForValue().set("smallKey_" + i, largeValue.get(i));
}
(2) 使用壓縮算法

對于可以壓縮的數據類型(如字符串),可以使用壓縮算法來減少內存占用

Python示例:

import zlib
# 壓縮Value
compressed_value = zlib.compress(large_value)
# 存儲壓縮后的Value
redis.set("compressedKey", compressed_value)
# 解壓縮Value
original_value = zlib.decompress(redis.get("compressedKey"))
(3) 使用合適的數據結構
  • 選擇合適的Redis數據結構:例如,用Bitmap代替String記錄URL訪問情況 ,用HyperLogLog統計UV

  • 考慮使用其他存儲系統:對于不適合Redis存儲的大數據,可考慮轉移到分布式文件系統,只在Redis中保留元數據

(4) 設置合理的過期時間

如果大Key中的數據不是一直需要的,可以設置過期時間,讓Redis在一定時間后自動刪除該Key

(5) 合理清理
  • 異步刪除:使用UNLINK命令代替DEL命令異步刪除大Key

    UNLINK big_hash_key
    
  • 分批定時定量刪除:在低峰期分批刪除大Key,防止阻塞

(6) 配置優化

調整Redis配置參數優化內存使用

CONFIG SET hash-max-ziplist-entries 512
CONFIG SET hash-max-ziplist-value 64

五、預防措施

  1. 合理設計數據結構:在業務設計初期就應該避免生成大Key,僅緩存必要的數據字段

  2. 監控預警:建立對Redis的監控系統,實時監測大Key的出現和內存使用情況

  3. 版本控制:為每個Value加入版本號,以進行一致性檢查

  4. 定期維護:定期檢查并清理潛在的大Key

總結

Redis大Key問題會對系統性能產生多方面的影響,需要通過合理的檢測方法識別問題Key,并根據業務場景選擇合適的解決方案。最佳實踐是在系統設計階段就考慮數據規模的增長,避免大Key的產生,同時建立完善的監控機制,及時發現和處理潛在的大Key問題


Redis熱key

熱Key(Hot Key)是Redis使用過程中常見的一個性能問題,指在短時間內被大量訪問的單個Key或多個Key,可能導致Redis服務器負載不均、性能下降甚至服務不可用。

一、熱Key問題的本質

1. 什么是熱Key

熱Key是指那些訪問頻率顯著高于其他Key的特定Key,通常表現為:

  • 單個Key的QPS(每秒查詢量)遠高于平均水平
  • 對某個Key的訪問量占整體訪問量的很大比例
  • 由于訪問集中導致Redis單線程處理瓶頸

2. 熱Key的危害

  1. 性能瓶頸:Redis單線程模型下,熱Key可能導致其他請求排隊
  2. CPU負載高:處理大量相同Key請求消耗CPU資源
  3. 網絡帶寬壓力:大量相同數據的重復傳輸
  4. 數據傾斜:在集群模式下導致某些節點負載過高
  5. 緩存擊穿:熱Key突然失效可能導致大量請求直達數據庫

二、熱Key的識別方法

1. 使用Redis內置命令

# 使用redis-cli的hotkeys功能(Redis 4.0+)
redis-cli --hotkeys# 使用monitor命令臨時監控(謹慎使用,影響性能)
redis-cli monitor | grep "GET\|HGET\|SMEMBERS"

2. 使用slowlog分析

# 配置slowlog
redis-cli config set slowlog-log-slower-than 1000  # 記錄執行超過1ms的命令
redis-cli config set slowlog-max-len 1000         # 保留1000條記錄# 查看slowlog
redis-cli slowlog get

3. 客戶端埋點統計

// 示例:使用AOP統計Key訪問頻率
@Aspect
@Component
public class RedisKeyMonitorAspect {private ConcurrentHashMap<String, AtomicLong> keyAccessCount = new ConcurrentHashMap<>();@Around("execution(* com.xxx.RedisService.*(..))")public Object monitorKeyAccess(ProceedingJoinPoint pjp) throws Throwable {String key = parseRedisKey(pjp.getArgs());keyAccessCount.computeIfAbsent(key, k -> new AtomicLong(0)).incrementAndGet();return pjp.proceed();}// 定期輸出熱Key統計@Scheduled(fixedRate = 60000)public void reportHotKeys() {keyAccessCount.entrySet().stream().sorted((e1, e2) -> Long.compare(e2.getValue().get(), e1.getValue().get())).limit(10).forEach(e -> System.out.println("HotKey: " + e.getKey() + " - " + e.getValue()));}
}

4. 使用第三方工具

  • RedisInsight:Redis官方可視化工具
  • CacheCloud:搜狐開源的Redis監控平臺
  • Prometheus + Grafana:配合Redis exporter監控

三、熱Key問題的解決方案

1. 本地緩存方案

適用場景:讀多寫少、數據一致性要求不嚴格的場景

// 使用Guava Cache實現本地緩存
LoadingCache<String, Object> localCache = CacheBuilder.newBuilder().maximumSize(10000).expireAfterWrite(10, TimeUnit.SECONDS)  // 10秒過期.build(new CacheLoader<String, Object>() {@Overridepublic Object load(String key) throws Exception {// 從Redis獲取數據return redisTemplate.opsForValue().get(key);}});// 使用示例
public Object getData(String key) {try {return localCache.get(key);} catch (ExecutionException e) {// 異常處理return null;}
}

注意事項

  • 設置合理的過期時間,避免本地緩存與Redis數據不一致
  • 考慮使用消息隊列通知本地緩存失效
  • 監控本地緩存命中率

2. Key拆分方案

適用場景:大Value的熱Key

// 將一個大Key拆分為多個子Key
public void setBigData(String bigKey, BigData data) {// 拆分為多個子KeyMap<String, String> parts = splitBigData(data);// 使用pipeline批量寫入redisTemplate.executePipelined((RedisCallback<Object>) connection -> {parts.forEach((subKey, value) -> {connection.set(("bigkey:"+bigKey+":"+subKey).getBytes(), value.getBytes());});return null;});
}public BigData getBigData(String bigKey) {// 獲取所有子KeySet<String> subKeys = redisTemplate.keys("bigkey:"+bigKey+":*");// 批量獲取List<Object> values = redisTemplate.executePipelined((RedisCallback<Object>) connection -> {subKeys.forEach(key -> connection.get(key.getBytes()));return null;});// 合并結果return mergeValues(values);
}

3. 多級緩存方案

架構示例

客戶端 → 本地緩存 → Redis集群 → 數據庫

實現要點

  1. 第一級:客戶端內存緩存(短時間,如1秒)
  2. 第二級:Redis集群
  3. 第三級:持久化存儲

4. 讀寫分離方案

配置Redis主從復制

# 在從節點配置
replica-read-only yes

客戶端實現

public class RedisReadWriteClient {private Jedis master;private List<Jedis> replicas;private AtomicInteger counter = new AtomicInteger(0);// 讀操作路由到從節點public String get(String key) {Jedis replica = getNextReplica();return replica.get(key);}// 寫操作使用主節點public void set(String key, String value) {master.set(key, value);}private Jedis getNextReplica() {int index = counter.incrementAndGet() % replicas.size();return replicas.get(index);}
}

5. 數據分片方案

Redis Cluster自動分片

# 創建集群(3主3從)
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 \
--cluster-replicas 1

客戶端分片示例

public class ShardedRedisClient {private List<Jedis> nodes;public void set(String key, String value) {getNode(key).set(key, value);}public String get(String key) {return getNode(key).get(key);}private Jedis getNode(String key) {// 使用一致性哈希選擇節點int hash = Math.abs(key.hashCode());return nodes.get(hash % nodes.size());}
}

6. 緩存永不過期方案

適用場景:配置類數據,極少變更

// 設置Key永不過期
redisTemplate.opsForValue().set("config:key", "value");// 后臺更新邏輯
public void updateConfig(String key, Object value) {// 1. 更新數據庫db.updateConfig(key, value);// 2. 更新RedisredisTemplate.opsForValue().set("config:"+key, value);// 3. 發送消息通知其他服務更新messageQueue.publish("config.update", key);
}

7. 請求合并方案

使用Google Guava的RateLimiter

private RateLimiter limiter = RateLimiter.create(1000); // 每秒1000個請求public Object getData(String key) {if (limiter.tryAcquire()) {return redisTemplate.opsForValue().get(key);} else {// 返回緩存中的舊數據或默認值return getCachedValue(key);}
}

四、預防熱Key的最佳實踐

  1. 設計階段預防

    • 避免使用全局計數器等容易成為熱點的設計
    • 對可能的熱點數據提前規劃拆分方案
  2. 監控報警

    # 監控單個Key的QPS
    while true; doredis-cli info stats | grep total_commands_processedsleep 1
    done
    
  3. 壓力測試

    • 使用redis-benchmark模擬高并發
    redis-benchmark -t get,set -n 100000 -r 100000 -d 100
    
  4. Key命名規范

    • 業務前綴:數據類型:唯一標識 如 user:info:1001
    • 避免使用過長的Key名
  5. 數據過期策略

    • 對熱Key設置合理的過期時間
    • 采用隨機過期時間避免集中失效

五、云服務商的熱Key解決方案

阿里云Redis

  1. 性能洞察功能:自動識別熱Key
  2. 代理查詢緩存:在Proxy層緩存熱Key結果
  3. 讀寫分離版:自動將讀請求路由到從節點

AWS ElastiCache

  1. Auto Scaling:根據負載自動擴展
  2. Enhanced Monitoring:提供詳細的Key統計
  3. Read Replicas:配置多個只讀副本

六、總結

解決Redis熱Key問題需要綜合考慮業務場景、數據特性和系統架構,主要解決方案包括:

  1. 本地緩存:減少對Redis的直接訪問
  2. Key拆分:將大Key/熱Key拆分為多個子Key
  3. 多級緩存:構建分層緩存體系
  4. 讀寫分離:利用從節點分擔讀壓力
  5. 數據分片:將負載分散到不同節點
  6. 請求合并:減少重復請求

實際應用中,通常需要組合使用多種方案。例如,對商品詳情頁的熱點數據可以同時采用:

  • 本地緩存(短時間)
  • Redis多級緩存
  • 讀寫分離
  • 監控報警

最后,熱Key問題的解決不是一勞永逸的,需要持續監控并根據業務變化調整策略。建立完善的監控體系和應急預案,才能在熱Key出現時快速響應,保障系統穩定運行。

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

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

相關文章

恒溫晶振與溫補晶振的區別

在電子設備領域&#xff0c;晶振如同精準的“心臟起搏器”&#xff0c;為電路提供穩定的時鐘信號。恒溫晶振&#xff08;OCXO&#xff09;和溫補晶振&#xff08;TCXO&#xff09;作為兩類重要的晶體振蕩器&#xff0c;在不同的應用場景中發揮著關鍵作用&#xff0c;它們的區別…

基于SpringBoot的在線考試智能監控系統設計與實現

目錄 一.&#x1f981;前言二.&#x1f981;開源代碼與組件使用情況說明三.&#x1f981;核心功能1. ?算法設計2. ?Java開發語言3. ?Vue.js框架4. ?部署項目 四.&#x1f981;演示效果1. 管理員模塊1.1 用戶管理 2. 教師模塊2.1 考試管理2.2 瀏覽試題列表2.3 添加試題2.4 成…

0基礎學Python系列【16】自動化郵件發送的終極教程:Python庫smtplib與email詳解

大家好,歡迎來到Python學習的第二站!?? Python自帶了一些超好用的模塊,可以讓你不必從頭寫代碼就能實現很多功能。比如數學計算、文件操作、網絡通信等。花姐會挑選常用的一些模塊來講解,確保你能在實際項目中用到。?? 本章要學什么? 接下來花姐會深入淺出的講解下面…

環衛車輛定位與監管:安心聯車輛監控管理平臺--科技賦能城市環境衛生管理

一、 引言 城市環境衛生是城市文明的重要標志&#xff0c;也是城市管理的重要內容。隨著城市化進程的加快&#xff0c;環衛作業范圍不斷擴大&#xff0c;環衛車輛數量不斷增加&#xff0c;傳統的管理模式已難以滿足現代化城市管理的需求。為提高環衛作業效率&#xff0c;加強環…

GIS 數據質檢:驗證 Geometry 有效性

前言 在GIS開發中&#xff0c;數據的幾何有效性直接影響分析結果的準確性。無效的幾何&#xff08;如自相交、空洞或坐標錯誤&#xff09;可能導致空間計算失敗或輸出偏差。無論是Shapefile、GeoJSON還是數據庫中的空間數據&#xff0c;幾何質檢都是數據處理中不可忽視的關鍵步…

AI大模型學習之基礎數學:高斯分布-AI大模型概率統計的基石

&#x1f9d1; 博主簡介&#xff1a;CSDN博客專家、CSDN平臺優質創作者&#xff0c;高級開發工程師&#xff0c;數學專業&#xff0c;10年以上C/C, C#, Java等多種編程語言開發經驗&#xff0c;擁有高級工程師證書&#xff1b;擅長C/C、C#等開發語言&#xff0c;熟悉Java常用開…

HarmonyOS性能優化——耗時操作減少

耗時操作減少 在應用開發中&#xff0c;避免主線程執行冗余和耗時操作至關重要。這可以降低主線程負載&#xff0c;提升UI響應速度。 避免主線程冗余操作 冗余操作是不必要的、重復執行且對程序功能無實質性貢獻的操作。這些操作浪費計算資源&#xff0c;降低程序運行效率&a…

emscripten 編譯 wasm 版本的 openssl

搭建emscripten環境【參考&#xff1a;https://emscripten.org/docs/getting_started/downloads.html】 下載openssl解壓復制到emsdk目錄 依次執行下列命令&#xff1a; cd emsdk #激活emsdk source ./emsdk_env.shcd opensslemconfigure ./Configure linux-x32 -no-asm -sta…

uniapp 實戰新聞頁面(一)

新聞系統 一、 創建項目 創建個人中心 page.json 配置 tabar "tabBar": {"color":"#666","selectedColor": "#31C27C","list": [{"text": "首頁","pagePath": "pages/inde…

JAVA鎖機制:對象鎖與類鎖

JAVA鎖機制&#xff1a;對象鎖與類鎖 在多線程編程中&#xff0c;合理使用鎖機制是保證數據一致性和線程安全的關鍵。本文將通過示例詳細講解 Java 中的對象鎖和類鎖的原理、用法及區別。 一、未加鎖的并發問題 先看一段未加鎖的代碼&#xff1a; public class Synchronize…

maxcomputer 和 hologres中的EXTERNAL TABLE 和 FOREIGN TABLE

在阿里云的大數據和實時數倉產品中&#xff0c;MaxCompute 和 Hologres 都支持類似于 EXTERNAL TABLE 和 FOREIGN TABLE 的機制&#xff0c;但它們的實現和語義有所不同。 下面分別說明&#xff1a; ?? 一、MaxCompute 中的 EXTERNAL TABLE 和 FOREIGN TABLE 1. EXTERNAL T…

穩定幣:從支付工具到金融基礎設施的技術演進與全球競爭新格局

引言&#xff1a;穩定幣的崛起與金融體系重構 2025年6月&#xff0c;全球穩定幣市值突破2500億美元歷史大關&#xff0c;單年鏈上交易額高達35萬億美元——這一數字已超越Visa和萬事達卡交易總和。這一里程碑事件標志著穩定幣已從加密貨幣市場的邊緣實驗&#xff0c;蛻變為重構…

用 HTML、CSS 和 jQuery 打造多頁輸入框驗證功能

多頁輸入框驗證功能總結:使用 HTML、CSS 和 jQuery 實現 一、多頁表單驗證的核心概念與應用場景 多頁輸入框驗證是指將復雜表單拆分為多個頁面或步驟,逐步引導用戶完成輸入,并在每一步對用戶輸入進行驗證的功能。這種設計具有以下優勢: 提升用戶體驗:避免長表單帶來的心…

DeepSpeed 深度學習學習筆記:高效訓練大型模型

主要參考官網文檔&#xff0c;對于具體內容還需參考官方文檔 1. 引言&#xff1a;為什么需要 DeepSpeed&#xff1f; 大型模型訓練的挑戰 隨著深度學習模型規模的爆炸式增長&#xff08;從 BERT 的幾億參數到 GPT-3 的千億參數&#xff0c;再到現在的萬億參數模型&#xff09…

編程基礎:耦合

能幫到你的話&#xff0c;就給個贊吧 &#x1f618; 文章目錄 耦合&#xff1a;功能的單一性&#xff0c;功能越拆分則單一功能越好維護 耦合&#xff1a;功能的單一性&#xff0c;功能越拆分則單一功能越好維護

基于Qt的UDP主從服務器設計與實現

概述 一個基于Qt框架實現的UDP主從服務器系統&#xff0c;該系統具備自動主機選舉、故障轉移和狀態同步等關鍵功能&#xff0c;適用于分布式能源管理系統中的設備通信與協調。 系統核心功能 1. 自動主機選舉與故障轉移 系統通過優先級機制實現自動主機選舉&#xff0c;當主機…

【51單片機2位數碼管100毫秒的9.9秒表】2022-5-16

緣由 這一題剛設計好要去回復就看到結帖了&#xff0c;好似看到我設計完成就盜竊去了&#xff0c;如此下面類似題目很容易也懶得回復了。 #include "reg52.h" sbit k0P3^0; sbit k1P3^1; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111};//0-9 uns…

安裝ClickHouse

安裝ClickHouse ClickHouse是一個用于聯機分析的列式數據庫管理系統&#xff0c;主要用于在線分析處理查詢&#xff08;OLAP&#xff09;&#xff0c;能夠使用SQL查詢實時生成分析數據報告。 ClickHouse是一個完全的列式數據庫管理系統&#xff0c;允許在運行時創建表和數據庫&…

PX4無人機集成自帶的深度相機進行gazebo仿真

修改mavros_posix_sitl.launch文件 修改以下兩行代碼 <arg name"my_model" default"iris_depth_camera"/><arg name"sdf" default"$(find mavlink_sitl_gazebo)/models/$(arg my_model)/$(arg my_model).sdf"/>iris_dept…

正點原子STM32cubeide學習——TFTLCD(MCU 屏)實驗

使用的是正點原子的精英版&#xff0c;單片機是STM32F103ZET6&#xff0c;使用開發板的 MCU 屏接口連接正點原子 TFTLCD 模塊(僅限 MCU 屏模塊)&#xff0c;實現 TFTLCD 模塊的顯示。通過把 LCD 模塊插入底板上的 TFTLCD 模塊接口&#xff0c;按下復位之后&#xff0c; 就可以看…