Redis 基礎詳解:從入門到精通

在當今互聯網應用開發領域,數據存儲與處理的性能和效率至關重要。Redis(Remote Dictionary Server)作為一款開源的、基于內存的鍵值存儲系統,憑借其出色的性能和豐富的功能,被廣泛應用于數據庫、緩存、消息中間件等場景。本文將全面深入地講解 Redis 的核心知識,助力開發者快速掌握 Redis 并應用于實際項目。

一、Redis 簡介

Redis 由 Salvatore Sanfilippo 開發,目前由 Redis Labs 維護。它以內存作為數據的主要存儲介質,使得數據的讀寫操作極為迅速,特別適合對性能要求極高的場景。

Redis 的主要特點

  • 內存存儲:數據主要存儲在內存中,提供極高的讀寫性能,能在極短時間內完成數據的讀取和寫入,相比傳統磁盤存儲數據庫,大大提升了響應速度。
  • 持久化支持:支持 RDB(Redis Database)和 AOF(Append Only File)兩種持久化方式,確保數據在斷電或服務重啟后不會丟失,在數據安全性和性能之間取得平衡 。
  • 豐富的數據結構:不僅支持常見的字符串類型,還提供哈希、列表、集合、有序集合等多種數據結構,可滿足不同業務場景下的數據存儲和處理需求。
  • 原子操作:所有操作都是原子性的,保證了數據操作的完整性和一致性,即使多個客戶端同時對同一數據進行操作,也不會出現數據混亂的情況。
  • 發布 / 訂閱:支持消息的發布 / 訂閱模式,能夠實現高效的消息傳遞,適用于構建實時消息系統。
  • 事務支持:支持簡單的事務功能,確保多個命令要么全部執行成功,要么全部不執行,避免部分命令執行導致的數據不一致問題。
  • 高可用:通過主從復制和 Redis Sentinel 機制實現高可用,保障服務的連續性,當主節點出現故障時,能夠自動切換到從節點,繼續提供服務。
  • 分布式:Redis Cluster 提供分布式解決方案,可實現數據的分片存儲和處理,能夠輕松應對大規模數據和高并發訪問的場景。

二、Redis 安裝與配置

1. Linux 下安裝 Redis

# 下載最新穩定版,這里以6.2.6版本為例,實際可到官網獲取最新版本
wget http://download.redis.io/releases/redis-6.2.6.tar.gz
tar xzf redis-6.2.6.tar.gz
cd redis-6.2.6
make

在執行make命令時,可能會出現缺少依賴的情況。常見的依賴包括 gcc、tcl 等,需要提前安裝,可使用yum install gcc tcl(CentOS 系統)或apt-get install gcc tcl(Ubuntu 系統)命令進行安裝。

2. 啟動 Redis 服務器

src/redis-server

默認情況下,Redis 會讀取當前目錄下的redis.conf配置文件啟動。如果需要使用自定義的配置文件,可以通過src/redis-server /path/to/redis.conf指定配置文件路徑。

3. 使用 Redis 客戶端連接

src/redis-cli

連接成功后,即可在命令行中輸入 Redis 命令與服務器進行交互。如果 Redis 服務器設置了密碼,可使用src/redis-cli -a your_password命令進行連接。

三、Redis 基本數據結構與操作

1. 字符串 (String)

字符串是 Redis 最基礎的數據類型,可存儲文本、數字或二進制數據,適用于存儲簡單的鍵值對,如用戶 ID 對應的用戶名、配置項等。

# 設置鍵值
SET name "Redis"
# 獲取值
GET name
# 設置過期時間(秒),這里設置age鍵30秒后過期
SETEX age 30 "25"
# 遞增,常用于計數器場景,如點贊數、瀏覽量統計
INCR counter
# 遞減
DECR counter

對于數值類型的字符串,除了INCRDECR,還支持INCRBYDECRBY命令,可指定遞增或遞減的步長,如INCRBY counter 5counter的值增加 5。

2. 哈希 (Hash)

哈希適合存儲對象,將對象的多個屬性以字段和值的形式存儲,常用于存儲用戶信息、商品詳情等場景。

# 設置哈希字段
HSET user:1000 username antirez password P1pp0 age 34
# 獲取所有字段
HGETALL user:1000
# 獲取單個字段
HGET user:1000 username
# 設置多個字段
HMSET user:1001 username mike password 123 age 28

