Redis 深度解析:數據結構、持久化與集群

Redis (Remote Dictionary Server) 是一種高性能的鍵值(Key-Value)內存數據庫,以其豐富的數據結構、極低的延遲、出色的穩定性和強大的集群能力,在現代應用程序的開發中扮演著至關重要的角色。無論是作為緩存、消息隊列、會話存儲,還是簡單的鍵值對數據庫,Redis 都展現出卓越的性能和靈活性。

本文將深入探討 Redis 的三大核心基石:核心數據結構、數據持久化機制以及高可用與高擴展的集群方案。通過理解這些底層原理,開發者能夠更有效地利用 Redis? 規避常見陷阱,并構建出更加健壯、高效的分布式系統。

第一章:Redis 核心數據結構——不僅僅是 Key-Value

Redis 的核心競爭力之一就在于其提供了多種高效、特化的數據結構,遠超簡單的字符串(String)類型。這些數據結構允許開發者用更恰當的方式來存儲和操作數據,極大地提高了效率和表達能力。

1.1 String (字符串)

String 是 Redis 最基本也是最常用的數據類型。它能夠存儲任何形式的字符串,包括二進制安全(Binary Safe),這意味著你可以存儲圖片、序列化的對象等。

用途: 緩存單個鍵值對、計數器、簡單的會話存儲。

常用命令: SET, GET, INCR, DECR, SETNX (Set if Not Exists), GETRANGE, SETEX (Set with Expiration), APPEND。

底層實現:

SDS (Simple Dynamic String): Redis 自己實現的一種動態字符串結構。它比 C 語言的 char* 數組更高效,包含額外信息(如字符串長度、已分配空間),避免了多次內存重分配。

Embstr (Embedded String): 當字符串長度較短(小于 39 字節)時,Redis 會將其直接存儲在 SDS 的 buf 字段之后,無需額外的內存分配。

1.2 List (列表)

List 是一個按照插入順序排序的字符串集合。它可以通過鏈表或壓縮列表(ziplist)來實現。

用途: 微博時間線、消息隊列、任務隊列。

常用命令: LPUSH, RPUSH (從左/右側入棧), LPOP, RPOP (從左/右側出棧), LRANGE (獲取范圍元素), LLEN (獲取長度), BLPOP/BRPOP (阻塞式出棧)。

底層實現:

Quicklist: Redis 3.2 引入的混合數據結構,它是一個雙向鏈表,鏈表的每個節點都是一個壓縮列表 (ziplist)。當列表元素較少時,表現為 ziplist;當元素增多時,鏈表會分裂成多個 ziplist 節點,提供了很好的內存利用率和操作性能。

1.3 Hash (散列)

Hash 是一種鍵值對的集合,用于存儲對象的屬性。

用途: 存儲用戶對象、配置信息。

常用命令: HSET, HGET, HMSET, HMGET, HGETALL, HINCRBY。

底層實現:

Hashtable: 當字段和值的數量較少時,使用壓縮列表 (ziplist)。

Hash Table: 當字段和值的數量超過一定閾值時(hash-max-ziplist-entries 和 hash-max-ziplist-value),會自動轉換成普通哈希表。HASHTABLE 是基于動態數組和鏈表實現的,提供 O(1) 的平均復雜度的查找。

1.4 Set (集合)

Set 是一個無序的、不重復的字符串集合。

用途: 點贊/關注列表、用戶標簽。

常用命令: SADD, SM REM, SISMEMBER, SCARD (個數), SRANDMEMBER (隨機成員), 集合間操作 (SINTER, SUNION, SDIFF)。

底層實現:

Hashtable: 當元素個數較少時,使用壓縮列表 (ziplist)。

Intset: 當集合中的所有成員都是整數時,Redis 會優先使用整數集合 (intset),這是一種更節省內存的實現。

1.5 Sorted Set (有序集合)

Sorted Set 是一個有序的、不重復的字符串集合。每個成員都關聯一個分數(score),Redis 會根據分數對成員進行排序。

