【Redis#8】Redis 數據結構 -- Zset 類型

一、引言

定義:有序集合(Zset)是Redis中的一種數據結構,它結合了哈希表和跳躍列表的特性。每個 member 都有一個分數(score),根據這個分數進行排序。

特點

  • member 不能重復,但分數可以相同(理解:一次考試之后,每個人的每個科目都只有一個唯一的分數,但這些不同科目的分數允許相同)
  • 通過分數實現有序性。
  • 支持范圍查詢、排名計算等功能。

二、Set 命令

象常用命令如下表(點擊命令可查看命令詳細說明)。

命令說明時間復雜度
BZPOPMAX key [key …] timeout]從一個或多個排序集中刪除并返回得分最高的成員,或阻塞,直到其中一個可用為止O(log(N))
BZPOPMIN key [key …] timeout]從一個或多個排序集中刪除并返回得分最低的成員,或阻塞,直到其中一個可用為止O(log(N))
ZADD key [NXXX] [CH] [INCR] score member [score member …]添加到有序set的一個或多個成員,或更新的分數,如果它已經存在O(log(N))
ZCARD key獲取一個排序的集合中的成員數量O(1)
ZCOUNT key min max返回分數范圍內的成員數量O(log(N))
ZINCRBY key increment member增量的一名成員在排序設置的評分O(log(N))
ZINTERSTORE相交多個排序集,導致排序的設置存儲在一個新的關鍵O(NK)+O(Mlog(M))
ZLEXCOUNT key min max返回成員之間的成員數量O(log(N))
ZPOPMAX key count刪除并返回排序集中得分最高的成員O(log(N)*M)
ZPOPMIN key count刪除并返回排序集中得分最低的成員O(log(N)*M)
ZRANGE key start stop WITHSCORES根據指定的index返回,返回sorted set的成員列表O(log(N)+M)
ZRANGEBYLEX key min max LIMIT offset count返回指定成員區間內的成員,按字典正序排列, 分數必須相同。O(log(N)+M)
ZREVRANGEBYLEX key max min [LIMIT offset count]返回指定成員區間內的成員,按字典倒序排列, 分數必須相同O(log(N)+M)
ZRANGEBYSCORE key min max [WITHSCORES]返回有序集合中指定分數區間內的成員,分數由低到高排序。O(log(N)+M)
ZRANK key member確定在排序集合成員的索引O(log(N))
ZREM key member member […]從排序的集合中刪除一個或多個成員O(M*log(N))
ZREMRANGEBYLEX key min max刪除名稱按字典由低到高排序成員之間所有成員。O(log(N)+M)
ZREMRANGEBYRANK key start stop在排序設置的所有成員在給定的索引中刪除O(log(N)+M)
ZREMRANGEBYSCORE key min max刪除一個排序的設置在給定的分數所有成員O(log(N)+M)
ZREVRANGE key start stop [WITHSCORES]在排序的設置返回的成員范圍,通過索引,下令從分數高到低O(log(N)+M)
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]返回有序集合中指定分數區間內的成員,分數由高到低排序。O(log(N)+M)
ZREVRANK key member確定指數在排序集的成員,下令從分數高到低O(log(N))
ZSCORE key member獲取成員在排序設置相關的比分O(1)
ZUNIONSTORE添加多個排序集和導致排序的設置存儲在一個新的關鍵O(N)+O(M log(M))
ZSCAN key cursor [MATCH pattern] [COUNT count]迭代sorted sets里面的元素O(1)

1. 普通命令🧱

1.1 ZADD & ZINCRBY

ZADD:添加或者更新指定的元素以及關聯的分數到zset中,分數應該符合double類型,+inf/-inf作為正負極限也是合法的。

語法

ZADD key [NX | XX] [GT | LT] [CH] [INCR] score member [score member ...]