在處理大量哈希數據時,HSCAN命令可以用于迭代獲取哈希字段,避免一次性獲取大量數據導致的性能問題。

3. 列表 (List)

列表是簡單的字符串列表,按照插入順序排序,可用于實現消息隊列、任務隊列,或者存儲用戶的瀏覽歷史等。

# 從左側插入
LPUSH mylist "world"
LPUSH mylist "hello"
# 從右側插入
RPUSH mylist "!"
# 獲取列表范圍,0表示起始索引,-1表示結束索引
LRANGE mylist 0 -1
# 彈出元素,LPOP從左側彈出,RPOP從右側彈出
LPOP mylist
RPOP mylist

BLPOPBRPOP命令可以實現阻塞式彈出,當列表為空時,客戶端會阻塞等待,直到列表中有新元素加入,這一特性常用于實現可靠的消息隊列。

4. 集合 (Set)

集合是字符串的無序集合,不允許重復元素,適用于去重、交集、并集、差集等操作,比如統計網站的獨立訪客、獲取兩個用戶的共同關注等。

# 添加元素
SADD myset "Hello"
SADD myset "World"
# 獲取所有元素
SMEMBERS myset
# 檢查元素是否存在
SISMEMBER myset "Hello"
# 移除元素
SREM myset "World"

通過SINTER(交集)、SUNION(并集)、SDIFF(差集)等命令,可以對多個集合進行高效的集合運算。

5. 有序集合 (Sorted Set)

有序集合類似于集合,但每個元素都關聯一個分數,用于排序,常用于排行榜、計分系統等場景。

# 添加元素,分數在前,元素在后
ZADD myzset 1 "one"
ZADD myzset 2 "two" 3 "three"
# 獲取元素范圍,并顯示分數
ZRANGE myzset 0 -1 WITHSCORES
# 按分數范圍獲取
ZRANGEBYSCORE myzset 1 2

ZREVRANGE命令可以按照分數從高到低的順序獲取元素,適用于倒序排行榜的展示。

四、Redis 持久化機制

1. RDB(Redis Database)

RDB 是 Redis 默認的持久化方式,它會在指定時間間隔內將內存中的數據快照寫入磁盤。
配置示例:

save 900 1      # 900秒(15分鐘)內有1個更改
save 300 10     # 300秒(5分鐘)內有10個更改
save 60 10000   # 60秒內有10000個更改

優點:

  • 適合大規模數據恢復,因為 RDB 文件是一個完整的數據快照,恢復時直接加載即可。
  • 對性能影響小,只有在進行快照操作時會占用一定的系統資源,平時幾乎不影響 Redis 的讀寫性能。
  • 文件緊湊,便于備份和傳輸,可以方便地將 RDB 文件復制到其他服務器進行數據備份或遷移。

缺點:

  • 可能丟失最后一次快照后的數據,如果在兩次快照間隔期間 Redis 發生故障,這期間的數據將無法恢復。
  • 大數據量時保存過程可能較長,因為需要將整個內存數據寫入磁盤,可能會導致 Redis 在保存期間響應變慢。

2. AOF(Append Only File)

AOF 持久化記錄服務器接收到的所有寫操作命令,并在服務器啟動時重新執行這些命令來恢復數據。
配置示例:

appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec  # 每秒同步

優點:

  • 數據安全性更高,因為幾乎可以實時記錄所有寫操作,即使 Redis 突然宕機,最多只會丟失 1 秒的數據(當appendfsync設置為everysec時)。
  • 通過 rewrite 機制壓縮文件,Redis 會定期對 AOF 文件進行重寫,去除冗余的命令,減少文件體積。
  • 可讀性強,便于分析,AOF 文件本質上是一個記錄命令的文本文件,可以直接查看其中的操作,方便排查問題。

缺點:

  • 文件體積通常比 RDB 大,因為它記錄了每一個寫操作命令,隨著時間推移,文件會不斷增大。
  • 恢復速度比 RDB 慢,因為需要重新執行所有寫操作命令來恢復數據,數據量越大,恢復時間越長。
  • 對性能影響相對較大,特別是在appendfsync設置為always時,每次寫操作都要同步到磁盤,會降低 Redis 的寫入性能。