用途: 排行榜、文章的權重排序、延時任務隊列。

常用命令: ZADD, ZREM, ZCARD, ZRANGE (按分數/索引范圍獲取), ZRANK (按索引獲取), ZSCORE (獲取分數), ZINCRBY。

底層實現:

Hashtable + Skip List: Redis 使用一個散列表 (hashtable) 來存儲成員和分數的映射,實現 O(1) 的平均查找。同時,使用 跳躍表 (Skip List) 來存儲成員和分數,并根據分數進行排序,實現 O(log N) 的插入、刪除和查找。

Ziplist: 當集合中的成員數量和元素值都比較小時,Sorted Set 也會使用 壓縮列表 (ziplist) 來優化內存。

1.6 Bitmaps (位圖) & HyperLogLog

Bitmaps: 將字符串看作一個大的位數組,可以對單個比特位進行設置和獲取。

用途: 用戶簽到統計、在線狀態跟蹤。

命令: SETBIT, GETBIT, BITCOUNT, BITOP (位運算)。

HyperLogLog (HLL): 一種概率性數據結構,用于基數統計(Cardinality Estimation),即統計一個集合中不重復元素的數量。即使數據集非常龐大,HLL 也能以極小的內存占用(約 12KB)提供非常接近準確的估計值。

用途: 統計網站 UV、直播觀看人數、用戶標簽數量。

命令: PFADD, PFCOUNT, PFMERGE。

1.7 Geospatial (地理空間索引)

Redis 3.2 引入了地理空間索引,支持根據經度和緯度進行存儲和查詢。

用途: 附近的人/地點查找。

命令: GEOADD, GEORADIUS, GEODIST, GEOHASH, GEOPOS。

底層實現: 使用 Sorted Set 來存儲地理位置信息,通過將二維坐標編碼為一維的 zset 分數來實現。

第二章:Redis 數據持久化——內存數據的“保鮮之道”

Redis 是一個內存數據庫,數據存儲在內存中,操作速度快。但一旦 Redis 進程關閉或服務器斷電,內存中的數據就會丟失。為了解決這個問題,Redis 提供了兩種持久化機制:RDB (Redis Database) 快照 和 AOF (Append Only File) 日志。

2.1 RDB (Redis Database) 快照

RDB 持久化是指在指定的時間間隔內,將內存中的數據集以快照的形式周期性地保存到磁盤上的一個二進制文件(dump.rdb)中。

工作原理:

Redis 使用 fork() 系統調用創建一個子進程。

子進程繼承父進程的內存副本,并通過寫時復制(Copy-On-Write, COW)機制。當父進程修改內存中的數據時,子進程會復制需要修改的部分,以保證數據的一致性。

子進程完成后,將內存快照寫入 RDB 文件。

父進程繼續接收客戶端請求,并修改內存數據。

優點:

生成緊湊的二進制文件: RDB 文件體積小,易于傳輸和備份。

完全備份: RDB 文件包含了某個時間點上的完整數據庫狀態。

恢復速度快: 加載 RDB 文件時,Redis 可以快速地將數據恢復到內存中。

不阻塞主進程: RDB 保存操作由子進程完成,主進程可以繼續處理讀寫請求。

缺點:

數據丟失風險: 由于是周期性快照,如果服務器在兩次快照之間發生故障,期間發生的數據修改將丟失。

fork() 操作的開銷: 當數據集非常大時,fork() 操作可能會消耗較多的 CPU 和內存資源,尤其是在主 Redis 進程還在處理寫請求時。

配置參數 (redis.conf):

<REDIS>

# RDB 持久化配置

# 900秒(15分鐘)內,如果至少有1個key被修改

save 900 1

# 300秒(5分鐘)內,如果至少有10個key被修改

save 300 10

# 60秒(1分鐘)內,如果至少有10000個key被修改

save 60 10000

# RDB 文件名

