redis速記

1.什么是緩存穿透怎么解決

:緩存穿透是指用戶請求的數據在緩存(如 Redis)和數據庫(如 MySQL)中都不存在,導致每次請求都必須繞過緩存直接查詢數據庫,最終大量無效請求集中沖擊數據庫的現象。

其核心問題在于:緩存的 “攔截” 作用失效(因為緩存中沒有該數據),而數據庫也無法返回有效結果,導致所有請求都直接打到數據庫,可能引發數據庫過載、響應延遲甚至宕機。

解決方案:針對緩存穿透的核心矛盾(“緩存和數據庫都無數據,導致請求直達數據庫”),解決方案的本質是在請求到達數據庫前,提前攔截無效請求,或減少無效請求對數據庫的直接沖擊

1. 布隆過濾器(Bloom Filter):提前攔截 “絕對不存在” 的請求

原理
布隆過濾器是一種空間效率極高的概率性數據結構,它可以提前將數據庫中 “已存在的所有有效 key”(如所有合法的用戶 ID、商品 ID)存入其中。當有新請求來時,先通過布隆過濾器判斷該 key 是否 “可能存在”:

  • 若布隆過濾器判斷 “不存在”,則直接返回空結果(無需查詢緩存和數據庫);
  • 若判斷 “可能存在”,再繼續查詢緩存和數據庫(因為布隆過濾器有極小的誤判率,即 “不存在的 key 可能被誤判為存在”)。

優勢

  • 內存占用小(相比緩存全量 key),查詢速度快(O (1)),適合攔截大量無效請求;
  • 能從源頭過濾掉 “絕對不存在” 的 key,大幅減少數據庫壓力。

注意點

  • 存在誤判率(可通過調整哈希函數數量和位數組大小降低,但無法完全消除),可能導致少量不存在的 key 被誤判為 “可能存在”,仍需查詢數據庫;
  • 數據更新時需同步更新布隆過濾器(如新增數據時添加 key,刪除數據時需謹慎,因為布隆過濾器不支持高效刪除)。
2. 緩存空值(Null Value):避免重復查詢不存在的數據

原理
當數據庫查詢結果為 “空”(即數據不存在)時,不直接返回空結果,而是將這個 “空值” 作為緩存值存入緩存,并設置一個較短的過期時間(如 1-5 分鐘)。后續相同的請求會直接從緩存獲取 “空值”,無需再查詢數據庫。

優勢

  • 實現簡單,無需額外組件,能快速攔截重復的無效請求;
  • 適合應對短期集中的無效請求(如用戶輸入錯誤參數的場景)。

注意點

  • 需設置合理的過期時間:時間過長會導致緩存中積累大量空值,浪費內存;時間過短則無法有效攔截重復請求;
  • 可能被惡意攻擊利用(如偽造大量不同的不存在 key,導致緩存中存入大量空值,占用內存),需配合其他策略(如限流)使用。
3. 業務層校驗與過濾:從源頭減少無效請求

原理
在請求到達緩存或數據庫前,通過業務邏輯對請求參數進行合法性校驗,直接過濾掉明顯無效的請求。

常見手段

  • 參數格式校驗:比如用戶 ID 必須為正整數,過濾負數、字符串等非法格式;
  • 范圍校驗:比如商品 ID 的有效范圍是 1-100 萬,直接攔截超出范圍的請求;
  • 白名單機制:對于核心業務(如支付、用戶信息),僅允許白名單內的 key 通過查詢。

優勢

  • 成本低,無需依賴緩存或數據庫,直接在應用層攔截,效率高;
  • 能針對性過濾業務場景中的無效請求。
4. 接口限流與熔斷:控制請求總量

原理
通過限流算法(如令牌桶、漏桶)限制單位時間內的請求數量,或通過熔斷機制(如 Sentinel、Hystrix)在數據庫壓力過大時,暫時停止對無效請求的處理,避免數據庫被壓垮。

適用場景

  • 應對突發的惡意攻擊(如短時間內大量不同的無效請求);
  • 作為兜底策略,防止其他措施失效時數據庫過載。
5. 數據預熱:減少緩存未命中的概率

原理
在系統啟動或低峰期,提前將數據庫中 “高頻訪問的有效數據” 加載到緩存中,減少緩存未命中的情況。雖然不能直接解決緩存穿透,但能降低無效請求的相對比例。

緩存穿透