五、Redis 事務

Redis 事務可以一次執行多個命令,并且保證:

  1. 事務中的所有命令都會序列化并按順序執行。
  2. 執行過程中不會被其他客戶端發送的命令打斷。
  3. 沒有隔離級別的概念,即事務執行過程中不會出現臟讀、不可重復讀等問題,但也無法保證數據的并發一致性。

基本命令:

  • MULTI:標記事務開始。
  • EXEC:執行所有事務塊內的命令。
  • DISCARD:取消事務,放棄執行事務塊內的所有命令。
  • WATCH:監視一個或多個 key,如果在事務執行前這些 key 被其他客戶端修改,事務將被中斷。

示例:

MULTI
SET book-name "Redis in Action"
SET book-author "Josiah L. Carlson"
SADD book-tags "NoSQL" "Redis" "Database"
EXEC

在使用事務時,需要注意,如果事務塊中的某個命令在執行時出現錯誤,后續命令仍然會繼續執行。Redis 不會像關系型數據庫那樣進行回滾,除非使用WATCH命令監視的 key 發生變化導致事務中斷。

六、Redis 發布 / 訂閱

Redis 發布 / 訂閱 (pub/sub) 實現了消息系統,發送者 (pub) 發送消息,訂閱者 (sub) 接收消息,適用于實時消息推送、系統通知等場景。

基本命令:

  • SUBSCRIBE:訂閱一個或多個頻道。
  • PUBLISH:向頻道發布消息。
  • UNSUBSCRIBE:退訂頻道。
  • PSUBSCRIBE:訂閱匹配模式的頻道,支持通配符,如PSUBSCRIBE news.*可以訂閱所有以news.開頭的頻道。

示例:

# 客戶端1訂閱
SUBSCRIBE news# 客戶端2發布
PUBLISH news "Hello Redis!"# 客戶端1將收到消息

需要注意的是,Redis 的發布 / 訂閱是基于內存的,消息不會持久化,如果在發布消息時沒有客戶端訂閱該頻道,消息將被丟棄。同時,當有大量訂閱者時,發布消息可能會導致 Redis 性能下降,需要謹慎使用。

七、Redis Java 客戶端

1. Jedis

Jedis 是 Redis 官方推薦的 Java 客戶端,簡單易用,適合快速開發和小型項目。
Maven 依賴:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.3.1</version>
</dependency>

示例代碼:

import redis.clients.jedis.Jedis;public class JedisExample {public static void main(String[] args) {// 連接Redis,這里假設Redis運行在本地,端口為默認的6379Jedis jedis = new Jedis("localhost");// 字符串操作jedis.set("foo", "bar");System.out.println(jedis.get("foo"));// 列表操作jedis.lpush("list", "item1", "item2");System.out.println(jedis.lrange("list", 0, -1));// 關閉連接jedis.close();}
}

在實際應用中,為了提高性能和管理連接,可以使用連接池,如JedisPool。通過連接池可以復用連接,避免頻繁創建和銷毀連接帶來的性能開銷。

2. Lettuce

Lettuce 是一個高性能的 Redis 客戶端,支持異步和響應式編程,適用于高并發、高性能的場景,特別是在基于 Reactor 模式的項目中。
Maven 依賴:

<dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.2.3.RELEASE</version>
</dependency>

示例代碼:

import io.lettuce.core.RedisClient;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.sync.RedisCommands;public class LettuceExample {public static void main(String[] args) {// 創建RedisClient,這里使用默認的連接字符串格式,也可指定密碼等參數RedisClient client = RedisClient.create("redis://localhost");// 獲取連接StatefulRedisConnection<String, String> connection = client.connect();RedisCommands<String, String> commands = connection.sync();// 執行命令commands.set("key", "value");System.out.println(commands.get("key"));// 關閉連接connection.close();client.shutdown();}
}

Lettuce 還提供了豐富的異步 API,通過RedisAsyncCommandsRedisReactiveCommands接口,可以實現非阻塞的異步操作,充分利用系統資源,提高應用的并發處理能力。

八、Redis 應用場景

  1. 緩存系統:作為緩存系統,Redis 可以存儲熱點數據,減輕數據庫壓力,提高系統響應速度。例如,將頻繁訪問的商品詳情、新聞資訊等數據緩存到 Redis 中,減少對數據庫的查詢次數。
  2. 計數器:利用INCR/DECR等命令實現點贊數、瀏覽量、評論數等統計功能,高效且原子性強。
  3. 排行榜:使用有序集合實現實時排行榜,如游戲排行榜、音樂排行榜等,通過分數進行排序,方便快捷地獲取排名信息。
  4. 消息隊列:利用列表的阻塞操作實現簡單消息隊列,如BLPOPBRPOP,可以實現生產者 - 消費者模型,用于異步任務處理、日志收集等場景。
  5. 會話緩存:存儲用戶會話信息,如登錄狀態、購物車數據等,提高用戶體驗和系統性能。
  6. 分布式鎖:利用SETNX(Set If Not Exists)命令實現分布式鎖,確保在分布式環境下多個進程或線程對共享資源的互斥訪問,避免數據競爭和不一致問題。
  7. 社交網絡:實現關注、粉絲、共同好友等功能,通過集合的交集、并集、差集運算,可以高效地處理社交關系數據。
  8. 實時系統:處理實時數據,如實時分析、實時監控,Redis 的高速讀寫性能能夠滿足實時數據處理的需求,例如實時統計網站的訪問量、監控系統的指標數據等。

九、Redis 性能優化建議

  1. 合理使用數據結構:根據業務場景選擇最適合的數據結構,例如,需要有序存儲和排序時使用有序集合,需要去重和集合運算時使用集合,避免因數據結構選擇不當導致性能低下。
  2. 批量操作:使用MSETMGET、Pipeline 等批量操作命令,減少網絡開銷。Pipeline 可以將多個命令打包發送到 Redis 服務器,一次性執行,大大提高執行效率。
  3. 避免大 Key:單個 Key 的 Value 不宜過大,過大的 Value 會占用過多內存,同時在讀取和寫入時會增加網絡傳輸時間和處理時間。如果數據量較大,可以考慮將數據進行拆分存儲。
  4. 設置合理的內存淘汰策略:根據業務需求配置maxmemory-policy,當 Redis 內存達到設定的最大值時,會按照指定的策略淘汰數據。常見的策略有volatile-lru(在設置了過期時間的鍵中,使用最近最少使用算法淘汰數據)、allkeys-lru(在所有鍵中使用最近最少使用算法淘汰數據)等。
  5. 使用連接池:避免頻繁創建和銷毀連接,使用連接池可以復用連接,減少連接創建和銷毀的開銷,提高系統性能。Jedis 和 Lettuce 都提供了連接池的實現。
  6. 合理設置持久化策略:平衡性能和數據安全性,根據業務對數據丟失的容忍程度選擇合適的持久化方式和配置參數。如果對數據安全性要求較高,可以采用 AOF,并設置合適的appendfsync策略;如果更注重性能和恢復速度,可以采用 RDB。
  7. 使用 Lua 腳本:將多個 Redis 命令編寫成 Lua 腳本,通過EVAL命令執行,減少網絡往返次數,并且 Lua 腳本在 Redis 中執行是原子性的,保證了操作的一致性。
  8. 監控慢查詢:定期檢查并優化慢查詢,通過slowlog get命令可以查看 Redis 的慢查詢日志,分析執行時間較長的命令,找出性能瓶頸并進行優化。

十、Redis 高可用方案

1. 主從復制

通過主從復制實現數據冗余和讀寫分離。主節點負責處理所有寫操作,并將數據變化同步給從節點,從節點則可以處理讀請求 。主從架構能夠提升系統的讀性能和數據安全性,當主節點發生故障時,雖然無法自動切換,但可以通過手動操作將從節點提升為主節點繼續提供服務。

配置方法:
在從節點配置文件redis.conf中添加以下配置,假設主節點 IP 為192.168.1.100,端口為默認的6379

replicaof 192.168.1.100 6379

同時,從節點還可以設置只讀模式,避免誤操作修改數據,在配置文件中添加:

readonly yes

工作原理
從節點啟動后,會向主節點發送SYNC命令(在 Redis 2.8 之后使用PSYNC命令)進行全量同步,主節點接收到命令后,會執行BGSAVE生成 RDB 文件,并將文件發送給從節點,從節點接收并加載 RDB 文件完成數據初始化。之后,主節點會將新的寫命令通過異步方式發送給從節點,實現數據的持續同步。

優缺點

  • 優點:架構簡單,易于部署和維護;實現讀寫分離,分擔主節點壓力,提升系統整體讀性能;數據冗余提高了數據安全性。
  • 缺點:主節點故障時無法自動切換,需要人工介入;從節點復制數據存在一定延遲,在某些對數據一致性要求極高的場景下可能不適用。

2. Redis Sentinel

Redis Sentinel 提供自動故障轉移和監控功能,它是一個分布式系統,可以監視一個或多個主從 Redis 服務器,并在主服務器故障時自動將一個從服務器升級為新的主服務器。

配置示例
假設主節點名稱為mymaster,IP 為127.0.0.1,端口為6379,在每個 Sentinel 節點的配置文件sentinel.conf中添加以下內容:

# 監視名為mymaster的主節點,最后的數字2表示判斷主節點失效至少需要2個Sentinel節點同意
sentinel monitor mymaster 127.0.0.1 6379 2 
# 超過5000毫秒未收到主節點響應,就判定主節點下線
sentinel down-after-milliseconds mymaster 5000 
# 故障轉移的超時時間,這里設置為60000毫秒
sentinel failover-timeout mymaster 60000 

工作流程

  1. Sentinel 節點會定期向主從節點和其他 Sentinel 節點發送心跳包,檢查節點是否正常運行。
  2. 當某個 Sentinel 節點發現主節點無響應超過down-after-milliseconds設置的時間后,會先標記主節點為SDOWN(主觀下線)。
  3. 該 Sentinel 節點會與其他 Sentinel 節點進行通信,當有超過配置的quorum(這里是 2)個 Sentinel 節點都認為主節點下線時,會將主節點標記為ODOWN(客觀下線)。
  4. 進入故障轉移階段,Sentinel 節點會從從節點中選舉一個新的主節點,選舉算法基于 Raft 協議,被選舉出的從節點會升級為主節點。
  5. 剩余的從節點會重新指向新的主節點,完成故障轉移。

優缺點

  • 優點:實現了主節點故障的自動檢測和自動故障轉移,極大提高了系統的可用性;采用分布式架構,避免單點故障。
  • 缺點:配置相對復雜;Sentinel 節點本身也需要進行高可用部署,否則 Sentinel 節點故障可能影響故障轉移功能;故障轉移過程中可能存在短暫的服務中斷。

3. Redis Cluster

Redis Cluster 提供數據分片和高可用功能,它采用無中心節點的分布式架構,將數據分散存儲在多個節點上,每個節點負責一部分數據,節點之間通過 Gossip 協議進行通信和信息交換。

集群創建命令
假設使用 6 個節點構建集群,其中 3 個為主節點,3 個為從節點,執行以下命令創建集群(注意提前啟動 6 個 Redis 實例并配置好相關參數):

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

--cluster-replicas 1表示為每個主節點分配一個從節點。

工作原理
Redis Cluster 將整個鍵空間劃分為 16384 個哈希槽(Hash Slot),每個節點負責一部分哈希槽。當客戶端發送命令時,會根據鍵計算出對應的哈希槽,然后將命令發送到負責該哈希槽的節點上執行。如果節點發生故障,Redis Cluster 會自動將故障節點負責的哈希槽遷移到其他正常節點上,并進行故障轉移,保證服務的可用性。

優缺點

  • 優點:具備強大的水平擴展能力,可以輕松應對大規模數據和高并發訪問;數據分片存儲,提高了數據處理能力;自動故障轉移和哈希槽遷移機制保證了高可用性。
  • 缺點:客戶端需要實現哈希槽路由算法,增加了開發復雜度;集群內部節點通信和數據遷移會占用一定的網絡帶寬;在集群規模較大時,管理和維護難度增加。

結語

Redis 作為高性能的內存數據庫,在現代應用開發中扮演著重要角色。掌握 Redis 的基礎知識和核心功能,能夠幫助開發者構建更高效、更可靠的系統。本文系統介紹了 Redis 的基礎知識,涵蓋數據結構、持久化、事務、發布訂閱等核心功能,以及 Java 客戶端的使用、應用場景、性能優化建議和高可用方案。希望這篇指南能助力你快速入門 Redis,并在實際項目中靈活運用,充分發揮 Redis 的強大性能和優勢。

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

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

相關文章

圖片轉ICO圖標工具

圖片轉ICO圖標 可批量操作 下載地址&#xff1a; 鏈接&#xff1a;https://pan.quark.cn/s/6312c565ec98 這個工具是一個批量圖片轉ICO圖標的神器&#xff0c;有了它&#xff0c;以后再也不用為ICO格式的轉換煩惱&#xff01;而且這個軟件特別小巧&#xff0c;完全不用安裝。…

0基礎 | L298N電機驅動模塊 | 使用指南

引言 在嵌入式系統開發中&#xff0c;電機驅動是一個常見且重要的功能。L298N是一款高電壓、大電流電機驅動芯片&#xff0c;廣泛應用于各種電機控制場景&#xff0c;如直流電機的正反轉、調速&#xff0c;以及步進電機的驅動等。本文將詳細介紹如何使用51單片機來控制L298N電…

Flink 系列之十五 - 高級概念 - 窗口

之前做過數據平臺&#xff0c;對于實時數據采集&#xff0c;使用了Flink。現在想想&#xff0c;在數據開發平臺中&#xff0c;Flink的身影幾乎無處不在&#xff0c;由于之前是邊用邊學&#xff0c;總體有點混亂&#xff0c;借此空隙&#xff0c;整理一下Flink的內容&#xff0c…

大疆卓馭嵌入式面經及參考答案

FreeRTOS 有哪 5 種內存管理方式&#xff1f; heap_1.c&#xff1a;這種方式簡單地在編譯時分配一塊固定大小的內存&#xff0c;在整個運行期間不會進行內存的動態分配和釋放。它適用于那些對內存使用需求非常明確且固定&#xff0c;不需要動態分配內存的場景&#xff0c;優點是…

Java 線程池原理

Java 線程池是一種管理和復用線程的機制&#xff0c;其原理如下&#xff1a; 核心概念 線程池的初始化 &#xff1a;在創建線程池時&#xff0c;需要設置一些關鍵參數&#xff0c;如核心線程數&#xff08;corePoolSize&#xff09;、最大線程數&#xff08;maximumPoolSize&am…

大模型都有哪些超參數

大模型的超參數是影響其訓練效果、性能和泛化能力的關鍵設置,可分為以下幾大類別并結合實際應用進行詳細說明: 一、訓練過程相關超參數 學習率(Learning Rate) 作用:控制參數更新的步長,直接影響收斂速度和穩定性。過高會導致震蕩或過擬合,過低則收斂緩慢。調整策略:初…

路由器斷流排查終極指南:從Ping測試到Wireshark抓包5步定位法

測試路由器是否出現“斷流”&#xff08;網絡連接間歇性中斷&#xff09;&#xff0c;需通過多維度排查硬件、軟件及外部干擾因素。以下是詳細步驟指南&#xff1a; 一、基礎環境準備 設備連接 有線測試&#xff1a;用網線將電腦直接連接路由器LAN口&#xff0c;排除WiFi干擾。…

低代碼開發:開啟軟件開發的新篇章

摘要 低代碼開發作為一種新興的軟件開發方式&#xff0c;正在迅速改變傳統軟件開發的模式和效率。它通過可視化界面和預設的模板&#xff0c;使非專業開發者也能夠快速構建應用程序&#xff0c;極大地降低了開發門檻和成本。本文將深入探討低代碼開發的定義、優勢、應用場景以及…

基于Django汽車數據分析大屏可視化系統項目

基于Django汽車數據分析大屏可視化系統項目 一、項目概述 本項目是一個基于 Python 的汽車數據分析大屏可視化系統&#xff0c;旨在通過直觀的可視化界面展示汽車相關數據&#xff0c;幫助用戶更好地理解和分析汽車市場動態、車輛性能等信息。系統采用前后端分離的架構&#…

WebRTC通信原理與流程

1、服務器與協議相關 1.1 STUN服務器 圖1.1.1 STUN服務器在通信中的位置圖 1.1.1 STUN服務簡介 STUN&#xff08;Session Traversal Utilities for NAT&#xff0c;NAT會話穿越應用程序&#xff09;是一種網絡協議&#xff0c;它允許位于NAT&#xff08;或多重 NAT&#xff09;…

Beta分布--貝葉斯建模概率或比例常用分布

Beta分布是一種定義在區間 ([0, 1]) 上的連續概率分布&#xff0c;常用于描述比例或概率的不確定性。它的形狀由兩個正參數 (\alpha)&#xff08;alpha&#xff09;和 (\beta)&#xff08;beta&#xff09;控制&#xff0c;能夠呈現多種形態&#xff08;如對稱、偏態、U型等&am…

深度學習算法:開啟智能時代的鑰匙

引言 深度學習作為機器學習的一個分支&#xff0c;近年來在圖像識別、自然語言處理、語音識別等多個領域取得了革命性的進展。它的核心在于構建多層的神經網絡&#xff0c;通過模仿人腦處理信息的方式&#xff0c;讓機器能夠從數據中學習復雜的模式。 深度學習算法的基本原理…

深入了解linux系統—— 自定義shell

shell的原理 我們知道&#xff0c;我們程序啟動時創建的進程&#xff0c;它的父進程都是bash也就是shell命令行解釋器&#xff1b; 那bash都做了哪些工作呢&#xff1f; 根據已有的知識&#xff0c;我們可以簡單理解為&#xff1a; 輸出命令行提示符獲取并解析我們輸入的指令…

Redux和Vuex

為什么React和Vue需要Redux和Vuex 狀態管理需求的演變 #mermaid-svg-GaKl3pkZ82yc1m8E {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GaKl3pkZ82yc1m8E .error-icon{fill:#552222;}#mermaid-svg-GaKl3pkZ82yc1m8E…

Kubernetes排錯(十三):Pod間偶發超時問題排查

在微服務架構中&#xff0c;Pod間偶發的通信超時是最令人頭疼的問題之一。本文將通過生產環境中的真實案例&#xff0c;手把手教你定位這類"幽靈問題"。 一、快速定位問題方向&#xff08;5分鐘縮小范圍&#xff09; 1. 基礎檢查三板斧 # 檢查Service與Endpoint映…

Nginx 源碼安裝成服務

一、環境準備 一臺裝有 CentOS 7.9 的虛擬機&#xff08;IP: 192.168.40.81&#xff09;nginx-1.21.6.tar.gz 安裝包一個&#xff08;版本隨意&#xff09; 二、安裝 1&#xff09;解壓 nginx-1.21.6.tar.gz tar -xzvf nginx-1.21.6.tar.gz -tar&#xff1a;這是一個在 Linu…

L51.【LeetCode題解】438. 找到字符串中所有字母異位詞(四種方法)

目錄 1.題目 2.分析 暴力解法 方法1:排序(超時) 方法2:哈希表(險過) ★判斷兩個哈希表是否相同算法(通用方法,必須掌握) 能相等的前提:兩個哈希表的大小相等 哈希表有迭代器,可以使用范圍for從頭到尾遍歷 提交結果 優化方法:定長滑動窗口 提交結果 使用哈希數組更快…

Qt模塊化架構設計教程 -- 輕松上手插件開發

概述 在軟件開發領域,隨著項目的增長和需求的變化,保持代碼的可維護性和擴展性變得尤為重要。一個有效的解決方案是采用模塊化架構,尤其是利用插件系統來增強應用的功能性和靈活性。Qt框架提供了一套強大的插件機制,可以幫助開發者輕松實現這種架構。 模塊化與插件系統 模…

深入理解 HashMap 的索引計算:右移與異或的作用

在 Java 中&#xff0c;HashMap 是一種高效的數據結構&#xff0c;它通過將鍵映射到數組中的索引位置來實現快速的插入和查找。但之前看源碼總是理解到它要hash之后散列到數組中某一個位置&#xff0c;但卻從未深究它究竟怎么散列的&#xff0c;如果不夠散那就意味著hash沖突增…

overleaf較高級的細節指令

換行命令 原來代碼是將三個矩陣表達式在同一行顯示&#xff0c;使用aligned環境&#xff08;需引入amsmath宏包&#xff0c;一般文檔導言區默認會引入&#xff09;&#xff0c;把三個矩陣的定義分別放在不同行&#xff0c;可通過\\換行。 對齊命令 &放在等號前&#xff0…