dbfilename dump.rdb

# RDB 文件保存目錄

dir /var/lib/redis/

2.2 AOF (Append Only File) 日志

AOF 持久化會將 每一個 客戶端寫操作命令都記錄到一個 AOF 文件中。當 Redis 重啟時,會重新執行 AOF 文件中的所有命令,將數據恢復到內存。

工作原理:

客戶端發送寫命令。

Redis 將該寫命令追加到 AOF 緩沖區的末尾。

根據 appendfsync 的策略,將 AOF 緩沖區的內容寫入 AOF 文件。

appendfsync always: 每一次寫命令都立即寫入 AOF 文件,并立即將數據同步到磁盤。最安全,但性能最低。

appendfsync everysec (默認): 每秒將 AOF 緩沖區的內容寫入 AOF 文件一次,并同步到磁盤。兼顧了安全性和性能。

appendfsync no: 不主動將 AOF 緩沖區寫入磁盤,而是交給操作系統異步寫入。性能最高,但數據丟失風險最大。

當 AOF 文件過大時,Redis 會啟動 AOF 重寫 (AOF Rewrite) 機制,將內存中的數據重新以命令的形式寫入一個新的 AOF 文件,從而壓縮文件大小。Rewrite 操作是異步進行的。

優點:

數據丟失風險小: 相比 RDB,AOF 的數據丟失風險極低(everysec 模式下最多丟失 1 秒的數據)。

可讀性強: AOF 文件是文本格式,人類可讀,可以手動修改(盡管不推薦,容易破壞數據)。

命令恢復: 通過重放命令恢復數據,數據一致性更好。

缺點:

文件體積大: AOF 文件記錄了每一個寫命令,體積通常比 RDB 文件大。

恢復速度慢: 重放大量命令比加載 RDB 文件慢。

寫操作開銷: appendfsync always 和 everysec 都會涉及到 fsync 系統調用,這對性能有影響。

配置參數 (redis.conf):

<REDIS>

# 是否開啟 AOF 持久化

appendonly yes

# AOF 文件名

appendfilename "appendonly.aof"

# AOF 同步策略

# appendfsync always # 每次寫入都同步,最安全

appendfsync everysec # 每秒同步一次,數據丟失最少,推薦

# appendfsync no # 由操作系統決定何時同步,性能最高,風險最大

# AOF Rewrite 相關配置

auto-aof-rewrite-percentage 100 # 當前 AOF 文件大小超過上一次重寫后增長多少百分比時觸發重寫

auto-aof-rewrite-min-size 64mb # 觸發重寫的最小文件大小

2.3 RDB 和 AOF 的選擇與組合

RDB: 適合做全量備份,可以定期生成 RDB 快照(例如每天一次)用于災難恢復。

AOF: 適合記錄增量數據,保證高可用性。

推薦組合: 同時開啟 RDB 和 AOF。Redis 會優先使用 AOF 文件來恢復數據(如果 AOF 文件存在)。RDB 則可以定期用于備份。這種組合兼顧了數據可靠性和恢復效率。

第三章:Redis 集群——高可用與高擴展的基石

當單個 Redis 實例的內存或 QPS 無法滿足需求時,就需要引入 Redis 集群方案。Redis 提供了多種集群方案,其中 Redis Cluster 是官方推薦的、原生支持高可用和高擴展的分布式解決方案。

3.1 Redis Cluster 核心概念

槽 (Slot): Redis Cluster 將整個數據集劃分為 16384 個哈希槽 (hash slots)。每個鍵 (key) 都會被計算一個哈希值,然后映射到這 16384 個槽中的一個。

主從復制 (Master-Replica Replication): 每個槽都可以被復制到多個 Redis 節點上,形成主從關系。主節點負責寫操作,從節點負責讀操作(只讀)。

數據分片 (Sharding): 通過將不同的哈希槽分配給不同的節點,數據被分散存儲在不同的 Redis 實例上,實現了數據的水平擴展。