ZADD 的相關選項:

  • XX:僅僅用于更新已經存在的元素,不會添加新元素。
  • NX:僅用于添加新元素,不會更新已經存在的元素。
  • LT/GT:這個選項的意思是 less than 和 greater than 的意思,這兩個意思表示的是現在如果要進行更新分數,那么如果當前的分數比之前的分數小,就更新成功,否則就不更新,反之同理
  • CH:默認情況下,ZADD返回的是本次添加的元素個數,但指定這個選項之后,就會還包含本次更新的元素的個數。
  • INCR:此時命令類似ZINCRBY的效果,將元素的分數加上指定的分數。此時只能指定一個元素和分數。

時間復雜度:O(log(N))

對于 zset 來說,時間復雜度就不一樣了,在 set 中的各項操作基本都是 O(1) 的時間復雜度,而在 zset 中卻被放到了 O(logn),這是因為畢竟是有序結構,要找到合適的位置才能放,所以這里是 logn,那為什么不是 O(n) 呢?其實更多的是借助了跳表這樣的數據結構,可以快速定位到對應的位置,進行元素的插入工作

案例如下

127.0.0.1:6379> zadd myzset 10 one 20 two
(integer) 2
127.0.0.1:6379> zrange myzset
(error) ERR wrong number of arguments for 'zrange' command
127.0.0.1:6379> zrange myzset 0 -1
1) "one"
2) "two"
127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "one"
2) "10"
3) "two"
4) "20"
127.0.0.1:6379> zadd myzset CH 100 one
(integer) 1
127.0.0.1:6379> zadd myzset INCR 20 two
"40"127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "two"
2) "40"
3) "one"
4) "100"

ZINCRBY:為指定的元素的關聯分數添加指定的分數值

語法

ZINCRBY key increment member
1.2 ZCARD & ZCOUNT & ZSCORE

ZCARD:獲取一個zset的基數(cardinality),即zset中的元素個數(語法:ZCARD key

ZCOUNT:計算分數范圍內的元素數量(語法:ZCOUNT key min max

ZSCORE:返回指定元素的分數

使用如下

127.0.0.1:6379> ZCARD myzset
(integer) 2
127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "two"
2) "40"
3) "one"
4) "100"127.0.0.1:6379> ZCOUNT myzset 0 50
(integer) 1
127.0.0.1:6379> ZCOUNT myzset (0 (40 # ( 表示開區間
(integer) 0
127.0.0.1:6379> ZCOUNT myzset -inf inf
(integer) 2127.0.0.1:6379> ZSCORE myzset "one"
"100"
1.3 ZRANGE & ZREVRANGE & ZRANGEBYSCORE

ZRANGE升序 獲取指定區間內的元素(語法:ZRANGE key start stop [WITHSCORES]withcores 參數:每個元素的下一行是它的socre

語法:ZRANGE key start stop [WITHSCORES]

  • 升序 返回[start, stop]區間內的元素,如果帶上withscores則將score一起返回。

  • 此處的startstop不是分數,而是元素的排名(下標),從0開始,支持負數

ZREVRANGE:獲取指定區間內的元素(降序),和 ZRANGE 基本沒啥區別

ZRANGEBYSCORE:獲取指定分數范圍內的元素

語法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

  • 按升序返回score[min, max]區間內的元素,如果帶上withscores則將score一起返回。
  • 之前的zrange是通過元素排名返回,zrangebyscore則是通過score區間返回。
  • 備注:這個命令可能在6.2.0之后廢棄,并且功能合并到ZRANGE中

時間復雜度均為:O(log(N)+M)

案例如下

127.0.0.1:6379> zrevrange myzset 0 -1 WITHSCORES
1) "one"
2) "100"
3) "two"
4) "40"127.0.0.1:6379> ZRANGEBYSCORE myzset (1 (100
1) "two"
1.4 ZPOPMAX|MIN & BZPOPMAX|MIN

ZPOPMAX:刪除并返回分數最高的count個元素

  • 如果多個元素的score相同,那么會按照member的字典序進行比較,字典序高的先刪除

ZPOPMIN:刪除并返回分數最小的count個元素

BZPOPMAX:讀取并刪除zset最大元素,如果沒有元素則陷入阻塞

  • 可以設置超時時間timeout,以秒為單位,如果超過時間了,返回nil
  • 如果超時時間設置為0,則一直阻塞,不會超時。

BZPOPMIN:ZPOPMIN 的阻塞版本

案例如下

127.0.0.1:6379> zpopmax myzset
1) "one"
2) "100"
127.0.0.1:6379> bzpopmin myset 10 
(nil)
(10.03s)127.0.0.1:6379> bzpopmin myzset 10 
1) "myzset"
2) "two"
3) "40"
1.5 ZRANK & ZREVRANGE

