Android學習總結之Glide自定義三級緩存(實戰篇)

一、為什么需要三級緩存

內存緩存(Memory Cache)

內存緩存旨在快速顯示剛瀏覽過的圖片,例如在滑動列表時來回切換的圖片。在 Glide 中,內存緩存使用 LruCache 算法(最近最少使用),能自動清理長時間未使用的圖片,以此確保內存的合理利用。通常,內存緩存限制在手機可用內存的 15%。舉例來說,若手機擁有 8GB 內存,內存緩存大約為 1.2GB。同時,為了進一步優化,圖片會按屏幕尺寸進行壓縮,比如原圖為 2000px,而手機屏幕為 1000px,那么只存儲 1000px 版本的圖片。當內存緩存超出限制時,會自動清理超出部分的圖片。

代碼實現

import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.load.engine.cache.LruResourceCache;
import com.bumptech.glide.module.AppGlideModule;public class CustomGlideModule extends AppGlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {// 獲取設備的最大內存int maxMemory = (int) Runtime.getRuntime().maxMemory();// 計算內存緩存的大小,這里設置為最大內存的15%int memoryCacheSize = maxMemory / 1024 / 1024 * 15;// 創建LruResourceCache對象builder.setMemoryCache(new LruResourceCache(memoryCacheSize));}
}

磁盤緩存(Disk Cache)

磁盤緩存用于存儲常用但當前不在內存中的圖片,像用戶經常訪問的商品詳情頁圖片。Glide 通過 DiskLruCache 將圖片存儲在手機硬盤上,總容量一般設置為 100MB,并且優先存儲高質量圖片。為了優化存儲,圖片按 URL 哈希值命名文件,這樣可以避免重復存儲相同圖片。同時,對于超過 7 天未使用的圖片,會自動進行清理。

代碼實現

import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.load.engine.cache.DiskLruCacheFactory;
import com.bumptech.glide.module.AppGlideModule;public class CustomDiskCacheGlideModule extends AppGlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {// 設置磁盤緩存的路徑String diskCachePath = context.getCacheDir().getPath() + "/glide_cache";// 設置磁盤緩存的大小為100MBint diskCacheSize = 1024 * 1024 * 100;// 創建DiskLruCacheFactory對象builder.setDiskCache(new DiskLruCacheFactory(diskCachePath, diskCacheSize));}
}

網絡緩存(Network Cache)

網絡緩存的作用是避免重復從服務器下載相同圖片,這需要結合 HTTP 緩存頭來實現。Glide 借助 OkHttp 的緩存機制,將圖片存儲在路由器或基站緩存中,總容量設置為 50MB,優先存儲高頻訪問的圖片。通過根據 HTTP 的 Cache-Control 頭設置緩存時間(例如設置為 1 天),以及在圖片 URL 中添加版本號(如 image_v2.jpg),當版本更新時強制重新下載,從而實現高效的網絡緩存管理。

代碼實現