hash(key) -> slot -> node

自動故障轉移 (Automatic Failover): 當主節點發生故障時,從節點可以自動升級為主節點,保證集群的可用性。

高可用性: 通過主從復制和自動故障轉移,確保即使部分節點宕機,服務仍然可用。

高擴展性: 通過增加更多節點,可以存儲更多數據,并分擔更多的請求壓力。

3.2 Redis Cluster 的工作流程

客戶端連接: 客戶端可以選擇連接到集群中的任意一個主節點。

槽查找: 當客戶端嘗試對一個鍵執行命令時,客戶端會計算該鍵的哈希值,并找到對應的槽。

轉向 (Redirection):

如果客戶端連接的節點不負責該槽,該節點會返回一個 MOVED 錯誤,告知客戶端正確的節點地址。

客戶端收到 MOVED 錯誤后,會自動更新本地的槽位信息,并重新向正確的節點發送命令。

PoinTTs 模式 (Smart Clients): 為了減少客戶端的轉向次數,現代 Redis 客戶端支持 PoinTTs 模式,它們會維護一個槽到節點的映射表,并緩存起來。

執行命令: 命令最終被發送到負責該槽的主節點上執行。

數據寫入/同步: 主節點執行寫命令,并將數據同步給其所有從節點。

讀操作: 讀操作可以分發到主節點或從節點。

3.3 Redis Cluster 的一致性

Redis Cluster 遵循 CAP 定理 中的 CP (Consistency, Partition Tolerance) 模型。

一致性 (Consistency): 在正常網絡環境下,所有節點都應持有最新的數據。

分區容忍性 (Partition Tolerance): 在網絡分區(節點間無法通信)的情況下,集群可以繼續提供服務(但可能會降低一致性)。

可用性 (Availability): 在網絡分區期間,如果發生主從切換,可能會出現短暫的不可用。

注意: Redis Cluster 存在“最終一致性”。在主節點寫入數據后,到數據完全同步給所有從節點之間,可能存在一個很短的延遲。在此期間,如果該主節點宕機,數據可能會丟失。 cluster-replica-no-failover 配置項在一定程度上規避了這個問題(如果設為 yes,主節點宕機后,復制該主節點的從節點不會自動升級)。

3.4 搭建和管理 Redis Cluster

redis-cluster-cli: Redis 官方提供了一個命令行工具 redis-cli,可以通過 -c 參數啟用 Cluster 模式。redis-cluster-cli 可以用于創建集群、添加/刪除節點、槽遷移、故障轉移等操作。

Redis Sentinel: 在 Redis Cluster 出現之前,Sentinel 是 Redis 高可用的解決方案。Sentinel 是一個獨立的進程,用于監控 Redis 主節點和從節點,當主節點故障時,Sentinel 會自動進行故障轉移,將從節點晉升為新的主節點。Redis Cluster 集成了 Sentinel 的一部分監控和故障轉移機制。

3.5 其他集群/高可用方案

Redis Sentinel: 如上所述,用于提供哨兵管理的主從高可用方案。

Codis (由豌豆莢開發): 一款 Redis 集群方案,它將 Redis 的數據分片、集群管理、路由等功能放在一個獨立的 Proxy 層實現。Proxy 層負責將客戶端請求路由到正確的 Redis 節點。Codis 優點在于靈活,不要求 Redis 本身支持 Cluster 協議,但增加了額外的 Proxy 層。

Twemproxy (Twitter Proxy): 一個輕量級的 Redis 和 Memcached 代理,用于提供連接池和分片功能。它本身不提供高可用性,需要與其他的 HA 方案結合。

第四章:調優策略與實踐建議

4.1 數據結構選擇的藝術

優先使用特化數據結構: 如 Hash, Set, Sorted Set, List,它們通常比 String 加上復雜邏輯更高效。

考慮 SDS、ziplist、intset、Skip List: 當你的數據量和范圍符合特定結構(如短字符串、整數集合、有序集合)的優化條件時,Redis 會自動選用更節省內存的底層實現。