ZRANK:獲取成員的下標

  • 命令ZRANK key memberZREVRANK key member
  • 返回指定元素member的排名,這個排名就是socre從小到大的順序,從0開始排,也可以當作下標

ZREVRANGE: 返回指定元素member的排名,這個排名就是socre從大到小的順序,從0開始排

1.6 ZREM & ZREMRANGEBYRANK & ZREMRANGEBYSCORE

ZREM:刪除指定的元素(語法:ZREM key member [member ...]

ZREMRANGEBYRANK:按照排名刪除元素(語法:ZREMRANGE BYRANK key start stop

ZREMRANGEBYSCORE:按照分數刪除元素(語法:ZREMRANGE BYSCORE key min max

2. 集合間操作

2.1 ZINTERSTORE – 交集

image-20250701141103347

  • 功能:求出給定有序集合中元素的交集并保存進?標有序集合中,在合并過程中以元素為單位進?合并,元 素對應的分數按照不同的聚合方式和權重得到新的分數

  • 語法ZINTERSTORE dest numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE]

    • 注意:numkeys必須準確填寫,以便后面將參數準確解析
    • destination :輸出結果到給zset中
    • numkeys:指定后續輸入的key的個數(后面會詳細講解
    • weights:權重,每一個zset都配一個weight,計算時score乘對應的weight
    • aggreate:score的合并方式
    • sum:求和(默認值)
    • min:取最小
    • max:取最大
  • 返回值:目標集合中的元素個數

  • 時間復雜度O(N?K)+O(M?log(M))O(N?K)+O(M?log(M))O(N?K)+O(M?log(M)),N是輸?的有序集合中最小的有序集合的元素個數,K是輸入了幾個有序集合,M是最終結果的有序集合的元素個數

這時間復雜度怎么來的?取決于源碼,我們學習的是一種 解決問題 的能力,可以分解為兩部分來理解:

  • O(N?K)O(N*K)O(N?K) :這部分表示了在遍歷所有輸入有序集合時所需的時間。對于每個元素,都需要檢查它是否存在于其他所有有序集合中。這里假設最壞情況下,每次查找操作都是線性的,即需要檢查整個集合。因此,如果最小的集合有 N 個元素,而總共有 K 個集合,則總的比較次數大約為 N * K。這解釋了 O(N?K)O(N*K)O(N?K) 的部分。
  • O(M?log(M))O(M*log(M))O(M?log(M)): 當確定哪些元素應該被加入到結果集中后,這些元素需要根據它們的分數進行排序以形成一個新的有序集合。即使Redis內部使用了高效的數據結構(如跳表)來保持有序性,將 M 個元素插入這樣一個數據結構并保持其有序通常需要 O(M*log(M)) 的時間。這是因為每插入一個元素可能需要調整數據結構,使得插入操作平均來說接近于 log(M) 的時間復雜度。

ZINTERSTORE 操作首先通過遍歷和比較各集合中的元素來找到交集成員,然后對這些成員按分數排序,從而形成了上述的時間復雜度公式。這種設計保證了即使在處理較大規模數據時也能相對高效地完成交集運算。不過,實際性能還會受到具體實現細節、數據分布等因素的影響。

樣例

127.0.0.1:6379> zadd zset1 20 a 12 b
127.0.0.1:6379> zadd zset2 1 a 5 b127.0.0.1:6379> zinterstore zset3 2 zset1 zset2 weights 1 100 aggregate sum
(integer) 2
127.0.0.1:6379> zrange zset3 0 -1 WITHSCORES
1) "a"
2) "120"
3) "b"
4) "512"

