解鎖Spring Boot多項目共享Redis:優雅Key命名結構指南

引言

Redis 基礎與 Spring Boot 集成

Redis 簡介

Redis,即 Remote Dictionary Server,是一個開源的基于內存的數據結構存儲系統,可用作數據庫、緩存和消息中間件 。它具備諸多顯著特性,使其在現代軟件開發中占據重要地位。

Redis 的讀寫速度極快,能讀的速度是 110000 次 /s,寫的速度是 81000 次 /s,這得益于其將數據存儲在內存中,避免了磁盤 I/O 的延遲。同時,Redis 支持豐富的數據結構,除了基本的字符串(String)類型,還包括哈希(Hash)、列表(List)、集合(Set)和有序集合(Sorted Set)等。比如,哈希類型適合存儲對象,將對象的各個屬性作為字段,屬性值作為對應的值,方便對對象的存儲和讀取;有序集合則常用于實現排行榜功能,通過為每個元素關聯一個分數,可輕松實現按分數排序。此外,Redis 還支持數據持久化,提供了 RDB(Redis Database Backup)和 AOF(Append Only File)兩種持久化方式,RDB 通過創建數據快照來保存內存中的數據,適合快速恢復;AOF 則記錄服務器執行的所有寫操作命令,重啟時通過重新執行這些命令來恢復數據,提供更高的數據完整性,這確保了即使在服務器故障或重啟的情況下,數據也不會丟失。Redis 還具備高可用性,支持主從復制和哨兵模式,主從復制實現了數據的備份和讀寫分離,哨兵模式則用于監控主從復制集群中的 Redis 實例,并在主節點故障時自動進行故障轉移,確保服務的連續性和數據的可用性。

基于這些特性,Redis 在眾多領域有著廣泛的應用場景。在緩存方面,它可用于存儲頻繁訪問的數據,如網站或應用中的熱點數據、配置信息、用戶登錄狀態等,大大提高訪問速度,減少對后端數據庫的訪問壓力;在會話存儲中,可替代傳統的數據庫會話存儲方式,實現會話的集中管理,提高系統的可擴展性;利用其原子操作,Redis 還能實現計數器功能,如統計網站訪問量、用戶點擊次數、文章閱讀量等;消息隊列也是 Redis 的常見應用之一,在實時通訊系統中,可使用 Redis 的列表數據結構實現消息隊列,生產者將任務添加到隊列,消費者從隊列中取出任務并處理,實現任務的異步處理,提高系統吞吐量;此外,在排行榜、實時分析、發布 / 訂閱等場景中,Redis 也都發揮著重要作用。

Spring Boot 集成 Redis

在 Spring Boot 項目中集成 Redis 是一項相對簡單的操作,常用的方式是通過 Spring Data Redis 來實現。Spring Data Redis 為 Redis 提供了高度封裝的客戶端,使得在 Spring Boot 應用中使用 Redis 變得更加便捷。以下是基本的配置步驟:

  1. 添加依賴:在項目的pom.xml文件中添加 Spring Data Redis 的依賴。如果使用 Maven 構建項目,添加如下依賴:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

如果需要使用 Jedis 作為 Redis 客戶端(Spring Boot 默認使用 Lettuce),可以排除 Lettuce 并添加 Jedis 依賴:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><exclusions><exclusion><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId></exclusion></exclusions>
</dependency>
<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId>
</dependency>
  1. 配置 Redis 連接:在application.yml或application.properties文件中配置 Redis 的連接信息。以application.yml為例:
spring:redis:host: 127.0.0.1 # Redis服務器地址port: 6379 # Redis服務器端口password: # Redis密碼(如果有)database: 0 # 數據庫索引(默認為0)timeout: 1800000 # 連接超時時間(毫秒)lettuce:pool:max-active: 20 # 連接池最大連接數max-wait: -1 # 最大阻塞等待時間(負數表示無限制)max-idle: 5 # 最大空閑連接數min-idle: 0 # 最小空閑連接數