合理使用 Bitmaps 和 HyperLogLog: 對于計數、狀態跟蹤、基數統計等場景,它們能提供極致的內存效率。

4.2 持久化策略的權衡

生產環境首選“RDB + AOF (everysec)”組合: 兼顧了備份的數據完整性和低數據丟失風險。

根據業務對數據丟失的敏感度調整: 如果數據丟失是毀滅性的,可以考慮 appendfsync always,但要注意其性能影響。

AOF 重寫: 確保 auto-aof-rewrite-percentage 和 auto-aof-rewrite-min-size 設置合理,避免 AOF 文件過大。Redis 4.0 以后,AOF 可以與 RDB 混合持久化 (Coalescing)。

RDB 備份: 定期將 RDB 文件備份到安全的地方,并測試恢復流程。

4.3 Redis Cluster 最佳實踐

節點數量: 建議集群至少有 3 個主節點,并為每個主節點配置至少一個從節點,以保證高可用性。

槽分配: 盡量將 16384 個槽均勻分配到每個主節點上,以實現負載均衡。

槽遷移: 在擴容或縮容時,使用 redis-cluster-cli --cluster reshard 進行槽的遷移,盡量平滑地進行。

客戶端: 使用支持 Redis Cluster 協議的 Redis 客戶端,并啟用 PoinTTs 模式。

監控: 密切監控集群狀態,包括節點連接、槽分配、主從同步、CPU/內存、命令執行延遲等。

數據一致性: 理解 Redis Cluster 提供的“最終一致性”,并在應用設計中考慮如何處理短暫的不一致。

4.4 內存優化與性能調優

maxmemory 配置: 設置 Redis 的最大內存限制,并指定驅逐策略(maxmemory-policy,如 volatile-lru, allkeys-lru),防止 Redis 耗盡系統內存,導致 OOM KILL。

Lua 腳本: 將多個 Redis 命令打包成一個 Lua 腳本在服務器端執行,可以減少網絡往返次數,提高效率。

管道 (Pipeline): 將多個 Redis 命令打包發送給 Redis 服務器,服務器會連續執行所有命令并將結果打包返回。這可以顯著減少網絡開銷。

連接池: 在客戶端使用連接池,避免頻繁地創建和關閉 TCP 連接。

CPU 核心分配: 考慮為 Redis 分配專門的 CPU 核心,避免與其他進程爭搶 CPU 資源,尤其是在高負載場景下。

結論

Redis 強大而復雜,其核心數據結構、持久化機制和集群方案共同構成了其在高性能、高可用、高擴展領域的基石。

數據結構: 理解它們的設計原理,是巧妙利用 Redis 的關鍵。

持久化: 是數據安全可靠的關鍵,需要根據業務需求權衡 RDB、AOF 的使用。

集群: 是應對海量數據和高并發的必然選擇,Redis Cluster 提供了原生、強大的解決方案。

深入掌握這些核心概念,并結合實際應用場景進行細致的調優和實踐,才能真正發揮 Redis 的價值,為你的應用程序注入強勁的動力。

通過本文的學習,希望你對 Redis 有了更深層次的認識,并能將其應用于實際工作中,構建出更優、更穩定的系統。

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

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

相關文章

HTTPS優化簡單總結

性能損耗選擇橢圓曲線&#xff0c;并生成橢圓曲線的計算耗時CA證書驗證的耗時計算pre-master的耗時硬件優化HTTPS是計算密集型任務&#xff0c;不是IO密集型任務所以硬件最好買更高級的CPU&#xff0c;而不是網卡&#xff0c;磁盤協議優化ECDHE代替RSA&#xff0c;因為ECDHE可以…

從IFA再出發:中國制造與海信三筒洗衣機的“答案”