此處創建了兩個zset,通過zinterstore合并,其中zset1的權重是1,zset2的權重是100,以sum方式合并。實現分數計算:最后求出交集a: 1 * 100 + 20,b: 5 * 100 + 12。

思考:關于 numkeys 參數

  • 功能:numkeys 參數指定了后續參與交集運算的 key 的數量。
  • 重要性:很多命令支持多個 key,如 zadd, mget, mset 等。通過 numkeys 明確指定 key 的個數可以避免選項和 keys 混淆,確保命令解析的準確性。

類比 HTTP 協議, HTTP 首行與請求頭:Content-Length 字段描述了請求體(正文)的長度。

粘包問題

  • 如果缺少 Content-Length 或者數據錯誤,可能會導致粘包問題。
  • TCP 特點:基于 TCP 的傳輸是面向字節流的,容易產生粘包問題。

解決粘包問題的方法

  1. 明確包的長度。
  2. 明確包的邊界。

有序集合中的元素比較

  • 成員 (member):是有序集合中元素的本質。
  • 分數 (score):僅作為輔助排序的工具。
  • 相同成員的處理:如果不同集合中的成員相同但分數不同,在進行交集合并時,最終分數如何計算取決于具體的聚合方式(如 SUM, MIN, MAX)。

有序集合的存儲與權重

  • 結果存儲:需指定一個 key 來存儲交集運算的結果。
  • 權重 (weight):在合并過程中,權重作為系數乘以當前分數,用于調整最終分數。

個人見解選擇:客觀因素相對穩定,而主觀因素變化較大。

2.2 ZUNIONSTORE – 并集

這個參數和 zinterstore 完全一致,只是從交集變成并集。

  • 功能:求出給定有序集合中元素的 并集 并保存進目標有序集合中,在合并過程中以元素為單位進行合并,元素對應的分數按照不同的聚合方式和權重得到新的分數
  • 語法:ZUNIONSTORE dest numkeys key [key ...] [WEIGHTS weight [weight ...]] [AGGREGATE ]
  • 返回值:目標集合中的元素個數

三、內部編碼

有序集合是由 ziplist (壓縮列表) 或 skiplist (跳躍表) 組成的。

1. ziplist – 壓縮鏈表

當數據比較少時,有序集合使用的是 ziplist 存儲的(減少內存使用),有序集合使用 ziplist 格式存儲必須滿足以下兩個條件:

  • 有序集合保存的元素個數要小于 zset-max-ziplist-entries 配置 (默認128個) ;
  • 有序集合保存的所有元素成員的長度都必須小于 zset-max-ziplist-value配置(默認64字節) 。

2. skiplist – 跳表

如果不能滿足以上兩個條件中的任意一個,有序集合將會使用 skiplist 結構進行存儲。

  • 跳表的定義:跳表是一種特殊的鏈表結構,具有多層次的索引機制,類似于 B+樹 的部分性質。
  • 查詢效率:由于采用了多層次索引,跳表在查詢元素時的時間復雜度為 O(logN),這意味著隨著數據量的增長,查詢效率仍然保持較高的水平。
  • 適用場景:結合了鏈表和樹的優點,提供了一種高效的范圍查詢解決方案,尤其適合大數據量下的范圍查詢需求。
關于 vs B+

特點

  • 平衡性:B+樹是一種自平衡的多路搜索樹,每個節點可以有多個子節點,這使得樹的高度保持較低。
  • 鍵值分布:所有鍵值都出現在葉子節點上,非葉子節點僅作為索引使用。
  • 有序性:葉子節點通過指針鏈接起來,形成一個有序鏈表,便于范圍查詢。
  • 磁盤友好:B+樹的設計特別適合于磁盤等塊設備的訪問模式,因為它的節點大小通常與磁盤頁大小相匹配,從而減少了I/O操作次數。