import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.module.AppGlideModule;
import okhttp3.Cache;
import okhttp3.OkHttpClient;import java.io.InputStream;public class CustomNetworkCacheGlideModule extends AppGlideModule {@Overridepublic void registerComponents(Context context, Glide glide, Registry registry) {// 設置網絡緩存的路徑Cache cache = new Cache(context.getCacheDir(), 1024 * 1024 * 50);// 創建OkHttpClient對象并設置緩存OkHttpClient client = new OkHttpClient.Builder().cache(cache).build();// 注冊OkHttpUrlLoader,讓Glide使用OkHttp進行網絡請求registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));}
}

整合代碼:?

import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.load.engine.cache.LruResourceCache;
import com.bumptech.glide.module.AppGlideModule;/*** 自定義Glide內存緩存配置* 通過LruCache算法實現最近最少使用的圖片自動回收*/
public class CustomGlideModule extends AppGlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {// 獲取應用可使用的最大內存(單位:字節)int maxMemory = (int) Runtime.getRuntime().maxMemory();// 計算內存緩存大小(15%的可用內存)int memoryCacheSize = maxMemory / 1024 / 1024 * 15;// 創建LruResourceCache并設置緩存大小builder.setMemoryCache(new LruResourceCache(memoryCacheSize));}
}import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.load.engine.cache.DiskLruCacheFactory;
import com.bumptech.glide.module.AppGlideModule;/*** 自定義Glide磁盤緩存配置* 使用DiskLruCache將圖片持久化到本地存儲*/
public class CustomDiskCacheGlideModule extends AppGlideModule {@Overridepublic void applyOptions(Context context, GlideBuilder builder) {// 設置磁盤緩存路徑(應用緩存目錄下的glide_cache文件夾)String diskCachePath = context.getCacheDir().getPath() + "/glide_cache";// 設置磁盤緩存大小(100MB)int diskCacheSize = 1024 * 1024 * 100;// 創建DiskLruCache工廠并設置路徑和大小builder.setDiskCache(new DiskLruCacheFactory(diskCachePath, diskCacheSize));}
}import android.content.Context;
import com.bumptech.glide.Glide;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.integration.okhttp3.OkHttpUrlLoader;
import com.bumptech.glide.load.model.GlideUrl;
import com.bumptech.glide.module.AppGlideModule;
import okhttp3.Cache;
import okhttp3.OkHttpClient;import java.io.InputStream;/*** 自定義Glide網絡緩存配置* 結合OkHttp實現HTTP級別的網絡緩存*/
public class CustomNetworkCacheGlideModule extends AppGlideModule {@Overridepublic void registerComponents(Context context, Glide glide, Registry registry) {// 創建OkHttp緩存(50MB,位于應用緩存目錄)Cache cache = new Cache(context.getCacheDir(), 1024 * 1024 * 50);// 構建帶緩存的OkHttpClientOkHttpClient client = new OkHttpClient.Builder().cache(cache).build();// 注冊OkHttp為Glide的網絡請求引擎registry.replace(GlideUrl.class, InputStream.class, new OkHttpUrlLoader.Factory(client));}
}

常見問題解決方案

  1. 緩存穿透:緩存穿透指查詢一個一定不存在的數據,由于緩存不命中需要從數據庫查詢,查不到數據則不寫入緩存,導致該不存在的數據每次請求都要到數據庫查詢,給數據庫帶來壓力。在 Glide 中,可以通過設置錯誤占位圖、加載占位圖和空值占位圖來解決部分問題。例如:
Glide.with(context).load(url).error(R.drawable.ic_error) // 設置錯誤占位圖.placeholder(R.drawable.ic_loading) // 設置加載占位圖.fallback(R.drawable.ic_fallback) // 設置空值占位圖.into(imageView);

在大廠面試中,關于緩存穿透常被問到的問題有:“請簡述緩存穿透的概念以及可能的解決方案”。回答時,除了像上述代碼那樣通過 Glide 的占位圖設置來應對外,還可以提及如使用布隆過濾器(Bloom Filter)等方案。布隆過濾器是一種空間效率極高的概率型數據結構,它利用位數組和哈希函數來判斷一個元素是否在一個集合中。將所有已存在的數據 key 放入布隆過濾器中,當新的請求到來時,先通過布隆過濾器判斷該 key 是否存在。如果不存在,直接返回,避免查詢數據庫,從而有效減少不必要的數據庫查詢,提高系統性能。

  1. 緩存雪崩:緩存雪崩是指在某一時刻,大量緩存同時失效,導致大量請求直接訪問數據庫,造成數據庫壓力過大甚至崩潰。可以通過設置不同的緩存過期時間來避免,例如:
int cacheDuration = TimeUnit.HOURS.toMillis(24) + new Random().nextInt(3600000);

面試中可能會被問到:“如何防止緩存雪崩的發生”。除了上述設置隨機過期時間的方法外,還可以采用二級緩存策略,即設置主緩存和備用緩存。主緩存失效后,先從備用緩存獲取數據,同時對主緩存進行異步更新,這樣可以在一定程度上緩解大量請求直接沖擊數據庫的問題。另外,使用互斥鎖也是一種思路,在緩存失效時,只有一個線程能夠獲取鎖去更新緩存,其他線程等待,避免大量線程同時查詢數據庫。

  1. OOM 預防:OOM(Out Of Memory,內存溢出)在圖片加載中較為常見,因為圖片占用內存較大。可以通過使用 RGB_565 格式減少內存占用,例如:
// 使用RGB_565格式減少內存占用
Glide.with(context).load(url).format(DecodeFormat.PREFER_RGB_565).into(imageView);

面試官可能會問:“在 Glide 中,如何預防 OOM 問題”。除了設置圖片格式外,還可以根據設備內存情況動態調整圖片尺寸。例如,獲取設備的可用內存,當內存較低時,對圖片進行更大比例的壓縮。同時,合理配置 Glide 的內存緩存大小也很關鍵,避免緩存占用過多內存。此外,及時釋放不再使用的圖片資源,Glide 通過與 Activity 或 Fragment 的生命周期綁定,在界面不可見時及時清理相關圖片資源,防止內存泄漏。

關鍵指標的獲取途徑

  1. 冷啟動加載時間:借助 Android Profiler 的 Timeline 功能來精準測量。在應用啟動時,啟動 Profiler 并記錄圖片加載所耗費的時長。代碼示例如下:
long startTime = System.currentTimeMillis();
Glide.with(this).load(url).into(imageView);
long duration = System.currentTimeMillis() - startTime;
Log.d("GlideTest", "加載耗時: " + duration + "ms");
  1. 內存峰值占用情況:使用 Android Profiler 的 Memory Monitor 進行監測。在滑動列表時,留意 Heap Size 的變化趨勢,對比開啟緩存前后 Bitmap 內存占用的差異,以此來優化內存使用。
  2. 緩存命中率計算:通過 Glide 的日志輸出(設置 Glide.get (context).setLogLevel (Log.DEBUG)),從日志中篩選出 Fetched 和 Decoded 相關的條目。緩存命中率 = (內存命中數 + 磁盤命中數)÷ 總請求數 × 100%。
  3. FPS 幀率監控:采用 Android Profiler 的 FrameMetrics 功能。在滑動列表的過程中,記錄丟幀的數量,確保平均幀率穩定在 55fps 以上,以保證流暢的用戶體驗。

二、自定義圖片緩存框架

設計思路

  1. 內存緩存:運用 LruCache(Least Recently Used Cache,最近最少使用緩存)實現內存緩存,它能夠自動回收最近最少使用的圖片,保障內存的合理使用。
  2. 磁盤緩存:利用 DiskLruCache 實現磁盤緩存,將圖片持久化到本地磁盤,方便在網絡不可用或需要重復使用圖片時快速獲取。
  3. 多級緩存策略:首先從內存緩存中查找圖片,若未找到則從磁盤緩存中查找,最后才從網絡請求圖片。當從網絡獲取到圖片后,同時將其存入內存緩存和磁盤緩存。

代碼實現

import android.graphics.Bitmap;
import android.util.LruCache;/*** 內存緩存實現* 使用LruCache(最近最少使用)算法管理內存中的圖片*/
public class MemoryCache {// LruCache實例,用于存儲圖片(鍵為圖片URL,值為Bitmap)private LruCache<String, Bitmap> lruCache;public MemoryCache() {// 獲取應用最大可用內存(KB)int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);// 設置緩存大小為最大內存的1/8int cacheSize = maxMemory / 8;// 初始化LruCache并重寫sizeOf方法計算每個Bitmap的大小lruCache = new LruCache<String, Bitmap>(cacheSize) {@Overrideprotected int sizeOf(String key, Bitmap bitmap) {// 返回Bitmap占用的內存大小(KB)return bitmap.getByteCount() / 1024;}};}// 向緩存添加圖片public void put(String key, Bitmap bitmap) {if (get(key) == null) {lruCache.put(key, bitmap);}}// 從緩存獲取圖片public Bitmap get(String key) {return lruCache.get(key);}// 從緩存移除圖片public void remove(String key) {lruCache.remove(key);}
}import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Environment;
import com.jakewharton.disklrucache.DiskLruCache;import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;/*** 磁盤緩存實現* 使用DiskLruCache將圖片持久化到本地存儲*/
public class DiskCache {// 應用版本(用于緩存版本控制)private static final int APP_VERSION = 1;// 每個緩存項對應的值數量private static final int VALUE_COUNT = 1;// 磁盤緩存最大容量(10MB)private static final long CACHE_SIZE = 10 * 1024 * 1024;// DiskLruCache實例private DiskLruCache diskLruCache;public DiskCache(Context context) {try {// 獲取緩存目錄File cacheDir = getDiskCacheDir(context, "bitmap");if (!cacheDir.exists()) {cacheDir.mkdirs();}// 打開DiskLruCache實例diskLruCache = DiskLruCache.open(cacheDir, APP_VERSION, VALUE_COUNT, CACHE_SIZE);} catch (IOException e) {e.printStackTrace();}}// 向磁盤緩存添加圖片public void put(String key, Bitmap bitmap) {DiskLruCache.Editor editor = null;try {// 獲取緩存編輯器editor = diskLruCache.edit(hashKeyForDisk(key));if (editor != null) {// 獲取輸出流并寫入圖片(JPEG格式,質量100%)OutputStream outputStream = editor.newOutputStream(0);if (bitmap.compress(Bitmap.CompressFormat.JPEG, 100, outputStream)) {editor.commit();} else {editor.abort();}outputStream.close();}} catch (IOException e) {e.printStackTrace();}}// 從磁盤緩存獲取圖片public Bitmap get(String key) {try {// 獲取緩存快照DiskLruCache.Snapshot snapshot = diskLruCache.get(hashKeyForDisk(key));if (snapshot != null) {// 從輸入流解碼BitmapInputStream inputStream = snapshot.getInputStream(0);return BitmapFactory.decodeStream(inputStream);}} catch (IOException e) {e.printStackTrace();}return null;}// 從磁盤緩存移除圖片public void remove(String key) {try {diskLruCache.remove(hashKeyForDisk(key));} catch (IOException e) {e.printStackTrace();}}// 獲取磁盤緩存目錄private File getDiskCacheDir(Context context, String uniqueName) {String cachePath;// 判斷外部存儲是否可用if (Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())||!Environment.isExternalStorageRemovable()) {cachePath = context.getExternalCacheDir().getPath();} else {cachePath = context.getCacheDir().getPath();}return new File(cachePath + File.separator + uniqueName);}// 生成URL的MD5哈希值作為緩存鍵private String hashKeyForDisk(String key) {String cacheKey;try {// 使用MD5算法生成哈希值final MessageDigest mDigest = MessageDigest.getInstance("MD5");mDigest.update(key.getBytes());cacheKey = bytesToHexString(mDigest.digest());} catch (NoSuchAlgorithmException e) {// 若不支持MD5,使用普通哈希碼cacheKey = String.valueOf(key.hashCode());}return cacheKey;}// 字節數組轉十六進制字符串private String bytesToHexString(byte[] bytes) {StringBuilder sb = new StringBuilder();for (byte b : bytes) {String hex = Integer.toHexString(0xFF & b);if (hex.length() == 1) {sb.append('0');}sb.append(hex);}return sb.toString();}
}import android.content.Context;
import android.graphics.Bitmap;/*** 多級緩存管理器* 統一管理內存緩存和磁盤緩存*/
public class ImageCacheManager {// 內存緩存實例private MemoryCache memoryCache;// 磁盤緩存實例private DiskCache diskCache;public ImageCacheManager(Context context) {memoryCache = new MemoryCache();diskCache = new DiskCache(context);}// 同時存入內存緩存和磁盤緩存public void put(String key, Bitmap bitmap) {memoryCache.put(key, bitmap);diskCache.put(key, bitmap);}// 優先從內存緩存獲取,再從磁盤緩存獲取public Bitmap get(String key) {Bitmap bitmap = memoryCache.get(key);if (bitmap != null) {return bitmap;}bitmap = diskCache.get(key);if (bitmap != null) {// 從磁盤讀取后存入內存,提升下次訪問速度memoryCache.put(key, bitmap);}return bitmap;}
}
  1. 請簡述三級緩存(內存緩存、磁盤緩存、網絡緩存)的作用和原理。

    • 內存緩存:旨在快速顯示剛瀏覽過的圖片,使用 LruCache 算法(最近最少使用),自動清理長時間未使用的圖片,確保內存的合理利用。通常限制在手機可用內存的 15%。
    • 磁盤緩存:用于存儲常用但當前不在內存中的圖片,通過 DiskLruCache 將圖片存儲在手機硬盤上,設置總容量(如 100MB),優先存儲高質量圖片,按 URL 哈希值命名文件以避免重復存儲,超過 7 天未使用的圖片會自動清理。
    • 網絡緩存:避免重復從服務器下載相同圖片,結合 HTTP 緩存頭,借助 OkHttp 的緩存機制,將圖片存儲在路由器或基站緩存中,設置總容量(如 50MB),優先存儲高頻訪問的圖片,根據 HTTP 的 Cache-Control 頭設置緩存時間,并在圖片 URL 中添加版本號以強制重新下載。
  2. 在自定義圖片緩存框架中,LruCache 和 DiskLruCache 分別是如何實現的?

    • LruCache:在內存緩存類中,獲取應用程序運行時的最大可用內存,使用最大可用內存的一部分(如 1/8)作為 LruCache 的緩存大小。重寫 sizeOf 方法,計算每個圖片對象占用的內存大小,通過 put 方法添加圖片到緩存,get 方法獲取圖片,remove 方法移除圖片。
    • DiskLruCache:在磁盤緩存類中,初始化時獲取磁盤緩存的目錄,打開 DiskLruCache 實例。put 方法通過獲取編輯器和輸出流,將圖片以 JPEG 格式壓縮并寫入;get 方法通過獲取快照和輸入流,將輸入流解碼為 Bitmap 對象;remove 方法移除指定的圖片。對鍵進行 MD5 哈希處理,確保鍵的唯一性。
  3. 如何防止緩存穿透、緩存雪崩和 OOM 問題?

    • 緩存穿透:在 Glide 中,可以通過設置錯誤占位圖、加載占位圖和空值占位圖來解決部分問題。另外,可以使用布隆過濾器,將所有已存在的數據 key 放入布隆過濾器中,當新的請求到來時,先通過布隆過濾器判斷該 key 是否存在,避免不必要的數據庫查詢。
    • 緩存雪崩:可以通過設置不同的緩存過期時間來避免,例如在設置緩存過期時間時,添加一個隨機值。另外,采用二級緩存策略,設置主緩存和備用緩存,主緩存失效后,先從備用緩存獲取數據,同時對主緩存進行異步更新。使用互斥鎖,在緩存失效時,只有一個線程能夠獲取鎖去更新緩存,其他線程等待。
    • OOM:在 Glide 中,可以使用 RGB_565 格式減少內存占用,根據設備內存情況動態調整圖片尺寸,合理配置 Glide 的內存緩存大小,避免緩存占用過多內存。及時釋放不再使用的圖片資源,Glide 通過與 Activity 或 Fragment 的生命周期綁定,在界面不可見時及時清理相關圖片資源,防止內存泄漏。

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

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

相關文章

Linux的文件查找與壓縮

查找文件 find命令 # 命令&#xff1a;find 路徑范圍 選項1 選項1的值 \[選項2 選項2 的值…]# 作用&#xff1a;用于查找文檔&#xff08;其選項有55 個之多&#xff09;# 選項&#xff1a;# -name&#xff1a;按照文檔名稱進行搜索&#xff08;支持模糊搜索&#xff0c;\* &…

python處理異常,JSON

異常處理 #異常處理 # 在連接MySQL數據庫的過程中&#xff0c;如果不能有效地處理異常&#xff0c;則異常信息過于復雜&#xff0c;對用戶不友好&#xff0c;暴露過多的敏感信息 # 所以&#xff0c;在真實的生產環境中&#xff0c; 程序必須有效地處理和控制異常&#xff0c;按…

線程的兩種實現方式

線程的兩種實現方式——內核支持線程&#xff08;kernal Supported Thread, KST&#xff09;&#xff0c; 用戶級線程&#xff08;User Level Thread, ULT&#xff09; 1. 內核支持線程 顧名思義&#xff0c;內核支持線程即為在內核支持下的那些線程&#xff0c;它們的創建&am…

vue3基礎學習(上) [簡單標簽] (vscode)

目錄 1. Vue簡介 2. 創建Vue應用 2.1 下載JS文件 2.2 引用JS文件 2.3 調用Vue方法?編輯 2.4 運行一下試試: 2.5 代碼如下 3.模塊化開發模式 3.1 Live Server插件 3.2 運行 4. 常用的標簽 4.1 reactive 4.1.1 運行結果 4.1.2 代碼: 4.2 ref 4.2.1 運行結果 4.2.2…

自定義分區器-基礎

什么是分區 在 Spark 里&#xff0c;彈性分布式數據集&#xff08;RDD&#xff09;是核心的數據抽象&#xff0c;它是不可變的、可分區的、里面的元素并行計算的集合。 在 Spark 中&#xff0c;分區是指將數據集按照一定的規則劃分成多個較小的子集&#xff0c;每個子集可以獨立…

深入解析HTTP協議演進:從1.0到3.0的全面對比

HTTP協議作為互聯網的基礎協議&#xff0c;經歷了多個版本的迭代演進。本文將詳細解析HTTP 1.0、HTTP 1.1、HTTP/2和HTTP/3的核心特性與區別&#xff0c;幫助開發者深入理解網絡協議的發展脈絡。 一、HTTP 1.0&#xff1a;互聯網的奠基者 核心特點&#xff1a; 短連接模式&am…

基于windows環境Oracle主備切換之后OGG同步進程恢復

基于windows環境Oracle主備切換之后OGG同步進程恢復 場景&#xff1a;db1是主庫&#xff0c;db2是備庫&#xff0c;ogg從db2備庫抽取數據同步到目標數據庫 db1 - db2(ADG) – ogg – targetdb 場景&#xff1a;db2是主庫&#xff0c;db1是備庫&#xff0c;ogg從db1備庫抽取數…

微服務,服務粒度多少合適

項目服務化好處 復用性&#xff0c;消除代碼拷貝專注性&#xff0c;防止復雜性擴散解耦合&#xff0c;消除公共庫耦合高質量&#xff0c;SQL穩定性有保障易擴展&#xff0c;消除數據庫解耦合高效率&#xff0c;調用方研發效率提升 微服務拆分實現策略 統一服務層一個子業務一…

【工奧閥門科技有限公司】簽約智橙PLM

近日&#xff0c;工奧閥門科技有限公司正式簽約了智橙泵閥行業版PLM。 忠于質量&#xff0c;臻于服務&#xff0c;精于研發 工奧閥門科技有限公司&#xff08;以下簡稱工奧閥門&#xff09;坐落于浙江永嘉&#xff0c;是一家集設計、開發、生產、銷售、安裝、服務為一體的閥門…

2025-5-15Vue3快速上手

1、setup和選項式API之間的關系 (1)vue2中的data,methods可以與vue3的setup共存 &#xff08;2&#xff09;vue2中的data可以用this讀取setup中的數據&#xff0c;但是反過來不行&#xff0c;因為setup中的this是undefined &#xff08;3&#xff09;不建議vue2和vue3的語法混用…

基于智能推薦的就業平臺的設計與實現(招聘系統)(SpringBoot Thymeleaf)+文檔

&#x1f497;博主介紹&#x1f497;&#xff1a;?在職Java研發工程師、專注于程序設計、源碼分享、技術交流、專注于Java技術領域和畢業設計? 溫馨提示&#xff1a;文末有 CSDN 平臺官方提供的老師 Wechat / QQ 名片 :) Java精品實戰案例《700套》 2025最新畢業設計選題推薦…

什么是路由器環回接口?

路由器環回接口&#xff08;LoopbackInterface&#xff09;是網絡設備中的一種邏輯虛擬接口&#xff0c;不依賴物理硬件&#xff0c;但在網絡配置和管理中具有重要作用。以下是其核心要點&#xff1a; 一、基本特性 1.虛擬性與穩定性 環回接口是純軟件實現的邏輯接口&#x…

HOT100 (滑動窗口子串普通數組矩陣)

先填坑 滑動窗口 3. 無重復字符的最長子串 給定一個字符串 s ,請你找出其中不含有重復字符的最長子串的長度。 思路:用一個uset容器存放當前滑動窗口中的元素 #include <bits/stdc++.h> using namespace std; class Solution {public:int lengthOfLongestSubstring(st…

工作實戰之關于數據庫表的備份

文章目錄 1. dbeaver導出相關表到本地2. 使用sql語句3. 導入數據 1. dbeaver導出相關表到本地 常規情況下&#xff0c;如果想備份數據庫的某張表&#xff0c;特別是臨時備份或者表中數據不多的情況下&#xff0c;直接將數據庫表中導出即可&#xff0c;后續可根據導出的insert語…

python克洛伊婚紗攝影預約管理系統

目錄 技術棧介紹具體實現截圖系統設計研究方法&#xff1a;設計步驟設計流程核心代碼部分展示研究方法詳細視頻演示試驗方案論文大綱源碼獲取/詳細視頻演示 技術棧介紹 Django-SpringBoot-php-Node.js-flask 本課題的研究方法和研究步驟基本合理&#xff0c;難度適中&#xf…

中間件-MQ常見問題

MQ常見問題 消息丟失消息會在哪些環節丟失應對機制 消息的順序性消息冪等消息積壓的處理 消息丟失 消息會在哪些環節丟失 網絡傳輸環節&#xff1a;生產者發送消息到broker&#xff0c;broker中master同步消息給slave&#xff0c;consumer消費消息&#xff0c;這3個環節都是跨…

【python實用小腳本-63】每天花費2小時修復黑白照片,Python一鍵轉換,節省90%時間(建議收藏)

一、應用場景故事 上周&#xff0c;我的朋友小李從家里翻出了一堆老照片&#xff0c;這些照片大多是彩色的&#xff0c;但他想把它們轉換成黑白風格&#xff0c;讓照片更有復古感。他嘗試用Photoshop一張張處理&#xff0c;但花了整整一個周末&#xff0c;才處理了不到一半的照…

分頁管理調試

一、分頁管理原理 基本概念&#xff1a; 物理內存被劃分為固定大小的頁框&#xff08;Page Frame&#xff09;&#xff0c;邏輯地址空間被劃分為相同大小的頁&#xff08;Page&#xff09;。 通過頁表&#xff08;Page Table&#xff09;實現邏輯地址到物理地址的映射。 邏輯…

搭建Hadoop集群standalone

在開始配置之前&#xff0c;請確保三臺虛擬機都正確啟動了&#xff01; 具體配置步驟如下。 1.上傳spark安裝包到某一臺機器&#xff08;例如:hadoop100&#xff09;。 spark.3.1.2-bin-hadoop3.2.tgz。 2.解壓。 把第一步上傳的安裝包解壓到/opt/module下&#xff08;也可以…

AJAX技術全解析:從基礎到最佳實踐

目錄 什么是 AJAX&#xff1f; 工作原理 XMLHttpRequest 基礎 現代 Fetch API Axios 第三方庫 數據處理 錯誤處理機制 跨域請求解決方案 最佳實踐 總結 1. 什么是 AJAX&#xff1f; AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一種通過瀏覽器與…