從 Spring Boot 2.x 開始,推薦使用spring.data.redis配置方式。

3. 創建 Redis 配置類:創建一個配置類來定義RedisTemplate,并設置序列化器。例如:

package com.example.config;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configurationpublic class RedisConfig {@Beanpublic RedisTemplate < String, Object > redisTemplate(RedisConnectionFactory factory) {RedisTemplate < String, Object > template = new RedisTemplate < > ();template.setConnectionFactory(factory);// 設置鍵的序列化器template.setKeySerializer(new StringRedisSerializer());// 設置值的序列化器,這里可以根據需求選擇合適的序列化方式,如Jackson2JsonRedisSerializertemplate.setValueSerializer(new StringRedisSerializer());return template;}}

通過上述配置,就可以在 Spring Boot 項目中使用RedisTemplate來操作 Redis 了。例如,在服務類中注入RedisTemplate,并使用它進行數據的存儲和讀取:

package com.example.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;@Servicepublic class RedisService {@Autowiredprivate RedisTemplate < String, Object > redisTemplate;public void setValue(String key, Object value) {redisTemplate.opsForValue().set(key, value);}public Object getValue(String key) {return redisTemplate.opsForValue().get(key);}}

在業務邏輯中,就可以通過注入RedisService來使用 Redis 的相關功能了。

package com.example.controller;import com.example.service.RedisService;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class RedisController {@Autowiredprivate RedisService redisService;@GetMapping("/redis/test")public String testRedis() {redisService.setValue("testKey", "testValue");Object value = redisService.getValue("testKey");return "Value from Redis: " + value;}}

通過以上步驟,就完成了 Spring Boot 與 Redis 的集成,能夠在項目中充分利用 Redis 的強大功能。

多項目共用 Redis 面臨的問題

Key 沖突風險

當多個 Spring Boot 項目共用一個 Redis 實例時,若 key 命名缺乏統一規范和設計,沖突風險便會顯著增加。想象一下,有兩個不同的 Spring Boot 項目,一個是電商項目,用于處理商品信息和訂單數據;另一個是內容管理項目,負責文章的存儲和展示 。在電商項目中,開發人員可能會使用簡單的product:123作為商品 ID 為 123 的緩存 key,來存儲商品的詳細信息,如名稱、價格、庫存等。而在內容管理項目中,開發人員也可能出于方便,使用article:123來緩存 ID 為 123 的文章內容。當這兩個項目共用一個 Redis 時,就極有可能出現123這個標識符沖突的情況,導致數據相互覆蓋或讀取錯誤。這種沖突一旦發生,會嚴重影響系統的正常運行,導致業務數據錯誤,比如用戶在電商平臺看到錯誤的商品價格,或者在內容平臺看到錯誤的文章內容,進而影響用戶體驗和業務的正常開展。

管理維護難題

混亂無序的 key 命名結構會給后期的管理、維護和問題排查帶來極大的困難。在實際的開發場景中,隨著項目的不斷迭代和功能的日益復雜,Redis 中存儲的數據量會逐漸增大。如果沒有清晰的 key 命名規則,當需要查找某個特定業務的數據時,開發人員就如同在一個雜亂無章的倉庫中尋找一件特定的物品,無從下手。例如,在一個包含多個微服務的大型項目中,不同的微服務負責不同的業務模塊,如用戶管理、訂單處理、支付結算等。如果各個微服務在使用 Redis 時隨意命名 key,當出現緩存數據異常,如數據過期時間不正確、數據丟失等問題時,開發人員很難快速定位到是哪個微服務、哪個業務模塊產生的問題。這不僅會耗費大量的時間和精力在排查問題上,還可能導致問題長時間得不到解決,影響整個系統的穩定性和可靠性。此外,在進行系統優化時,如清理過期數據、調整緩存策略等,混亂的 key 命名也會增加操作的難度和風險,稍有不慎就可能誤操作其他業務的數據。

優雅的 Key 命名結構設計原則

可讀性原則

可讀性是 key 命名的首要原則,一個具有清晰業務含義的 key 命名能夠讓開發人員一眼就明白其代表的內容。以電商項目為例,若要緩存商品信息,使用product:商品ID:info的命名方式就非常直觀,其中product明確表示這是商品相關的數據,商品ID用于唯一標識具體的商品,info則說明存儲的是商品的詳細信息,如名稱、價格、庫存等。這樣的命名結構,無論是在項目開發過程中,還是后期的維護階段,開發人員都能輕松理解每個 key 的用途,降低溝通成本和出錯概率。相比之下,如果使用諸如abc123這樣毫無意義的命名,其他人在查看代碼或操作 Redis 時,就需要花費大量時間去猜測這個 key 所代表的含義,大大降低了開發效率和代碼的可維護性。

唯一性原則

確保不同項目、不同業務模塊的 key 不重復是保證 Redis 數據準確性和一致性的關鍵。為實現這一點,可以采用項目前綴和業務模塊前綴相結合的方式。比如,有兩個 Spring Boot 項目,一個是電商項目,前綴定義為ecommerce;另一個是內容管理項目,前綴定義為content。在電商項目的訂單模塊中,緩存訂單信息的 key 可以命名為ecommerce:order:訂單ID:info,而在內容管理項目的文章模塊中,緩存文章詳情的 key 可以命名為content:article:文章ID:details。通過這種方式,即使不同項目或業務模塊中存在相同的標識符(如訂單ID和文章ID可能都使用數字自增作為標識),由于前綴的不同,也不會發生 key 沖突的情況。此外,還可以使用 UUID(通用唯一識別碼)作為 key 的一部分,進一步增強 key 的唯一性,但需要注意的是,UUID 雖然能夠保證唯一性,但由于其長度較長,會占用更多的內存空間和網絡帶寬,因此需要根據實際情況權衡使用。

可擴展性原則

一個優秀的 key 命名結構應能適應業務的發展和項目的擴充。隨著業務的增長,可能會出現新的業務模塊或功能,這就要求 key 命名結構具備足夠的靈活性。例如,在一個社交平臺項目中,最初只包含用戶基本信息和動態發布功能。此時,緩存用戶信息的 key 可以命名為social:user:用戶ID:basic_info,緩存用戶動態的 key 可以命名為social:user:用戶ID:dynamic。當業務發展,增加了好友關系和私信功能后,如果之前的 key 命名結構設計合理,就可以方便地擴展。比如,緩存用戶好友列表的 key 可以命名為social:user:用戶ID:friends_list,緩存私信內容的 key 可以命名為social:user:用戶ID:private_messages:消息ID。這樣的命名結構通過在原有的基礎上增加特定的業務標識,既能保持與原有結構的一致性,又能滿足新功能的需求,使得項目在不斷發展過程中,Redis 的 key 管理依然井然有序,不會因為業務的擴展而導致 key 命名混亂。

簡潔性原則

在保證可讀性和唯一性的前提下,應盡量避免復雜冗長的命名,簡潔的 key 命名可以提高操作效率。一方面,較短的 key 在網絡傳輸和存儲時占用的資源更少,能夠減少網絡開銷和內存占用,提高系統性能。例如,在一個高并發的秒殺系統中,大量的商品庫存信息需要緩存到 Redis 中,如果 key 命名過于復雜,如seckill:product:the_first_product_in_this_seckill_activity_with_a_very_long_description:stock,不僅會增加網絡傳輸的時間,還會占用更多的內存空間,在高并發情況下,可能會成為系統性能的瓶頸。而使用簡潔的命名,如seckill:p1:stock,既能準確表達商品庫存的含義,又能提高操作效率。另一方面,簡潔的 key 更容易編寫和記憶,降低開發人員出錯的概率。在實際開發中,開發人員需要頻繁地操作 Redis,如果 key 命名過于復雜,很容易在編寫代碼時出現拼寫錯誤或遺漏,導致程序出現意想不到的錯誤。因此,在設計 key 命名結構時,應在滿足業務需求的前提下,盡可能地簡化 key 的命名,以提高系統的整體性能和開發效率。

具體的 Key 命名結構示例

項目名 + 模塊名 + 業務標識 + 唯一 ID

這種結構能夠清晰地標識數據所屬的項目、模塊以及具體業務和唯一實例。例如,在一個包含電商項目和內容管理項目的多項目架構中:

  • 電商項目 - 訂單模塊:若要緩存訂單信息,key 可以設計為ecommerce:order:order_id_123:info,其中ecommerce代表電商項目,order表示訂單模塊,order_id_123是訂單的唯一 ID,info表示這是訂單的詳細信息。這樣的命名方式,當開發人員在 Redis 中看到這個 key 時,能迅速明白它是電商項目訂單模塊下特定訂單的詳細信息。如果需要查詢某個訂單的信息,通過這個清晰的 key 結構,就可以快速定位到相應的數據。
  • 內容管理項目 - 文章模塊:緩存文章內容的 key 可以是content:article:article_id_456:content,content是內容管理項目的標識,article表示文章模塊,article_id_456是文章的唯一 ID,content表示存儲的是文章的具體內容。這種命名結構使得不同項目、不同模塊的數據在 Redis 中能夠明確區分,有效避免了 key 沖突,并且在進行數據管理和維護時,能夠快速準確地找到所需數據。

分層式命名結構

分層式命名結構是按照數據類型、業務層級等進行分層命名,使 key 的結構更加清晰,便于管理和維護。

  • 按數據類型分層:可以將數據分為緩存數據、會話數據、計數器數據等不同類型。例如,緩存數據的 key 可以以cache:作為前綴,會話數據以session:作為前綴,計數器數據以counter:作為前綴。在電商項目中,緩存商品列表的 key 可以是cache:ecommerce:product:list,這里cache表示這是緩存數據,ecommerce是電商項目,product是商品模塊,list表示這是商品列表數據。通過這種方式,在進行數據清理、統計等操作時,可以根據前綴快速篩選出特定類型的數據。
  • 按業務層級分層:以一個大型企業級應用為例,假設應用包含多個業務領域,如客戶關系管理(CRM)、企業資源規劃(ERP)等。在 CRM 領域中,又包含客戶信息、銷售機會等業務模塊。對于客戶信息的緩存,key 可以設計為crm:customer:basic_info:customer_id_789,其中crm表示客戶關系管理業務領域,customer表示客戶信息模塊,basic_info表示客戶基本信息,customer_id_789是客戶的唯一 ID。這種按業務層級分層的命名方式,能夠清晰地展示數據在業務架構中的位置,方便開發人員理解和管理數據,同時也有利于系統的擴展和維護,當業務發生變化或新增業務模塊時,可以很容易地在現有的分層結構上進行擴展。

實現 Key 命名規范的技術手段

自定義 Key 生成器

在 Spring Boot 中,通過自定義 Key 生成器可以靈活地控制 key 的生成邏輯,使其符合項目的特定需求。Spring 提供了KeyGenerator接口,我們可以實現該接口來自定義 key 的生成方式。

例如,假設我們有一個電商項目,其中訂單模塊需要緩存訂單信息,并且希望 key 能夠包含訂單所屬的用戶 ID、訂單 ID 以及時間戳,以確保 key 的唯一性和業務關聯性。我們可以創建一個自定義的KeyGenerator實現類:

import org.springframework.cache.interceptor.KeyGenerator;import org.springframework.stereotype.Component;import java.lang.reflect.Method;import java.util.Date;@Componentpublic class OrderKeyGenerator implements KeyGenerator {@Overridepublic Object generate(Object target, Method method, Object...params) {// 假設第一個參數是訂單ID,第二個參數是用戶IDif (params != null && params.length >= 2) {Long orderId = (Long) params[0];Long userId = (Long) params[1];long timestamp = new Date().getTime();return "ecommerce:order:user_" + userId + ":order_" + orderId + ":" + timestamp;}return null;}}

在上述代碼中,generate方法接收目標對象、方法以及方法參數。通過解析參數,我們獲取訂單 ID 和用戶 ID,并結合當前時間戳生成一個唯一的 key。在使用緩存時,我們可以指定使用這個自定義的KeyGenerator:

import org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class OrderService {@Cacheable(value = "orderCache", keyGenerator = "orderKeyGenerator")public String getOrderDetails(Long orderId, Long userId) {// 實際的業務邏輯,查詢訂單詳情return "Order details for orderId: " + orderId + ", userId: " + userId;}}

在getOrderDetails方法上使用@Cacheable注解,并指定keyGenerator為我們自定義的orderKeyGenerator,這樣在緩存該方法的返回值時,就會使用自定義的 key 生成邏輯。通過這種方式,我們可以根據業務需求靈活地生成符合規范的 key,避免 key 沖突,同時也提高了緩存的命中率和數據的可管理性。

使用常量類管理 Key 前綴

使用常量類統一管理 key 前綴是提高代碼可維護性和可讀性的有效方法。在一個大型項目中,可能涉及多個模塊和大量的緩存操作,如果每個地方都直接編寫 key 前綴,不僅容易出錯,而且當需要修改前綴時,需要在眾多的代碼文件中進行查找和修改,非常繁瑣。通過將所有的 key 前綴定義在一個常量類中,我們可以將這些前綴集中管理,便于修改和維護。

例如,我們有一個包含用戶模塊、商品模塊和訂單模塊的電商項目,我們可以創建一個RedisKeyConstants常量類來管理 key 前綴:

public class RedisKeyConstants {public static final String USER_PREFIX = "ecommerce:user:";public static final String PRODUCT_PREFIX = "ecommerce:product:";public static final String ORDER_PREFIX = "ecommerce:order:";}

在使用時,我們可以直接引用這些常量來生成 key。比如,在用戶模塊中緩存用戶信息:

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.stereotype.Service;@Servicepublic class UserService {@Autowiredprivate RedisTemplate < String, Object > redisTemplate;public void cacheUserInfo(Long userId, Object userInfo) {String key = RedisKeyConstants.USER_PREFIX + userId + ":info";redisTemplate.opsForValue().set(key, userInfo);}public Object getUserInfo(Long userId) {String key = RedisKeyConstants.USER_PREFIX + userId + ":info";return redisTemplate.opsForValue().get(key);}}

通過這種方式,當需要修改ecommerce這個項目前綴時,只需要在RedisKeyConstants常量類中修改一次即可,而不需要在所有涉及 key 生成的代碼中進行修改,大大提高了代碼的可維護性。同時,常量類的使用也使得代碼更加清晰易讀,其他開發人員在閱讀代碼時能夠一目了然地知道每個 key 所屬的模塊和業務。

實際應用案例分析

案例背景介紹

假設有一家大型互聯網公司,旗下擁有多個 Spring Boot 項目,包括電商平臺、社交平臺和內容管理系統 。為了提高資源利用率和降低成本,這些項目共用一個 Redis 集群來存儲緩存數據、會話信息和一些計數器數據。電商平臺負責商品展示、交易等業務;社交平臺處理用戶關系、動態發布等功能;內容管理系統則專注于文章的發布、編輯和展示。在這個架構下,Redis 成為了各個項目之間數據共享和交互的關鍵樞紐。

優化前的 Key 命名問題

在項目初期,由于缺乏統一的規劃,各個項目對 Redis 的 key 命名比較隨意。電商平臺可能會使用product:123來緩存商品 ID 為 123 的信息,社交平臺則可能用user:123來存儲用戶 ID 為 123 的資料,內容管理系統也可能使用article:123來緩存文章 ID 為 123 的內容。這種命名方式導致了嚴重的 key 沖突問題。例如,當社交平臺和電商平臺同時使用123這個 ID 時,就會出現數據覆蓋的情況,導致社交平臺的用戶資料被電商平臺的商品信息覆蓋,或者反之。此外,當需要對 Redis 中的數據進行清理、統計或維護時,由于 key 命名缺乏規律,開發人員很難快速準確地定位到特定項目或業務的數據,大大增加了管理和維護的難度。比如,在進行數據清理時,可能會誤刪其他項目的數據,影響整個系統的正常運行。

優化后的 Key 命名方案及效果

為了解決上述問題,公司制定了統一的 key 命名規范,采用項目名 + 模塊名 + 業務標識 + 唯一 ID 的結構。在電商平臺中,緩存商品信息的 key 改為ecommerce:product:123:info,其中ecommerce是項目名,product是模塊名,123是商品唯一 ID,info表示商品信息;社交平臺緩存用戶資料的 key 變為social:user:123:profile,social是項目名,user是模塊名,123是用戶唯一 ID,profile表示用戶資料;內容管理系統緩存文章內容的 key 則為content:article:123:content,content是項目名,article是模塊名,123是文章唯一 ID,content表示文章內容。

通過這種優化后的命名方案,key 沖突的問題得到了有效解決,不同項目和業務模塊的數據能夠清晰地分離。在系統維護方面,開發人員可以根據 key 的結構快速定位到所需的數據,例如使用SCAN命令配合MATCH模式,如SCAN 0 MATCH "ecommerce:product:*:info" COUNT 100,可以快速獲取電商平臺所有商品信息的 key,便于進行數據統計、清理等操作。同時,這種規范的命名方式也提高了代碼的可讀性和可維護性,新加入的開發人員能夠快速理解每個 key 的含義和用途,降低了學習成本和出錯概率,從而提升了整個系統的穩定性和可靠性。

總結與展望

在多個 Spring Boot 項目共用一個 Redis 的場景中,合理設置 key 命名結構是確保系統穩定、高效運行的關鍵。通過遵循可讀性、唯一性、可擴展性和簡潔性等原則,我們能夠設計出易于理解、維護且能適應業務變化的 key 命名方案。無論是采用項目名 + 模塊名 + 業務標識 + 唯一 ID 的具體結構,還是分層式命名結構,都能有效避免 key 沖突,提升數據管理的便捷性。借助自定義 Key 生成器和常量類管理 Key 前綴等技術手段,我們可以在代碼層面更好地實現和遵循這些命名規范。

從實際應用案例來看,優化后的 key 命名方案顯著提升了系統的可維護性和穩定性,降低了開發和運維成本。隨著業務的不斷發展和技術的持續進步,未來可能會面臨更復雜的應用場景和更高的性能要求。例如,在微服務架構日益普及的情況下,服務間的通信和數據交互更加頻繁,Redis 作為重要的數據存儲和緩存工具,其 key 命名的合理性將對整個微服務生態的健康運行產生深遠影響。同時,隨著人工智能、大數據等新興技術與傳統業務的深度融合,可能會產生新的數據類型和業務需求,這就要求我們進一步完善和創新 key 命名結構,以滿足不斷變化的業務需求。

在未來的研究和實踐中,可以探索將人工智能技術應用于 key 命名的優化,通過機器學習算法自動分析業務數據和訪問模式,生成更智能、更高效的 key 命名策略。此外,隨著分布式系統的規模不斷擴大,如何在多數據中心、跨地域的環境下統一管理和維護 Redis 的 key 命名,也是需要深入研究的方向。總之,合理設置 Redis 的 key 命名結構是一個持續演進的過程,需要我們不斷關注技術發展趨勢,結合實際業務需求,持續優化和改進。

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

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

相關文章

《重構項目》基于Apollo架構設計的項目重構方案(多種地圖、多階段、多任務、狀態機管理)

1. 項目結構設計project/ ├── config/ # 配置文件&#xff08;定義 Scenario、Stage、Task 的映射&#xff09; ├── src/ │ ├── base/ # 抽象基類定義 │ │ ├── scenario_base.h/.cpp │ │ ├── stage_base.h/.cpp…

動手學深度學習13.6. 目標檢測數據集-筆記練習(PyTorch)

以下內容為結合李沐老師的課程和教材補充的學習筆記&#xff0c;以及對課后練習的一些思考&#xff0c;自留回顧&#xff0c;也供同學之人交流參考。 本節課程地址&#xff1a;數據集_嗶哩嗶哩_bilibili 本節教材地址&#xff1a;13.6. 目標檢測數據集 — 動手學深度學習 2.0…

Unity3D游戲內存優化指南

前言 Unity3D 游戲的內存控制是保證游戲流暢運行&#xff08;尤其在移動端和主機平臺&#xff09;和避免崩潰的關鍵挑戰。以下是核心策略和常見問題的解決方案&#xff1a; 對惹&#xff0c;這里有一個游戲開發交流小組&#xff0c;希望大家可以點擊進來一起交流一下開發經驗…

git學習:首次創建倉庫

文章目錄前言&#xff1a;1、首次創建倉庫并上傳數據1.1 創建倉庫&#xff0c;1.2 命令上傳1.3 首次代碼上傳至倉庫的步驟&#xff1a;2、分支操作2.1 分支的刪除2.2 切換分支2.3 查看分支2.4 同步其他分支的修改3、查看電腦的配置文件4、遠程倉庫命令 git remote5、其他后語前…

C++并行計算:OpenMP與MPI全解析

在高性能計算領域&#xff0c;充分利用硬件資源的并行計算技術已成為剛需。從單節點多核到跨節點集群&#xff0c;開發者需要掌握不同的并行編程模型。本文將系統講解兩種主流并行技術&#xff1a;OpenMP&#xff08;共享內存多核并行&#xff09;與MPI&#xff08;分布式內存集…

TCP 動態選路協議全面研究:OSPF、BGP 與 IS-IS 的比較與應用分析

一、引言&#xff1a;動態選路協議概述 在現代計算機網絡中&#xff0c;路由選擇是數據傳輸的核心功能&#xff0c;它決定了數據包從源到目的地的路徑選擇。隨著網絡規模的不斷擴大和復雜性的增加&#xff0c;靜態路由已經無法滿足網絡動態變化的需求&#xff0c;動態路由協議…

OpenCV 圖像哈希類cv::img_hash::AverageHash

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::img_hash::AverageHash是OpenCV中用于圖像哈希&#xff08;Image Hashing&#xff09;的一個類&#xff0c;屬于opencv_img_hash模塊。它實現了…

【Python-網絡爬蟲】爬蟲的基礎概念介紹

目錄 一、爬蟲的介紹 1.1 爬蟲的概念 1.2 爬蟲的作用 1. 搜索引擎數據索引 2. 商業數據采集與分析 3. 輿情監控與社交分析 4. 學術研究與數據挖掘 5. 信息聚合與服務優化 二、爬蟲的分類 三、爬蟲的基本流程 3.1 基本流程 3.2 Robots協議 一、爬蟲的介紹 1.1 爬蟲的…

力扣-31.下一個排列

題目鏈接 31.下一個排列 class Solution {public void nextPermutation(int[] nums) {//1.從右往左找第一個非逆序的數aint left nums.length - 2; //這里是為了找不到順序對的時候正好停在-1while (left > 0 && nums[left] > nums[left 1]) { //一定要取等號…

Python爬蟲實戰:研究python-nameparser庫相關技術

1. 引言 在當今數字化時代,姓名作為個人身份的重要標識,在許多領域都有著廣泛的應用需求。例如,在客戶關系管理系統中,準確解析姓名可以幫助企業更好地了解客戶背景;在學術研究中,分析作者姓名分布有助于發現研究團隊的地域特征;在社交網絡分析中,姓名信息可以輔助進行…

Android中MVI架構詳解

博主前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住也分享一下給大家 ??點擊跳轉到教程 什么是 MVI 架構? MVI (Model-View-Intent) 是一種單向數據流的架構模式,它源于響應式編程思想。在 MVI 中: 架構圖: 1、Model: 代表的是UI 狀態,它包含了…

AutoGen-AgentChat-3-人機交互

import os from dotenv import load_dotenvload_dotenv()True人機交互 在上一節“團隊”中&#xff0c;我們了解了如何創建、觀察和控制代理團隊。本節將重點介紹如何在應用程序中與團隊進行交互&#xff0c;并向團隊提供人工反饋。 您可以通過兩種主要方式從您的應用程序與團隊…

Flink Db2 CDC 環境配置與驗證

一、DB2 數據庫核心配置 1. 啟用數據庫日志記錄與CDC支持 -- 以DB2管理員身份連接數據庫 CONNECT TO mydb USER db2inst1 USING password;-- 啟用數據庫歸檔日志模式&#xff08;CDC依賴&#xff09; UPDATE DATABASE CONFIGURATION USING LOGARCHMETH1 DISK:/db2log/archive…

初識單例模式

文章目錄場景通點定義實現思路六種 Java 實現餓漢式懶漢式synchronized 方法雙重檢查鎖 Double Check Lock Volatile靜態內部類 Singleton Holder枚舉單例單例運用場景破解單例模式參考場景通點 資源昂貴&#xff1a;數據庫連接池、線程池、日志組件&#xff0c;只需要一份全…

音樂搶單源碼(連單卡單/疊加組規則/打針/多語言)

簡介&#xff1a; 測試環境&#xff1a;Nginx、PHP7.2、MySQL5.6&#xff0c;運行目錄設置為public&#xff0c;偽靜態thinkphp&#xff0c;建議開啟SSL 測試語言&#xff1a;11種 不知道誰給我的一套&#xff0c;說是買來的&#xff0c;我看了一下功能感覺也一般&#…

分類樹查詢性能優化:從 2 秒到 0.1 秒的技術蛻變之路

在電商系統中&#xff0c;分類樹查詢是一個基礎且高頻的功能&#xff0c;然而這個看似簡單的功能背后卻隱藏著不小的性能挑戰。本文將分享我們在實際項目中對分類樹查詢功能進行五次優化的全過程&#xff0c;看如何將查詢耗時從 2 秒縮短至 0.1 秒&#xff0c;為用戶提供更流暢…

Ansible 介紹及安裝

簡介 Ansible 是一款開源的自動化工具&#xff0c;廣泛應用于配置管理、應用部署、任務自動化以及多節點管理等領域。它由 Michael DeHaan 于 2012 年創建&#xff0c;ansible 目前已經已經被紅帽官方收購&#xff0c;是自動化運維工具中大家認可度最高的&#xff0c;并且上手…

超光譜相機的原理和應用場景

超光譜相機是光譜成像技術的尖端形態&#xff0c;具備亞納米級光譜分辨率與超千波段連續覆蓋能力&#xff0c;通過“圖譜合一”的三維數據立方體實現物質的精準識別與分析。其核心技術架構、應用場景及發展趨勢如下&#xff1a;一、核心技術原理1、?分光機制??干涉分光?&am…

掌握MySQL函數:高效數據處理指南

? 在 MySQL 數據庫管理系統中&#xff0c;函數扮演著極為重要的角色。它們就像是數據庫操作的得力助手&#xff0c;能夠幫助開發者高效地完成各種數據處理任務。本文將深入探討 MySQL 函數的方方面面&#xff0c;從其基本概念到實際應用&#xff0c;幫助讀者全面掌握這一強大的…