優點

  • 高效的范圍查詢:由于葉子節點是相連的,因此可以快速地進行范圍掃描。
  • 適用于數據庫和文件系統:非常適合需要頻繁讀取和寫入大量數據的應用場景。

缺點

  • 插入和刪除操作可能較復雜:當節點滿時需要分裂,空閑時需要合并或重新分配。
  • 實現較為復雜:涉及到節點分裂、合并等操作,實現起來比跳表更復雜。

四、使用場景

1. 排行榜系統

有序集合比較典型的使用場景就是排行榜系統。例如學生成績的排名。某視頻(博客等)網站的用戶點贊、播放排名、電商系統中商品的銷量排名等。我們以博客點贊為例。

① 添加用戶贊數:例如小編Tom發表了一篇博文,并且獲得了10個贊。

Copyzadd user:ranking arcticle1 10

② 取消用戶贊數:這個時候有一個讀者又覺得Tom寫的不好,又取消了贊,此時需要將文章的贊數從榜單中減去1,可以使用zincrby。

Copyzincrby user:ranking arcticle1 -1

③ 查看某篇文章的贊數

CopyZSCORE user:ranking arcticle1

④ 展示獲取贊數最多的十篇文章:此功能使用zrevrange命令實現:

Copyzrevrangebyrank user:ranking  0 9

2. 電話號碼(姓名)排序

使用有序集合的 ZRANGEBYLEXZREVRANGEBYLEX 可以幫助我們實現電話號碼或姓名的排序,我們以ZRANGEBYLEX為例
注意:不要在分數不一致的SortSet集合中去使用 ZRANGEBYLEX和 ZREVRANGEBYLEX 指令,因為獲取的結果會不準確。

① 電話號碼排序:我們可以將電話號碼存儲到SortSet中,然后根據需要來獲取號段:

Copyredis> zadd phone 0 13100111100 0 13110114300 0 13132110901 
(integer) 3
redis> zadd phone 0 13200111100 0 13210414300 0 13252110901 
(integer) 3
redis> zadd phone 0 13300111100 0 13310414300 0 13352110901 
(integer) 3

② 獲取所有號碼:

Copyredis> ZRANGEBYLEX phone - +
1) "13100111100"
2) "13110114300"
3) "13132110901"
4) "13200111100"
5) "13210414300"
6) "13252110901"
7) "13300111100"
8) "13310414300"
9) "13352110901"

③ 獲取132號段:

Copyredis> ZRANGEBYLEX phone [132 (133
1) "13200111100"
2) "13210414300"
3) "13252110901"

④ 獲取132、133號段:

Copyredis> ZRANGEBYLEX phone [132 (134
1) "13200111100"
2) "13210414300"
3) "13252110901"
4) "13300111100"
5) "13310414300"
6) "13352110901"

⑤ 姓名排序:將名稱存儲到SortSet中:

Copyredis> zadd names 0 Toumas 0 Jake 0 Bluetuo 0 Gaodeng 0 Aimini 0 Aidehua 
(integer) 6

⑥ 獲取所有人的名字:

Copyredis> ZRANGEBYLEX names - +
1) "Aidehua"
2) "Aimini"
3) "Bluetuo"
4) "Gaodeng"
5) "Jake"
6) "Toumas"

⑦ 獲取名字中大寫字母A開頭的所有人:

Copyredis> ZRANGEBYLEX names [A (B
1) "Aidehua"
2) "Aimini"

⑧ 獲取名字中大寫字母C到Z的所有人:

Copyredis> ZRANGEBYLEX names [C [Z
1) "Gaodeng"
2) "Jake"
3) "Toumas"

小結

本篇文章我們總結了Redis 有序集合對象的內部實現、常用命令以及常用的一些場景,有序集合提供了獲取指定分數和元素范圍查詢、計算成員排名等功能,合理的利用有序集合,能幫助我們在實際開發中解決很多問題。那么大家在項目中對Redis有序集合對象的使用都有哪些場景呢,歡迎在評論區給我留言和分享,我會第一時間反饋!我們共同學習與進步!

在這里插入圖片描述

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

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

