Redis速學

一、介紹Redis

基本概念和特點

Redis是一個開源的內存數據庫,它主要用于數據緩存和持久化。其數據存儲在內存中,這使得它具有非常快的讀寫速度。Redis支持多種數據結構,包括字符串、哈希、列表、集合和有序集合,這使得它非常靈活,能夠適應各種不同的數據處理需求。此外,Redis也支持數據持久化,可以將數據保存到磁盤上,確保數據不會因服務器重啟而丟失。

優勢和適用場景

Redis的優勢在于快速、靈活、豐富的數據結構和持久化功能。適用場景包括但不限于:

  • 數據緩存:用于加速對數據庫或外部API的訪問,減輕后端系統壓力。
  • 會話緩存:用于存儲用戶會話信息,提高網站性能和擴展性。
  • 消息隊列:實現發布/訂閱模式,處理異步任務和事件驅動架構。
  • 實時分析:存儲和處理實時數據,如統計數據、計數器等。
  • 計數器和排行榜:用于實時計數和排名功能。

演示安裝和配置Redis

演示如何安裝和配置Redis可以涉及以下步驟:

  1. 下載和安裝Redis軟件包
  2. 配置Redis實例,包括端口設置、內存限制、持久化選項等
  3. 啟動Redis服務器
  4. 使用命令行工具連接到Redis并執行一些基本操作,如設置鍵值對、操作數據結構等。

二、Redis數據結構及其適用場景

字符串

  • 設置字符串:使用命令 SET key value,例如 SET user:1000:name "Alice"
  • 獲取字符串:使用命令 GET key,例如 GET user:1000:name
  • 刪除字符串:使用命令 DEL key,例如 DEL user:1000:name
  • 適用場景:用于緩存用戶會話信息、存儲臨時數據等。

哈希

  • 添加哈希字段:使用命令 HSET key field value,例如 HSET user:1000 age 30
  • 獲取哈希字段:使用命令 HGET key field,例如 HGET user:1000 age
  • 刪除哈希字段:使用命令 HDEL key field,例如 HDEL user:1000 age
  • 適用場景:存儲用戶信息、對象屬性,如用戶資料、商品信息等。

列表

  • 在列表頭部插入元素:使用命令 LPUSH key value,例如 LPUSH news:latest "New article"
  • 在列表尾部插入元素:使用命令 RPUSH key value,例如 RPUSH news:latest "Another article"
  • 刪除列表元素:使用命令 LPOP keyRPOP key,例如 LPOP news:latest
  • 適用場景:消息隊列、新聞推送、最新動態等。

集合

  • 添加集合元素:使用命令 SADD key member,例如 SADD tags:redis "database"
  • 獲取集合元素:使用命令 SMEMBERS key,例如 SMEMBERS tags:redis
  • 刪除集合元素:使用命令 SREM key member,例如 SREM tags:redis "database"
  • 適用場景:標簽系統、唯一值管理、好友列表等。

有序集合

  • 添加有序集合元素:使用命令 ZADD key score member,例如 ZADD leaderboard 1000 "PlayerA"
  • 獲取有序集合元素:使用命令 ZRANGE key start stop,例如 ZRANGE leaderboard 0 9
  • 刪除有序集合元素:使用命令 ZREM key member,例如 ZREM leaderboard "PlayerA"
  • 適用場景:排行榜、范圍查詢、按分數排序的數據存儲。

三、Redis持久化

Redis提供了兩種持久化方式:快照(snapshot)和日志(journal)持久化。這些機制可以確保在Redis服務器重啟時數據不會丟失。

1. 快照持久化

快照持久化通過將當前數據集的副本寫入磁盤來實現持久化。Redis會周期性地將數據集快照寫入磁盤。當Redis重啟時,可以通過加載最近的快照來恢復數據。

配置快照持久化

在Redis配置文件中,可以通過以下設置配置快照持久化:

save 900 1     # 在900秒(15分鐘)內,如果至少有1個鍵被修改,則保存快照
save 300 10    # 在300秒(5分鐘)內,如果至少有10個鍵被修改,則保存快照
save 60 10000  # 在60秒內,如果至少有10000個鍵被修改,則保存快照

上述配置表示了在不同時間段內觸發快照保存的條件。可以根據實際情況調整這些設置。

2. 日志持久化

日志持久化(也稱為AOF持久化)記錄了服務器接收到的所有寫操作命令,以此來重放這些命令來恢復原始數據集。AOF持久化可以確保更高的數據安全性,但通常會占用更多的磁盤空間。

配置日志持久化

在Redis配置文件中,可以通過以下設置啟用AOF持久化:

appendonly yes     # 啟用AOF持久化

還可以設置AOF持久化的文件名和重寫策略等參數。

管理持久化功能

除了配置文件之外,可以使用Redis的命令行工具或者客戶端連接來管理持久化功能。例如,可以手動觸發快照保存或者AOF重寫。

  • 手動觸發快照保存:使用 SAVE 命令或 BGSAVE 命令。
  • 手動觸發AOF重寫:使用 BGREWRITEAOF 命令。

通過了解和配置Redis的持久化功能,可以確保數據在重啟或者故障恢復時不會丟失,并且可以根據需求來調整持久化機制以平衡數據安全和性能。

四、Redis高級特性

1. 發布/訂閱功能

Redis的發布/訂閱功能允許客戶端訂閱頻道并接收發布到該頻道的消息。這種模式使得多個客戶端可以訂閱感興趣的頻道并接收相關信息,從而構建實時通信和消息傳遞系統。

使用發布/訂閱功能

  • 訂閱頻道:客戶端可以使用 SUBSCRIBE 命令來訂閱一個或多個頻道,以接收相關消息。
    SUBSCRIBE channel
    
  • 發布消息:客戶端可以使用 PUBLISH 命令向指定的頻道發布消息。
    PUBLISH channel message
    

2. 事務支持

Redis的事務支持通過 MULTIEXECDISCARDWATCH 等命令來實現。這使得客戶端可以將多個命令打包成一個事務,然后一次性、原子性地執行這些命令。

使用事務

  • 開啟事務:使用 MULTI 命令來開啟一個事務塊。
  • 添加命令:在事務塊內,添加要執行的命令。
  • 執行事務:使用 EXEC 命令來執行事務中的所有命令,或者使用 DISCARD 命令來取消事務。
  • 監視鍵:使用 WATCH 命令來監視一個或多個鍵,如果在事務執行過程中這些鍵被修改,則事務將被取消。

3. 構建高級應用

這些高級特性可以用于構建諸如實時消息系統、事務性操作和分布式鎖等高級應用程序。例如,可以使用發布/訂閱功能構建實時聊天應用,使用事務來確保多個命令的原子性執行,或者使用WATCH來實現分布式鎖的功能。

(1)實時消息系統