當全球消費電子行業的目光再次聚焦柏林&#xff0c;柏林國際電子消費品展覽會(IFA2025)不僅成為創新產品的秀場&#xff0c;更悄然變身為中國企業講述全球化進階故事的重要舞臺。近日&#xff0c;海信旗下三筒洗衣機——棉花糖Ultra全家筒迎來它的國際首秀&#xff0c;首次海外…

c++工程如何提供http服務接口

在 C 工程里給類似 /index/api/ 的服務&#xff0c;基本步驟如下&#xff1a; 選一個HTTP服務框架&#xff1b;起一條監聽線程&#xff08;或線程池&#xff09;&#xff1b;把路徑-處理函數注冊進去&#xff1b; 下面是 2 種簡單的方案。方案 A&#xff1a;Crow&#xff08;He…

cfshow-web入門-php特性

web89 <?php ? include("flag.php"); highlight_file(__FILE__); ? if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("no no no!");}if(intval($num)){echo $flag;} } 正則匹配檢查不能是數字&#xff0c;但…

ctfshow - web - 命令執行漏洞總結(二)

web73該題目沒有開啟web72的open_basedir&#xff0c;所以可以使用var_export(scandir(/));exit();進行目錄掃描。讀取文件函數&#xff1a;require_once()web74scandir()函數被禁用&#xff0c;使用glob://偽協議進行讀取根目錄文件。cvar_export(glob(../../../*));exit(); c…

如何將視頻從安卓手機傳輸到電腦?

無論你是否是視頻愛好者&#xff0c;你可能都希望知道如何將視頻從安卓手機傳輸到電腦&#xff0c;以釋放存儲空間并防止性能問題。這也有助于同步視頻或防止意外刪除。在本文中&#xff0c;我們將探索七種高效的傳輸方法。方法 1&#xff1a;僅通過 USB 將手機視頻發送到電腦許…

Pico 4 Enterprise(企業版)與Unity的交互-有線串流調試篇

入手了Pico 4 E做VR開發&#xff0c;誰知入了天坑...根據官方文檔&#xff0c;嘗試了串流助手、企業串流、PICO Developer Center&#xff0c;陷入了各種版本問題、環境問題的陷阱。而且Pico4E的OS自24年12開始就不再更新&#xff0c;頭盔中預裝的企業串流版本也較低&#xff0…

redis里多線程的應用具體在哪些場景

Redis 6.0 引入的多線程I/O&#xff0c;?特指用于處理網絡數據的讀取&#xff08;read&#xff09;和寫入&#xff08;write&#xff09;/解析&#xff08;parse&#xff09;的并行化&#xff0c;而絕非將命令的執行&#xff08;真正的數據操作&#xff09;變成多線程。這是一…

DI-GAN:基于深度學習的動態形變多模光纖透反射光控制

DI-GAN:基于深度學習的動態形變多模光纖透反射光控制 1 論文核心概念 本文提出了一種名為 DI-GAN(Deep Imaging Generative Adversarial Network) 的持續深度學習框架,用于動態形變多模光纖(MMF) 的光場控制。該框架能夠同時利用透射和反射信息,實現對光纖末端光場的實…

【深度學習新浪潮】具身智能中使用到的世界模型是什么?

在具身智能中,世界模型(World Model) 是智能體對物理環境的內在“認知地圖”,它通過學習環境的動態規律(如物體運動、物理交互、因果關系等),實現對未來狀態的預測、對過去狀態的反推,以及對未觀測狀態的補全。其核心價值在于:讓智能體無需頻繁與真實環境交互,就能在…

Qt_UI界面的設計

一、設置UI窗口大小二、接收框只讀三、下拉選項雙擊添加選項1是添加&#xff0c;2是調整順序四、標簽字體居中字體大小五、發送框六、按鈕七、透明框&#xff08;可以放標簽或圖片啥的&#xff09;設置最小寬度八、水平布局九、垂直布局十、彈簧&#xff08;方便給水平垂直布局…

FTP文件傳輸服務