相關文章

Postman 模擬mcp tool調用過程

文章目錄 初始化調用 mcp server使用modelcontextprotocol 的java sdk編寫 初始化 1.網頁訪問http://localhost:8090/sse,此頁面保持開啟,會不斷接收到sse事件. 會返回一個endpoint,例如/mcp/message?sessionId111 2.初始化請求,postman發送post請求 url:http://localhost:…

init.usb.configfs.rc的USB動態配置

1. 什么是ConfigFSConfigFS 是 Linux 內核提供的一種用戶空間可配置的偽文件系統在Linux內核中一個設備(如手機)作為USB從設備時,成為一個“Gadget”。路徑:/config/usb_gadget/,g1表示系統重第一個USB Gadget的配置實…

廣東省省考備考(第八十九天8.28)——判斷推理(聽課后強化訓練)

判斷推理:定義判斷 錯題解析 第一步:找出定義關鍵詞。 “為了明確所承運的貨物是否發生了殘損,以及殘損責任是否屬于船方”。 第二步:逐一分析選項。 A項:甲船向商檢機構申請檢查船舶卸貨前艙口、風筒的封蓋和封識情況…

【C++】C++11的右值引用和移動語義

各位大佬好,我是落羽!一個堅持學習進步的學生。 如果您覺得我的文章還不錯,歡迎多多互三分享交流,一起學習進步! 也歡迎關注我的blog主頁: 落羽的落羽 文章目錄一、C11簡介二、左值和右值是什么三、左值引用與右值引…

Logic Error: 如何識別和修復邏輯錯誤

邏輯錯誤是指程序中的代碼在語法上是正確的,但在執行時沒有按預期工作。這種錯誤可能導致程序輸出錯誤的結果或行為異常。邏輯錯誤通常比語法錯誤更難檢測,因為它們不會產生編譯或解釋錯誤。本文將詳細介紹如何識別和修復邏輯錯誤。一、識別邏輯錯誤1. 理…

TUN模式端口沖突 啟動失敗如何解決?

從日志信息來看,TUN模式啟動失敗是由于端口沖突導致的。 具體來說,Xray在嘗試監聽10808端口時失敗了,因為該端口已經被其他進程占用。 錯誤信息分析 Failed to start: app/proxyman/inbound: failed to listen TCP on 10808 > transport/i…

如何調試一個EVM合約:實戰操作 + 常見報錯說明

在Solidity開發過程中,大多數開發者最常遇到的問題不是“代碼寫不了”,而是“代碼部署了,但行為不對”。本篇文章將帶你梳理一套完整的EVM智能合約調試流程,并附上幾類真實常見報錯場景及排查方法,適用于Hardhat、Remi…

使用Wireshark分析自助終端機網絡數據

如果是明文還好, 是密文就沒辦法了。工具.1自助終端機.2組裝結構主流架構選擇?B/S架構?:通過Web應用調用本地硬件插件,開發速度快但依賴瀏覽器兼容性。 ??C/S架構?:直接調用硬件驅動,交互響應快但更新維護復雜。 …

數學建模——馬爾科夫鏈(Markov Chain Model)

數學建模——馬爾科夫鏈(Markov Chain Model)一、馬爾可夫鏈的定義1. 狀態與狀態空間2. 無后效性(馬爾科夫性)?3. 轉移概率與轉移概率矩陣(1)一步轉移概率(2)轉移概率矩陣二、馬爾科…

《拉康精神分析學中的欲望辯證法:能指的拓撲學與主體的解構性重構》

在當代人文思想圖譜中,雅克拉康以語言學為利刃對弗洛伊德理論進行的結構性重鑄構成了20世紀最具顛覆性的理論創造之一。這位被譽為"法國弗洛伊德"的思想巨匠通過"回到弗洛伊德"的口號,實則完成了對精神分析學的哥白尼式革命——將主…

數字時代下的智能信息傳播引擎