利用Redis的發布/訂閱功能,可以構建實時消息系統。例如,假設我們有一個在線聊天應用,用戶可以訂閱屬于他們的聊天頻道,當其他用戶發送消息時,消息將被發布到相應的頻道,而訂閱該頻道的用戶將實時接收到消息。這種模式可以實現實時通信,例如即時聊天和實時通知等功能。

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;public class RealTimeMessagingSystem {public static void main(String[] args) {// 訂閱者new Thread(() -> {Jedis jedis = new Jedis("localhost");jedis.subscribe(new JedisPubSub() {@Overridepublic void onMessage(String channel, String message) {System.out.println("Received message: " + message + " from channel: " + channel);}}, "real-time-channel");jedis.close();}).start();// 發布者new Thread(() -> {Jedis jedis = new Jedis("localhost");try {Thread.sleep(1000); // 等待訂閱者準備好jedis.publish("real-time-channel", "Hello, Redis!");} catch (InterruptedException e) {e.printStackTrace();} finally {jedis.close();}}).start();}
}

(2) 事務性操作

Redis的事務支持可以用于執行一系列命令,要么全部執行,要么全部不執行,具有原子性。這在需要確保多個命令按照特定順序執行或者一起執行時非常有用。舉例來說,假設我們需要在銀行應用中從一個賬戶轉賬到另一個賬戶。我們可以使用Redis的事務性操作來確保扣款和存款兩個操作要么同時成功,要么同時失敗,從而避免出現數據不一致的情況。Redis 事務可以通過 MULTI、EXEC、DISCARD 和 WATCH 命令來實現。事務保證了一系列命令的原子性執行。

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;public class TransactionalOperations {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// 開始事務Transaction t = jedis.multi();try {t.set("foo", "bar");t.set("hello", "world");// 執行事務t.exec();} catch (Exception e) {// 如果出現異常,放棄事務t.discard();} finally {jedis.close();}}
}

(3)分布式鎖

Redis的原子性操作和分布式特性使其成為構建分布式鎖的理想選擇。通過利用Redis的SETNX命令(SET if Not eXists),可以在分布式環境中實現互斥鎖。這在需要確保某個操作在分布式系統中只能被一個實例執行時非常有用,比如控制對共享資源的訪問。

分布式系統是由多臺計算機組成的系統,這些計算機通過網絡相互連接并協同工作,以完成共同的任務和目標。在分布式系統中,各個計算機節點可以獨立運行,并通過消息傳遞或共享狀態來協調彼此的行為,從而實現更大規模的計算和處理能力。
關鍵特點包括:

  1. 并行處理: 分布式系統能夠并行處理任務,通過將任務分配給不同的節點,從而提高整體系統的處理能力和性能。
  2. 容錯性: 分布式系統通常具有一定的容錯能力,即使某個節點出現故障,系統仍然能夠繼續運行。
  3. 可伸縮性: 分布式系統通常具有良好的可伸縮性,可以通過增加節點來擴展系統的處理能力。
  4. 資源共享: 分布式系統中的節點可以共享資源(如存儲、計算資源等),從而實現更高效的資源利用。
  5. 分布式存儲: 分布式系統通常具有分布式存儲的能力,可以將數據分布存儲在不同的節點上,以實現更高的數據可靠性和容量。

分布式鎖是一種用于在分布式系統中實現互斥訪問的技術。在分布式系統中,多個節點可能需要同時訪問共享資源或執行某個關鍵操作,因此需要一種機制來確保在任意時刻只有一個節點能夠訪問該資源或執行該操作,以避免數據不一致或競爭條件的發生。
分布式鎖通常用于以下場景:

  1. 避免資源沖突: 當多個節點需要訪問共享資源(如數據庫、文件、緩存等)時,分布式鎖可以確保同一時刻只有一個節點能夠訪問該資源,從而避免沖突和數據不一致。
  2. 防止重復操作: 在某些情況下,需要確保某個操作只能被執行一次,分布式鎖可以用來保證該操作在分布式系統中的冪等性。

常見的實現分布式鎖的方式包括利用分布式存儲系統(如Redis、ZooKeeper等)來協調各個節點之間的鎖狀態,以及利用樂觀鎖和悲觀鎖等技術來實現分布式環境下的互斥訪問。

SETNX 是 Redis 中的一條命令,用于設置一個鍵的值,當且僅當該鍵不存在時。SETNX 是 “SET if Not eXists” 的縮寫。

其語法為:

SETNX key value

其中 key 是要設置的鍵,value 是要設置的值。

如果 key 不存在,則會將 key 設置為 value,并返回 1,表示設置成功。如果 key 已經存在,則不做任何操作,返回 0,表示設置失敗。

這個命令通常用于實現分布式鎖,因為它可以確保只有一個客戶端能夠成功地設置某個鍵,從而實現互斥操作。

import redis.clients.jedis.Jedis;public class DistributedLock {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// 嘗試獲取鎖String lockKey = "lock:key";long acquired = jedis.setnx(lockKey, String.valueOf(System.currentTimeMillis()));if (acquired == 1) {try {// 鎖的業務邏輯System.out.println("Lock acquired!");// ...} finally {// 釋放鎖jedis.del(lockKey);}} else {System.out.println("Could not acquire lock!");}jedis.close();}
}

在這個分布式鎖的例子中,我們使用 setnx 命令嘗試設置一個鎖。如果返回值是 1,表示我們成功獲取了鎖。在鎖的業務邏輯執行完畢后,我們通過刪除鍵來釋放鎖。如果返回值不是 1,表示鎖已經被其他進程持有。

請注意,這個分布式鎖的實現是最基本的,它沒有處理鎖的超時問題。在實際應用中,你可能需要使用更復雜的模式,比如 Redlock 算法,或者使用 Redisson 這樣的庫,它提供了更加健壯的分布式鎖實現。

五、Redis在實際應用中的使用

首先,確保Java 項目中包含了 Redis 客戶端庫,比如 Jedis。可以通過 Maven 或者 Gradle 將其添加到你的項目依賴中。

Maven 依賴示例

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>最新版本</version>
</dependency>

Redis作為緩存系統的最佳實踐

Redis 作為緩存系統的最佳實踐包括以下方面:

  1. 緩存熱點數據:將經常訪問的數據緩存在 Redis 中,以減輕后端數據庫的壓力,提高數據訪問速度。

  2. 選擇合適的數據結構:根據實際需求選擇合適的數據結構,如字符串、哈希、列表、集合、有序集合等,以最大程度地發揮 Redis 的性能優勢。

  3. 設置合理的過期時間:對于緩存的數據,根據數據的更新頻率和重要性,設置合理的過期時間,避免緩存數據過期而導致的數據不一致性。

  4. 使用預熱機制:在系統啟動或重啟時,通過預熱機制將熱點數據加載到緩存中,避免大量請求直接打到后端數據庫。

  5. 實現緩存穿透保護:采用布隆過濾器或在緩存中存儲空對象等方式,防止緩存穿透,即針對不存在的數據頻繁請求導致的直接訪問后端數據庫。

  6. 考慮高可用和擴展性:使用 Redis 的主從復制和集群功能,確保緩存系統的高可用性和擴展性。

import redis.clients.jedis.Jedis;public class RedisCacheExample {public static void main(String[] args) {// 連接到 RedisJedis jedis = new Jedis("localhost", 6379);// 假設我們要緩存用戶的個人資料String userKey = "user:12345";jedis.hset(userKey, "name", "Alice");jedis.hset(userKey, "age", "30");jedis.hset(userKey, "email", "alice@example.com");// 設置緩存過期時間為 1 小時jedis.expire(userKey, 3600);// 從緩存中獲取用戶的個人資料System.out.println(jedis.hgetAll(userKey));// 模擬緩存過期try {Thread.sleep(3601 * 1000); // 注意 Java 中的 sleep 方法接受的是毫秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println(jedis.hgetAll(userKey)); // 這將顯示一個空的 Map,因為緩存已經過期// 關閉連接jedis.close();}
}

將Redis用作消息中間件,實現隊列和發布/訂閱模式

  1. 隊列:Redis 的列表數據結構非常適合用作隊列。通過 LPUSHRPOP 命令,可以將消息推入隊列并從隊列中彈出消息。這種方式可以實現簡單的任務隊列,用于異步處理任務或消息傳遞。

  2. 發布/訂閱模式:Redis 支持發布/訂閱模式,可以通過 PUBLISH 命令發布消息,而訂閱者可以通過 SUBSCRIBE 命令訂閱指定的頻道,從而接收發布者發送的消息。這種模式非常適合實現實時消息推送、事件通知等功能。

  3. 保證消息可靠性:在使用 Redis 作為消息中間件時,需要考慮消息的可靠性。可以通過持久化機制、ACK 確認機制等方式來確保消息的可靠性傳遞。

  4. 消息過期和重試機制:針對消息的過期處理和重試機制,可以在應用層面或者使用 Redis 提供的過期設置來處理。

  5. 擴展性和負載均衡:使用 Redis 集群或者主從復制機制,可以實現消息中間件的擴展和負載均衡,確保系統的穩定性和性能。

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;public class RedisPubSubExample {public static void main(String[] args) {// 啟動訂閱者線程Thread subscriberThread = new Thread(() -> {Jedis jedis = new Jedis("localhost", 6379);jedis.subscribe(new JedisPubSub() {@Overridepublic void onMessage(String channel, String message) {System.out.println("Received: " + message);}}, "channel");jedis.close();});subscriberThread.start();// 啟動發布者線程Thread publisherThread = new Thread(() -> {Jedis jedis = new Jedis("localhost", 6379);try {while (true) {jedis.publish("channel", "some message");Thread.sleep(1000);}} catch (InterruptedException e) {e.printStackTrace();} finally {jedis.close();}});publisherThread.start();}
}

綜上所述,Redis 作為消息中間件可以提供可靠的消息傳遞和發布/訂閱功能,同時作為隊列系統可以支持異步任務處理和消息傳遞,為實際應用提供了靈活而強大的功能支持。

六、性能優化和故障排除

  • 分析Redis的性能優化策略,包括內存管理和命令優化
  • 演示如何排除常見的Redis故障和性能問題

Redis 的性能優化通常涉及內存管理、命令優化、配置調整和故障排除。以下是一些關鍵策略和示例:

內存管理

使用合適的數據類型:選擇正確的數據類型可以大幅節省內存。例如,使用哈希類型存儲對象而不是字符串類型。

  1. 內存淘汰策略:當內存使用接近限制時,Redis 提供了多種淘汰策略,如 volatile-lru、allkeys-lru、volatile-ttl 等。根據你的應用場景選擇合適的策略。

  2. 內存優化配置:使用 maxmemory 配置項來設置 Redis 最大內存使用量,超過這個限制時將觸發淘汰策略。

命令優化

  1. 避免大鍵操作:大鍵操作可能會阻塞 Redis,使用 SCAN 命令代替 KEYS,使用 HSCAN、SSCAN、ZSCAN 來迭代大集合。

  2. 批量操作:使用 MGET、MSET 或 pipeline 來減少網絡往返次數。

  3. Lua 腳本:使用 Lua 腳本可以將多個命令封裝在服務器端執行,減少網絡延遲。

配置調整

  1. 持久化策略:根據需要選擇 RDB 快照、AOF 日志或兩者結合。調整 save 配置和 appendfsync 選項以平衡性能和數據安全。

  2. 復制和分片:通過主從復制提高數據的可用性。使用 Redis 集群或分片來分散負載。

故障排除和性能問題

  1. 監控:使用 INFO 命令或 Redis 監控工具來跟蹤性能指標。

  2. 慢查詢日志:檢查 SLOWLOG 獲取執行緩慢的命令。

  3. 配置優化:調整 tcp-keepalive、timeout、tcp-backlog 等網絡相關配置。

  4. 硬件升級:如果性能瓶頸是由硬件限制,可能需要升級 CPU、內存或使用更快的存儲。

下面是一些 Java 代碼示例,演示如何使用 Jedis 客戶端來執行上述操作:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.ScanParams;
import redis.clients.jedis.ScanResult;public class RedisOptimizationExample {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");// 使用 SCAN 命令代替 KEYSString cursor = "0";ScanParams scanParams = new ScanParams().count(100);do {ScanResult<String> scanResult = jedis.scan(cursor, scanParams);cursor = scanResult.getCursor();scanResult.getResult().forEach(key -> {// 處理每個鍵System.out.println(key);});} while (!cursor.equals("0"));// 檢查慢查詢日志System.out.println("Slowlog: " + jedis.slowlogGet());// 獲取內存使用信息System.out.println("Memory Info: " + jedis.info("memory"));// 獲取配置參數System.out.println("Config maxmemory: " + jedis.configGet("maxmemory"));// 設置內存淘汰策略為 volatile-lrujedis.configSet("maxmemory-policy", "volatile-lru");

故障排除

  1. 內存問題:如果 Redis 實例消耗內存過多,可以通過 INFO memory 命令查看內存使用詳情。如果發現特定類型的鍵占用了過多內存,可能需要優化這些鍵的使用或數據結構。

  2. CPU 使用率高:高 CPU 使用率通常意味著 Redis 正在處理大量的請求或執行復雜的命令。可以通過 INFO CPU 查看 CPU 統計信息。如果 CPU 使用率持續高,可能需要優化命令或考慮增加更多的 Redis 實例進行負載均衡。

  3. 磁盤 I/O 問題:如果使用 AOF 持久化,磁盤 I/O 可能成為瓶頸。可以通過調整 appendfsync 配置項來優化。例如,設置為 everysec 可以平衡性能和數據安全。

  4. 網絡瓶頸:如果 Redis 實例和客戶端之間的網絡延遲高,可以考慮將 Redis 實例移動到離客戶端更近的位置,或者優化網絡配置。

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;public class RedisTroubleshootingExample {public static void main(String[] args) {// 創建 JedisPool 來管理連接JedisPoolConfig poolConfig = new JedisPoolConfig();poolConfig.setMaxTotal(128); // 設置最大連接數JedisPool jedisPool = new JedisPool(poolConfig, "localhost");try (Jedis jedis = jedisPool.getResource()) {// 獲取內存使用信息String memoryInfo = jedis.info("memory");System.out.println("Memory Info: " + memoryInfo);// 獲取 CPU 使用信息String cpuInfo = jedis.info("cpu");System.out.println("CPU Info: " + cpuInfo);// 獲取并設置慢查詢日志的閾值String slowlogMaxLen = jedis.configGet("slowlog-max-len").get(1);System.out.println("Current slowlog-max-len: " + slowlogMaxLen);jedis.configSet("slowlog-max-len", "128");// 獲取慢查詢日志System.out.println("Slowlog: " + jedis.slowlogGet());// 檢查網絡延遲System.out.println("Ping: " + jedis.ping());}// 關閉連接池jedisPool.close();}
}

在這個示例中,我們使用了 JedisPool 來管理 Redis 連接,這是生產環境中推薦的做法,因為它可以重用連接,減少連接建立和銷毀的開銷。我們還展示了如何獲取內存和 CPU 的使用信息,如何配置和檢查慢查詢日志,以及如何檢查網絡延遲。

請注意,這些代碼示例僅用于演示如何使用 Jedis 客戶端來獲取 Redis 的性能信息和進行一些基本的配置。在實際的生產環境中,你可能需要結合監控工具和日志分析工具來進行更深入的性能分析和故障。

補充文檔:

  1. GeekHour的一小時課程筆記 PDF
  2. 黑馬新出的微服務課程-Redis面試篇:https://b11et3un53m.feishu.cn/wiki/Jck7w4GBSia4sukQn1vc9s3anMf

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

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

相關文章

書生·浦語大模型圖文對話Demo搭建

前言 本節我們先來搭建幾個Demo來感受一下書生浦語大模型 InternLM-Chat-7B 智能對話 Demo 我們將使用 InternStudio 中的 A100(1/4) 機器和 InternLM-Chat-7B 模型部署一個智能對話 Demo 環境準備 在 InternStudio 平臺中選擇 A100(1/4) 的配置&#xff0c;如下圖所示鏡像…

微店商品詳情 API 支持哪些商品信息的獲取?

微店&#xff08;Weidian&#xff09;并沒有一個公開的、官方維護的API文檔來供開發者使用。這意味著&#xff0c;如果你想要獲取微店商品詳情或其他相關信息&#xff0c;你通常需要通過微店官方提供的方式來實現&#xff0c;例如使用其開放平臺、官方SDK或聯系微店的技術支持獲…

Spring常見面試題知識點總結(三)

7. Spring MVC&#xff1a; MVC架構的概念。 MVC&#xff08;Model-View-Controller&#xff09;是一種軟件設計模式&#xff0c;旨在將應用程序分為三個主要組成部分&#xff0c;以實現更好的代碼組織、可維護性和可擴展性。每個組件有著不同的職責&#xff0c;相互之間解耦…

11.Prometheus常見PromeQL表達式

平凡也就兩個字: 懶和惰; 成功也就兩個字: 苦和勤; 優秀也就兩個字: 你和我。 跟著我從0學習JAVA、spring全家桶和linux運維等知識&#xff0c;帶你從懵懂少年走向人生巔峰&#xff0c;迎娶白富美&#xff01; 關注微信公眾號【 IT特靠譜 】&#xff0c;每天都會分享技術心得~ …

YOLO算法

YOLO介紹 YOLO&#xff0c;全稱為You Only Look Once: Unified, Real-Time Object Detection&#xff0c;是一種實時目標檢測算法。目標檢測是計算機視覺領域的一個重要任務&#xff0c;它不僅需要識別圖像中的物體類別&#xff0c;還需要確定它們的位置。與分類任務只關注對…

【矩陣】【方向】【素數】3044 出現頻率最高的素數

作者推薦 動態規劃的時間復雜度優化 本文涉及知識點 素數 矩陣 方向 LeetCode 3044 出現頻率最高的素數 給你一個大小為 m x n 、下標從 0 開始的二維矩陣 mat 。在每個單元格&#xff0c;你可以按以下方式生成數字&#xff1a; 最多有 8 條路徑可以選擇&#xff1a;東&am…

安裝 Ubuntu 22.04.3 和 docker

文章目錄 一、安裝 Ubuntu 22.04.31. 簡介2. 下載地址3. 系統安裝4. 系統配置 二、安裝 Docker1. 安裝 docker2. 安裝 docker compose3. 配置 docker 一、安裝 Ubuntu 22.04.3 1. 簡介 Ubuntu 22.04.3 是Linux操作系統的一個版本。LTS 版本支持周期到2032年。 系統要求雙核 C…

C++的模板template

一、什么是模板 C中的模板分為類模板和函數模板&#xff0c;并不是一個實際的類或函數&#xff0c;這指的是編譯器不會自動為其生成具體的可執行代碼。只有在具體執行時&#xff0c;編譯器才幫助其實例化。 二、為什么引入模板 拿我們最常見的交換函數來舉例子&#xff0c;如果…

代碼隨想錄 二叉樹第二周

目錄 101.對稱二叉樹 100.相同的樹 572.另一棵樹的子樹 104.二叉樹的最大深度 559.N叉樹的最大深度 111.二叉樹的最小深度 222.完全二叉樹的節點個數 110.平衡二叉樹 257.二叉樹的所有路徑 101.對稱二叉樹 101. 對稱二叉樹 已解答 簡單 相關標簽 相關企業 給你一…

《求生之路2》服務器如何選擇合適的內存和CPU核心數,以避免丟包和延遲高?

根據求生之路2服務器的實際案例分析選擇合適的內存和CPU核心數以避免丟包和延遲高的問題&#xff0c;首先需要考慮游戲的類型和對服務器配置的具體要求。《求生之路2》作為一款多人在線射擊游戲&#xff0c;其服務器和網絡優化對于玩家體驗至關重要。 首先&#xff0c;考慮到游…

Java應用程序注冊成Linux系統服務后,關閉Java應用程序打印系統日志

Java應用程序有自己的日志框架&#xff0c;有指定位置的日志文件&#xff0c;不需要在系統日志里記錄&#xff0c;占用磁盤空間。 1.Linux系統文件目錄 /etc/systemd/system/ 找到要修改的Java應用程序服務配置 比如bis-wz-80.service 2.設置不打印日志 StandardOutputnull S…

centos7 搭建 harbor 私有倉庫

一、下載安裝 1.1、harbor 可以直接從 github 上下載&#xff1a;Releases goharbor/harbor GitHub 這里選擇 v2.10.0 的版本 wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz 1.2、解壓 tar zxvf harbor-offlin…

L2 網絡 Mint Blockchain 正式對外發布測試網

Mint Blockchain 是由 NFTScan Labs 發起的聚焦在 NFT 生態的 L2 網絡&#xff0c;致力于促進 NFT 資產協議標準的創新和 NFT 在現實商業應用場景中的大規模采用。 Mint Blockchain 于 2024 年 2 月 28 號正式對外發布測試網&#xff0c;開始全面進入生態開發者測試開發階段。 …

2403C++,C++11玩轉無棧協程

原文 C11里也能玩無棧協程了? 答案是:可以! 事實上異網在很早時,C11里就可用無棧協程寫異步代碼了,只不過用起來不太方便,來看看C11里怎么用異網無棧協程寫一個回音服務器的吧. #包含 <異網.h> #包含 <內存> #包含 <向量> #包含 <異網/產生.h> 用 …

c++異常機制(5)-- 繼承與異常

我們在c異常機制(3)中自定義類型&#xff0c;我們將相應的異常封裝成了類&#xff0c;在類中實現一些方法&#xff0c;對異常進行處理。其中每一個類都實現了print()方法。 我們使用throw拋出相應異常的虛擬對象&#xff0c;在catch參數中進行匹配&#xff0c;但是如果有很多異…

Springboot項目集成短信驗證碼(超簡單)

操作流程 注冊驗證碼平臺創建驗證碼模版開始集成&#xff08;無需引入第三方庫&#xff09; 注冊并登陸中昱維信驗證碼平臺 獲取AppID和AppKey。 創建驗證碼模版 創建驗證碼模版&#xff0c;獲取驗證碼模版id 開始集成 創建controller import org.springframework.web.bi…

MATLAB環境下基于隨機游走拉普拉斯算子的快速譜聚類方法

古人有云&#xff0c;物以類聚&#xff0c;在面臨信息爆炸問題的今天&#xff0c;對信息類別劃分的價值日益顯現&#xff0c;并逐步成為學者們的研究熱點。分類和聚類是數據挖掘的重要工具&#xff0c;是實現事物類別劃分的左右手&#xff0c;聚類又是分類一種特殊的方式。所謂…

CodeWhisperer安裝教導--一步到位!以及本人使用Whisperer的初體驗。

CodeWhisperer是亞馬遜出品的一款基于機器學習的通用代碼生成器&#xff0c;可實時提供代碼建議。類似 Cursor 和Github AWS CodeWhisperer 亞馬遜科技的CodeWhisperer是Amazon于2021年12月推出的一款代碼補全工具&#xff0c;與GitHub Copilot類似。主要的功能有:代碼補全注釋…

貓毛過敏養貓人士的必備養貓好物-寵物空氣凈化器品牌分享

許多貓奴在與貓相處一段時間后突然對貓毛過敏&#xff0c;這真是令人難受。一些人認為對貓咪過敏是因為它們在空氣中飄浮的毛發引起的&#xff0c;但實際上大部分人之所以過敏是因為對貓身上一種微小的蛋白質過敏。這種導致過敏的蛋白質附著在貓咪的一些皮屑上。我們都知道貓咪…

前端架構: 腳手架通用框架封裝之入口文件開發(教程一)

腳手架入口文件開發 創建腳手架項目: abc-cli $ mkdir abc-cli && cd abc-cli 全局安裝 lerna, $ npm i -g lerna 基于 lerna 完成項目初始化 $ lerna init 基于 lerna 創建腳手架 cli $ lerna create cli一路回車 好現在生成了一個 cli 的模板&#xff0c;目前需要…