一、FTP協議、服務器FTP&#xff1a;文件傳輸協議&#xff08;用于網絡文件雙向傳輸的應用層協議&#xff09;特點&#xff1a;最廣泛、最底層、較簡單&#xff0c;但是明文傳輸&#xff1b;適用于較大文件的傳輸1.常見客戶端、服務器客戶端&#xff1a;WINSCP or filezilla&am…

Nginx運維之路(Docker多段構建新版本并增加第三方模塊)

喜大普奔&#xff0c;前兩天發現Nginx竟然自帶支持了ACME功能&#xff0c;讓我很想測試一下&#xff0c;但是發現手頭沒有資源讓我測試&#xff0c;忽然我想到可以用docker來構建nginx然后測試ACME功能&#xff0c;在這個過程中發現原來官方Nginx鏡像并沒有集成ACME插件&#x…

DrissionPage 優化天貓店鋪商品爬蟲:現代化網頁抓取技術詳解

概述在網絡數據采集領域&#xff0c;傳統的爬蟲方法通常面臨反爬機制、動態內容加載和效率低下等挑戰。本文將以天貓店鋪商品爬蟲為例&#xff0c;詳細介紹如何從傳統的 Requests 庫遷移到更現代化的 DrissionPage 解決方案&#xff0c;實現更高效、穩定的數據采集。----------…

pytest并發測試,資源問題導致用例失敗解決辦法

遇見的問題&#xff1a; 測試用例使用thrift資源和redis資源&#xff0c;單獨運行case沒有問題&#xff0c;但是使用并發pytest-xdist&#xff08;-n 10 和 --distloadscope&#xff09;運行失敗原因&#xff1a; 測試用例間存在共享資源競爭&#xff08;如 Redis、Thrift 連接…

C 盤又滿了?6 個「零風險清理法」+5 款神器,讓電腦瞬間多出 100GB 空間

你是否遇到過這樣的場景&#xff1a;正在趕工寫報告&#xff0c;突然彈出「C 盤存儲空間不足」的警告&#xff1b;想安裝新軟件&#xff0c;卻因為 C 盤爆紅而反復失敗&#xff1b;甚至電腦越來越卡&#xff0c;開機要等 5 分鐘&#xff0c;打開文件夾都要轉圈…… 作為系統盤…

Android 項目:畫圖白板APP開發(四)——筆鋒(單 Path)

上一章講解了如何通過多個 Path 疊加形成筆鋒效果&#xff0c;還有另外的方式實現筆鋒&#xff0c;并且只需要一條Path就可以了。在講解具體方案之前&#xff0c;我們需要了解一個有意思的工具 PathMeasure &#xff0c;這是一個非常強大且實用的工具&#xff0c;常用于高級動畫…

從C++開始的編程生活(7)——取地址運算符重載、類型轉換、static成員和友元

前言 本系列文章承接C語言的學習&#xff0c;需要有C語言的基礎才能學會哦~ 第7篇主要講的是有關于C的取地址運算符重載、類型轉換、static成員和友元。 C才起步&#xff0c;都很簡單 目錄 前言 取地址運算符重載 const成員函數 基本語法 特點 取地址運算符重載 類型轉換…

SQL 入門指南:排序與分頁查詢(ORDER BY 多字段排序、LIMIT 分頁實戰)

在 SQL 查詢中&#xff0c;我們常需要 “按報名時間先后看活動名單”“只看第 2 頁的活動報名數據”—— 這些需求靠基礎查詢無法實現&#xff0c;而ORDER BY&#xff08;排序&#xff09; 和LIMIT&#xff08;分頁&#xff09; 就是解決這類問題的核心工具。今天我們用 “校園…

jodconverter將word轉pdf底層libreoffice的問題

近期項目中使用了word轉pdf的功能&#xff0c;其中借助了遠程服務的jodconverter來處理。 <dependency><groupId>org.jodconverter</groupId><artifactId>jodconverter-remote</artifactId><version>4.4.2</version> </dependen…