在商場、樓宇、交通樞紐等公共場所,數字廣告機已成為信息傳播的重要載體。其背后的廣告機系統,是一套集硬件控制、內容管理、網絡傳輸與數據分析于一體的綜合技術解決方案,正推動傳統靜態廣告向動態化、交互化、智能化方向演進。系統架構與核…

文獻閱讀筆記:KalmanNet-融合神經網絡和卡爾曼濾波的部分已知動力學狀態估計

文獻閱讀筆記:KalmanNet-融合神經網絡和卡爾曼濾波的部分已知動力學狀態估計摘要一、研究背景1.1 狀態估計問題的重要性1.2 傳統方法的局限:非線性與模型不確定性非線性問題噪聲統計未知問題1.3 數據驅動方法的興起與局限1.4 KalmanNet:混合方…

使用EasyExcel根據模板導出文件

文章目錄概要工具類核心功能核心代碼解析模板導出核心方法文件下載處理HTTP響應設置文件下載處理使用示例概要 在企業級應用開發中,Excel數據導出是一個常見的需求。本文實現一個基于阿里巴巴EasyExcel庫實現的根據模板導出文件的工具類,它通過預定義的…

【AI基礎:神經網絡】19、機器學習實戰:徑向基函數神經網絡(RBFN)指南

一、引言:為什么RBFN是神經網絡中的“局部專家”? 在機器學習領域,神經網絡的“全局逼近”與“局部逼近”一直是兩大核心思路。像我們熟悉的多層感知機(MLP),使用Sigmoid、ReLU等全局激活函數,每個神經元都會對整個輸入空間產生響應——就像“全員參與”處理所有數據,…

Linux 性能調優實戰:CPU、磁盤 I/O、網絡與內核參數

前言 一、CPU 資源調優 1. 調整進程優先級(nice/renice) 2. 設置 CPU 親和力(taskset) 3. 查看 CPU 信息 4. 使用 vmstat 分析系統瓶頸 二、磁盤 I/O 調優 1. ulimit 資源限制 2. 磁盤速度測試 三、內核參數調優 1. 常用…

【進階篇第五彈】《詳解存儲過程》從0掌握MySQL中的存儲過程以及存儲函數

文章目錄存儲過程一、基本語法(1)創建存儲過程(2)調用存儲過程(3)查看存儲過程(4)刪除存儲過程(5)設置結束符(6)參數二、變量(1)系統變量(2)用戶自定義變量(3)局部變量三、基本語句(1)if判斷(2)case(3)while循環(4)repeat(5)loop循環四、游標五、條件處理程序六、存儲函數存儲過…

HarmonyOS布局實戰:用聲明式UI構建自適應電商卡片

首先誠邀大家參加學習鴻蒙拿好禮活動,即日起,只要加入班級考取華為開發者基礎/高級證書,并發表一篇技術文章,就有機會獲得官方發放的精美禮品,數量有限,先到先得。冷老師的班級鏈接如下:?華為開…

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(21):文法+單詞第7回3

日語學習-日語知識點小記-構建基礎-JLPT-N3階段(21):文法單詞第7回3 1、前言(1)情況說明(2)工程師的信仰2、知識點1ー 。。。と。。。なる2ーVて欲しい ? …

Baumer高防護相機如何通過Tiny-YOLO單類模型實現人體跌倒檢測與跟蹤(C#代碼UI界面版)

《------往期經典推薦------》 AI應用軟件開發實戰專欄【鏈接】 序號項目名稱項目名稱11.工業相機 YOLOv8 實現人物檢測識別:(C#代碼,UI界面版)2.工業相機 YOLOv8 實現PCB的缺陷檢測:(C#代碼&#xff0…

從源碼看瀏覽器彈窗消息機制:SetDefaultView 的創建、消息轉發與本地/在線頁通用實踐

引言在現代瀏覽器的開發中,前端頁面和 C 內核之間的通信是一項核心功能。無論是本地設置頁(chrome:// 內置 H5)還是在線活動頁,前端都可能需要調用瀏覽器底層 API,實現諸如“設置默認瀏覽器”、“更改壁紙”、“讀取用…