定義:指查詢一個「不存在的數據」時,由于緩存和數據庫中都沒有該數據,導致每次請求都會直接穿透緩存,全部打到數據庫上。如果這類請求量很大,可能會壓垮數據庫。

緩存擊穿

定義:指一個「熱點 key」(被高頻訪問的 key)在緩存中突然失效(比如過期),此時大量請求同時訪問該 key,緩存未命中,導致所有請求瞬間打到數據庫,造成數據庫短期內壓力驟增。

緩存雪崩

定義:指「大量緩存 key 在同一時間集中過期」,或 Redis 服務本身宕機,導致緩存層整體失效,此時所有請求全部涌向數據庫,數據庫因無法承載高并發而崩潰。

維度緩存穿透緩存擊穿緩存雪崩
針對的 key不存在的 key存在的熱點 key大量 key(或 Redis 集群)
觸發原因數據本身不存在熱點 key 突然失效大量 key 集中過期 / Redis 宕機
影響范圍單個無效 key 的高頻請求單個熱點 key 的突發請求整體緩存層失效,全量請求

緩存穿透保護:?

// 布隆過濾器實現
public class BloomFilter {private BitSet bitSet;private int size;private HashFunction[] hashFunctions;public BloomFilter(int size, int hashCount) {this.bitSet = new BitSet(size);this.size = size;this.hashFunctions = new HashFunction[hashCount];for (int i = 0; i < hashCount; i++) {hashFunctions[i] = new HashFunction(size, i);}}public void add(String key) {for (HashFunction f : hashFunctions) {bitSet.set(f.hash(key), true);}}public boolean contains(String key) {for (HashFunction f : hashFunctions) {if (!bitSet.get(f.hash(key))) {return false;}}return true;}private static class HashFunction {private int size;private int seed;public HashFunction(int size, int seed) {this.size = size;this.seed = seed;}public int hash(String key) {int result = 1;for (char c : key.toCharArray()) {result = seed * result + c;}return (size - 1) & result;}}
}

緩存擊穿保護:

// 互斥鎖實現
public class CacheBreakdownProtection {private RedisTemplate<String, Object> redisTemplate;private Map<String, Lock> lockMap = new ConcurrentHashMap<>();public Object getWithLock(String key, Callable<Object> loader) {Object value = redisTemplate.opsForValue().get(key);if (value != null) {return value;}Lock lock = lockMap.computeIfAbsent(key, k -> new ReentrantLock());try {lock.lock();// 雙重檢查value = redisTemplate.opsForValue().get(key);if (value == null) {value = loader.call();redisTemplate.opsForValue().set(key, value, 30, TimeUnit.MINUTES);}return value;} catch (Exception e) {throw new RuntimeException(e);} finally {lock.unlock();lockMap.remove(key);}}
}

緩存雪崩保護:

// 隨機過期時間實現
public class CacheAvalancheProtection {private RedisTemplate<String, Object> redisTemplate;private ThreadLocalRandom random = ThreadLocalRandom.current();public void setWithRandomExpire(String key, Object value, long baseExpire, long delta) {long expireTime = baseExpire + random.nextLong(delta);redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);}// 集群模式下使用多級緩存public Object getWithMultiLevelCache(String key, Callable<Object> loader) {Object value = redisTemplate.opsForValue().get(key);if (value != null) {return value;}value = localCache.get(key);if (value != null) {return value;}try {value = loader.call();setWithRandomExpire(key, value, 1800, 600); // 30分鐘±10分鐘localCache.put(key, value);return value;} catch (Exception e) {throw new RuntimeException(e);}}
}

綜合保護:?

// 綜合防護策略
public class CacheProtectionService {private BloomFilter bloomFilter;private CacheBreakdownProtection breakdownProtection;private CacheAvalancheProtection avalancheProtection;public Object safeGet(String key, Callable<Object> loader) {// 1. 檢查布隆過濾器if (!bloomFilter.contains(key)) {return null;}// 2. 嘗試獲取緩存Object value = breakdownProtection.getWithLock(key, () -> {// 3. 數據加載邏輯Object loadedValue = loader.call();// 4. 設置隨機過期時間avalancheProtection.setWithRandomExpire(key, loadedValue, 1800, 600);// 5. 更新布隆過濾器bloomFilter.add(key);return loadedValue;});return value;}
}

2.redis做為緩存,mysql的數據如何與redis進行同步呢?(雙寫一致性

強一致性:需要讓數據庫與redis高度保持一致,因為要求時效性比較高。采用讀寫鎖保證的強一致性。使用Redisson實現的讀寫鎖。在讀的時候添加共享鎖,可以保證讀讀不互斥、讀寫互斥。當更新數據的時候,添加排他鎖。它是讀寫、讀讀都互斥,這樣就能保證在寫數據的同時,是不會讓其他線程讀數據的,避免了臟數據。這里面需要注意的是,讀方法和寫方法上需要使用同一把鎖才行。排他鎖底層使用的也是SETNX,它保證了同時只能有一個線程操作鎖住的方法。

最終一致性:數據同步可以有一定的延時(這符合大部分業務需求)。采用的阿里的Canal組件實現數據同步:不需要更改業務代碼,只需部署一個Canal服務。Canal服務把自己偽裝成mysql的一個從節點。當mysql數據更新以后,Canal會讀取binlog數據,然后再通過Canal的客戶端獲取到數據,并更新緩存即可。

3.為什么要優先保證數據庫一致性,先更新緩存會怎么樣?

在處理數據同步時優先保證數據庫一致性,核心是因為數據庫是數據的最終持久化存儲,是數據真實性的權威來源。從實際項目場景來看,若先更新緩存,可能出現 “緩存更新成功但數據庫更新失敗” 的情況:比如xxxx項目更新中,若先修改了 Redis 中的模板緩存,卻因網絡波動等導致 MySQL 中模板數據更新失敗,會使緩存中留存錯誤數據,后續所有依賴該緩存的請求都會獲取到不一致信息,且難以快速發現和修正。

而先更新數據庫再處理緩存,即使緩存更新失敗,后續請求查詢時會因緩存未命中而從數據庫加載最新數據并重建緩存,能通過 “數據庫的正確性” 兜底,保證數據最終一致。這也與項目中對 Redis 緩存的使用邏輯一致 —— 緩存本質是提升查詢效率的輔助存儲,其一致性需依賴數據庫這一核心載體來保障。

4.你聽說過延時雙刪嗎?為什么不用它呢?

延時雙刪是一種在高并發場景下解決數據庫與緩存雙寫一致性問題的策略,其核心思想是通過兩次刪除緩存操作,配合一定的延遲時間,盡量保證在數據庫更新完成后,舊數據不會因并發請求被錯誤地重新寫入緩存。以下是其實現原理和關鍵步驟:

基本流程

  1. 先刪除緩存:在更新數據庫前,先刪除 Redis 中的對應緩存,防止后續請求讀取到舊數據。
  2. 更新數據庫:執行 MySQL 等數據庫的更新操作。
  3. 延時后再次刪除緩存:更新數據庫完成后,等待一段時間(如 1-3 秒),再次刪除 Redis 緩存。
    • 目的:確保在數據庫更新期間,若有請求讀取到舊數據并寫入緩存,通過第二次刪除操作清除該臟數據。

為什么需要延時?

在高并發場景下,可能存在以下時序問題:

  • 步驟 1 刪除緩存后,若有新請求在數據庫更新前讀取數據,會從數據庫獲取舊值并重新寫入緩存。
  • 步驟 2 更新數據庫,此時緩存中仍為舊值,導致后續請求讀取到不一致的數據。

通過延時,可以等待數據庫更新完成后,再執行第二次刪除,確保舊數據被徹底清除。

延時時間如何確定?

通常需要根據業務場景的數據庫更新耗時請求處理耗時來估算,一般設置為1-3 秒。例如:

  • 若數據庫更新操作平均耗時 200ms,可設置延時為 1 秒,確保大部分更新操作已完成。
  • 對于更復雜的業務,可通過壓測或監控數據動態調整延時時間。

優缺點

  • 優點:實現簡單,成本低,能解決大部分并發場景下的數據不一致問題。
  • 缺點
    • 無法保證強一致性:極端情況下(如第二次刪除失敗)仍可能存在短暫不一致。
    • 性能損耗:延時操作會增加請求響應時間,影響吞吐量。
    • 延時時間難精準控制:不同業務場景的最優延時時間差異較大。

適用場景

  • 適用于讀多寫少、對一致性要求不是極致嚴格的場景(如商品價格、用戶信息等)。
  • 不適用于金融交易等需要強一致性的場景(通常需借助分布式事務或中間件)。

實際項目中的替代方案

在實際項目中,更傾向于使用:

  1. 異步消息隊列:通過 MQ 異步更新緩存,利用重試機制保證最終一致性。
  2. 訂閱數據庫 binlog:如通過 Canal 監聽 MySQL 變更,自動同步到 Redis,減少人工干預。
  3. 設置合理的緩存過期時間:作為兜底策略,即使出現不一致,過期后會自動刷新。

5.redis做為緩存,數據的持久化是怎么做的?這兩種持久化方式有什么區別呢,優缺點?分別介紹一下這兩種持久化方式那個恢復得更快?

Redis 的數據持久化主要通過兩種方式實現:RDB(Redis Database)和 AOF(Append Only File)。

RDB 是通過生成數據集的時間點快照來實現持久化的。它會在指定的時間間隔內,將內存中的所有數據以二進制的形式寫入磁盤的 RDB 文件中,比如可以配置 “每 5 分鐘內有 1000 次寫操作就觸發一次快照”。

AOF 則是通過記錄所有寫操作命令來實現持久化的。服務器在執行完一個寫命令后,會將該命令追加到 AOF 文件的末尾,當 Redis 重啟時,會通過重新執行 AOF 文件中的所有命令來恢復數據。

兩者的區別主要體現在以下方面:
從數據完整性來看,RDB 可能會丟失最后一次快照后的所有數據,因為它是定時快照;而 AOF 可以通過配置 “everysec”(每秒同步一次)等策略,最多丟失 1 秒內的數據,完整性更好。
從文件大小來看,RDB 是二進制壓縮存儲,文件體積較小;AOF 記錄的是命令文本,相同數據下文件體積更大,即使有重寫機制優化,通常也比 RDB 大。
從性能影響來看,RDB 在觸發快照時會通過 fork 子進程處理,主進程不阻塞,但 fork 操作在數據量大時可能有短暫阻塞;AOF 的追加操作是異步的,對主進程影響小,但 AOF 重寫時也可能有一定性能消耗。

在恢復速度上,RDB 更快。因為 RDB 是二進制文件,加載時直接解析還原數據即可;而 AOF 需要逐條執行命令,尤其是當 AOF 文件較大時,恢復速度會明顯慢于 RDB。

6.Redis的數據過期策略有哪些? Redis的數據淘汰策略有哪些??

一、數據過期策略(處理已過期的 Key)

Redis 采用 「定期刪除 + 惰性刪除」組合策略 ,平衡 CPU 性能與內存利用率。

  1. 惰性刪除(Lazy Deletion)

    • 觸發時機:僅當訪問(讀 / 寫)已過期的 Key 時,才會檢查并刪除。
    • 優點:避免主動掃描帶來的 CPU 開銷,適合低頻訪問的過期 Key。
    • 缺點:若過期 Key 長期未被訪問,會導致內存泄漏(如用戶會話緩存長期未失效)。
  2. 定期刪除(Periodic Deletion)

    • 執行邏輯:默認每 100ms 隨機抽取 20 個設置過期時間的 Key,刪除其中已過期的;若過期比例>25%,重復抽取,單次掃描耗時不超過 25ms。
    • 優點:主動清理部分過期 Key,防止內存膨脹。
    • 缺點:隨機抽樣可能遺漏大量過期 Key(如集中過期的熱點數據)。

二、數據淘汰策略(內存不足時的兜底方案)

當 Redis 內存達到maxmemory閾值時,根據以下 8 種策略淘汰數據(區分「是否設置過期時間」):

策略分類策略名稱淘汰邏輯適用場景
僅過期 Keyvolatile-lru淘汰最近最少使用(LRU)的過期 Key緩存臨時數據(如驗證碼、短期會話),保留永久數據
volatile-lfu淘汰最不頻繁使用(LFU)的過期 Key(Redis 4.0+)區分短期高頻訪問的臨時數據(如活動促銷頁緩存)
volatile-ttl優先淘汰剩余 TTL 最短的過期 Key需精準控制過期順序的場景(如倒計時活動)
volatile-random隨機淘汰過期 Key無明顯冷熱數據區分的臨時緩存
所有 Keyallkeys-lru淘汰全體 Key 中最近最少使用的通用緩存場景(如商品詳情頁),不區分是否過期
allkeys-lfu淘汰全體 Key 中最不頻繁使用的(Redis 4.0+)長期冷熱數據分明(如用戶行為日志緩存)
allkeys-random隨機淘汰全體 Key數據訪問頻率均勻的場景(如測試環境)
不淘汰noeviction(默認)拒絕寫入新數據(讀正常),防止數據丟失不允許丟失數據的場景(如持久化配置中心)

三、核心區別與選擇建議

維度過期策略(已過期 Key)淘汰策略(內存不足)
觸發條件Key 已過期內存超過閾值
目標釋放過期內存騰出空間寫入新數據
典型場景會話超時、驗證碼失效突發流量導致內存不足

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

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

相關文章

aspnetcore Mvc配置選項中的ModelMetadataDetailsProviders

在ASP.NET Core 中&#xff0c;ModelMetadataDetailsProviders 是用于配置模型元數據提供程序的核心組件&#xff0c;它決定了如何解析和提供模型屬性的元數據&#xff08;如數據類型、驗證規則、顯示名稱等&#xff09;。以下是其詳細解析&#xff1a; 一、核心概念與作用 模…

分區表設計:歷史數據歸檔與查詢加速

以下為分區表設計的核心實現方案與技術要點&#xff0c;綜合最新技術實踐整理&#xff1a;一、分區表核心機制與價值?物理存儲與邏輯分離?分區表通過預定義規則&#xff08;如時間戳、ID范圍&#xff09;將大表物理拆分為多個子表&#xff08;分區&#xff09;&#xff0c;對…

下班倒計時

下班倒計時#include <stdio.h> #include <time.h> #include <unistd.h>void print_remaining_time(time_t now, time_t tar_time) {double diff difftime(tar_time, now);int hours (int)diff / 3600;int minutes ((int)diff % 3600) / 60;int seconds (…

Vue配置特性(ref、props、混入、插件與作用域樣式)

前言Vue提供了許多高級特性來增強組件開發的能力。本文將深入解析Vue中的ref屬性、props配置、混入(mixin)、插件開發以及scoped樣式等核心特性&#xff0c;通過實例演示它們的用法&#xff0c;并給出最佳實踐建議。一、ref屬性詳解1. ref基本用法ref用于給元素或子組件注冊引用…

解析力和清晰度區別

在視覺成像、光學設備或數字信號處理領域&#xff0c;清晰度和解析力是兩個相關但側重點不同的概念。它們都與“細節呈現”有關&#xff0c;但核心定義、影響因素和應用場景存在顯著區別。以下從定義、核心差異、聯系三個方面詳細說明&#xff1a; 一、核心定義清晰度&#xff…

Java網絡通信:UDP和TCP

一、UDP特點&#xff1a; 無連接不可靠&#xff1a;通信雙方不事先建立連接&#xff0c;直接發送數據。數據封裝&#xff1a;將數據封裝在64KB的數據包中&#xff0c;包含接收端的IP和端口。UDP通信模型&#xff1a; 模型比喻&#xff1a;以拋韭菜為例&#xff0c;發送端像拋韭…

Java行為型模式(狀態模式)實現方式與測試方法

一、狀態模式實現方式 核心結構 狀態接口&#xff08;State&#xff09;&#xff1a;定義狀態相關的行為方法。具體狀態類&#xff08;ConcreteState&#xff09;&#xff1a;實現狀態接口&#xff0c;封裝特定狀態下的邏輯。上下文類&#xff08;Context&#xff09;&#xff…

MISRA C-2012準則之標準C環境準則

目錄 1.標準C環境準則 錯誤示例1&#xff1a;未定義行為&#xff08;整數溢出&#xff09; 錯誤示例2&#xff1a;未指定行為&#xff08;函數調用順序&#xff09; 錯誤示例3&#xff1a;語言擴展&#xff08;GCC內置函數&#xff09; 錯誤示例4&#xff1a;關鍵未指定行…

26、鴻蒙Harmony Next開發:ArkTS并發(Promise和async/await和多線程并發TaskPool和Worker的使用)

目錄 異步并發 (Promise和async/await) Promise async/await 多線程并發 多線程并發模型 內存共享模型 Actor模型 TaskPool TaskPool運作機制 TaskPool注意事項 Concurrent裝飾器 裝飾器說明 裝飾器使用示例 TaskPool擴縮容機制 擴容機制 縮容機制 Worker Wo…

[IRF/Stack]華為/新華三交換機堆疊配置

堆疊的三大優勢 提高資源利用率&#xff0c;獲得更高的轉發性能、鏈路帶寬降低網絡規劃的復雜度、方便網絡的管理降低故障對業務的影響時間 堆疊的兩個需求 設備型號必須統一系統版本必須統一 華三堆疊案例&#xff1a;#### S6850_1 <H3C>sy [H3C]undo in en [H3C]sy SW…

融智興科技: RFID超高頻洗滌標簽解析

在紡織品租賃與管理領域&#xff0c;布草、工服、醫護織物等物品的流轉追蹤一直是運營管理的核心挑戰。傳統管理方式依賴人工計數與條碼掃描&#xff0c;存在效率低下、差錯率高、損耗嚴重等問題&#xff0c;尤其在工業洗滌環境下&#xff0c;紙質標簽易損壞、識別率低。融智興…

從平面到時空:地圖故事的時空敘事與沉浸式閱讀

朋友們&#xff0c;在工作中你是否也遇到過這些令人頭疼的挑戰&#xff1f;當項目匯報時總覺得表達不夠精彩&#xff0c;方案講解時聽眾總是一頭霧水&#xff0c;制作應急預案時更是無從下手&#xff1f;別擔心&#xff01;今天我要向大家介紹一個超級實用的解決方案——地圖故…

自動控制原理知識地圖:舵輪、路徑與導航圖

掌握自控原理的關鍵&#xff0c;在于看清那棵枝繁葉茂的“知識樹”——從根部的數學模型&#xff0c;到主干的分析方法&#xff0c;直至頂端的系統設計。作為一名自動化專業學生&#xff0c;你是否曾在深夜里面對勞斯判據和奈奎斯特圖感到深深的恐懼&#xff1f;作為初入行的工…

Flutter在Android studio運行出現Error: Entrypoint is not a Dart file

Flutter在Android studio運行出現Error: Entrypoint is not a Dart file

NE綜合實驗2:RIP 與 OSPF 動態路由精細配置及ACL訪問控制列表 電腦

NE綜合實驗2&#xff1a;RIP 與 OSPF 動態路由精細配置及ACL訪問控制列表 實驗拓撲圖實驗需求 1.按照圖示配置IP地址 2.按照圖示區域劃分配置對應的動態路由協議 3.在R7上配置dhcp服務器&#xff0c;能夠讓pc可以獲取IP地址 4.將所有環回?宣告進ospf中&#xff0c;將環回?7宣…

Kafka 控制器(Controller)詳解:架構、原理與實戰

目錄Kafka 控制器&#xff08;Controller&#xff09;詳解&#xff1a;架構、原理與實戰一、控制器的核心職責1. 元數據管理2. 分區狀態機3. 故障恢復4. 集群操作協調二、傳統 ZooKeeper 模式下的控制器1. 控制器選舉機制2. 控制器與 ZooKeeper 的交互3. 潛在問題三、KRaft 模式…

【C++基礎】#define vs constexpr:C++ 編譯期常量的雙雄對決(面試高頻考點 + 真題解析)

?在 C++ 面試中,#define與constexpr的對比堪稱 “元老級” 考點 —— 據統計,在 2023-2024 年的 C++ 工程師面試中,該知識點的出現頻率高達 72%,尤其是在字節跳動、騰訊、華為等企業的校招 / 社招中,幾乎是必問內容。? 這兩個語法元素都與 “編譯期常量” 相關,但背后卻…

k8s環境使用Operator部署Seaweedfs集群(上)

作者&#xff1a;閆乾苓 文章目錄前言4.1 前置條件4.2 部署seaweedfs-operator4.3 準備operator鏡像4.4 使用operator部署Seaweedfs集群4.4.1 部署StorageClass4.4.2 使用StorageClass預先創建PV前言 SeaweedFS Operator是一個Kubernetes Operator&#xff0c;用于自動化部署和…

Git CLI高危任意文件寫入漏洞(CVE-2025-48384)PoC已公開

Git CLI&#xff08;命令行界面&#xff09;中存在一個高危漏洞&#xff0c;攻擊者可利用該漏洞在Linux和macOS系統上實現任意文件寫入。目前該漏洞的概念驗證&#xff08;PoC&#xff09;利用代碼已公開。該漏洞編號為CVE-2025-48384&#xff0c;CVSS嚴重性評分為8.1分&#x…

前端開發中關于表單內容的使用和基礎知識

在前邊&#xff0c;我們已經寫過Web前端開發&#xff0c;Web前端開發&#xff0c;萬字詳細博文帶你HTML&#xff0c;CSS快速入門&#xff08;上篇&#xff09;和Web前端開發&#xff0c;一文帶你HTML&#xff0c;CSS快速入門&#xff08;下篇&#xff09;&#xff0c;使用近兩萬…