Java學習筆記(二十三)

1 @CacheEvict

@CacheEvict是Spring框架中用于清空緩存的注解。以下是對@CacheEvict注解的詳細介紹:

1.1 作用

@CacheEvict注解的主要作用是刪除緩存中的數據。在方法執行后或執行前(根據配置),它可以清空指定的緩存項或整個緩存區域。這對于刪除舊的數據或無效的數據非常有用,可以確保緩存中的數據始終是最新的。

1.2 常用屬性

@CacheEvict注解包含多個屬性,用于配置緩存刪除的行為:

  1. value/cacheNames:指定要清空的緩存的名稱。可以是一個字符串或一個字符串數組,表示該方法將清空哪個緩存區域中的數據。如果指定了多個緩存名稱,那么這些緩存區域中的數據都將被清空。
  2. key:指定要清空的緩存項的鍵。通過該屬性,可以精確控制要刪除的緩存數據。可以使用SpEL表達式來動態生成鍵的值。
  3. allEntries:一個布爾值,用于指定是否清空緩存中的所有數據。如果設置為true,那么將刪除指定緩存區域中的所有數據;如果設置為false(默認值),則只刪除與指定鍵相匹配的緩存項。
  4. beforeInvocation:一個布爾值,用于指定是否在方法執行前清空緩存。如果設置為true,那么緩存的清空操作將在方法執行之前進行;如果設置為false(默認值),則緩存的清空操作將在方法執行之后進行。需要注意的是,如果在方法執行前清空緩存,并且方法執行失敗(拋出異常),那么緩存將不會被重新填充。

1.3 使用示例

以下是一個使用@CacheEvict注解的示例:

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;// 使用@Cacheable注解緩存用戶數據@Cacheable(value = "users", key = "#id")public User getUserById(Long id) {return userRepository.findById(id).orElse(null);}// 使用@CacheEvict注解刪除用戶數據對應的緩存@CacheEvict(value = "users", key = "#user.id")public void saveUser(User user) {userRepository.save(user);}
}

在上面的示例中,UserService類中的getUserById方法使用了@Cacheable注解來緩存用戶數據。而saveUser方法則使用了@CacheEvict注解來刪除與保存的用戶數據相對應的緩存項。這樣,在每次保存用戶數據后,都可以確保緩存中的數據是最新的。

1.4 注意事項

  1. 在使用@CacheEvict注解時,必須指定要清空的緩存名稱(value/cacheNames屬性)和緩存項的鍵(key屬性)。
  2. 如果指定了allEntries屬性為true,那么將刪除指定緩存區域中的所有數據,因此需要謹慎使用。
  3. 如果在方法執行前清空緩存(beforeInvocation屬性為true),并且方法執行失敗,那么緩存將不會被重新填充。這可能會導致在某些情況下出現數據不一致的問題。因此,在使用beforeInvocation屬性時,需要充分考慮方法的執行情況和可能的異常處理。

總之,@CacheEvict注解是Spring框架中用于清空緩存的重要工具。通過合理配置其屬性,可以實現對緩存數據的精確控制和管理。

2 @Caching

@Caching注解是Spring Cache提供的一個功能強大的組合注解,它允許開發者在一個方法或類上同時指定多個緩存操作相關的注解。以下是關于@Caching注解的詳細介紹:

2.1 @Caching注解的主要功能

@Caching注解通過組合多個Spring Cache注解(如@Cacheable、@CachePut、@CacheEvict等),能夠定義復雜的緩存規則。這使得開發者可以在一個方法上靈活地配置多種緩存行為,而無需編寫重復的緩存處理代碼。

2.2 @Caching注解的屬性

@Caching注解擁有三個主要屬性,每個屬性都可以接收一個或多個相應的注解作為值:

  1. cacheable:用于指定一個或多個@Cacheable注解的組合。@Cacheable注解用于查詢緩存,如果緩存中存在相應的數據,則直接返回緩存數據而不執行方法。如果沒有緩存數據,則執行方法并將結果添加到緩存中。
  2. put:用于指定一個或多個@CachePut注解的組合。@CachePut注解無論方法是否被執行,都會將方法的返回值放入指定的緩存中。這通常用于更新緩存數據。
  3. evict:用于指定一個或多個@CacheEvict注解的組合。@CacheEvict注解用于刪除緩存中的數據,通常用于刪除操作或數據更新后的緩存同步。

2.3 @Caching注解的使用示例

以下是一個使用@Caching注解的示例,展示了如何在一個方法上同時指定查詢緩存、更新緩存和刪除緩存的操作:

@Caching(cacheable = @Cacheable(key = "'userCache:'+ #uid"),put = @CachePut(key = "'userCache:'+ #uid"),evict = { @CacheEvict(key = "'userCache:'+ #uid"), @CacheEvict(key = "'addressCache:'+ #uid"), @CacheEvict(key = "'messageCache:'+ #uid") }
)
public User updateRef(String uid) {// 業務邏輯return null;
}

在這個示例中,updateRef方法被配置了多個緩存操作:

  • 使用@Cacheable注解查詢userCache緩存,如果緩存中存在以uid為鍵的數據,則直接返回該數據。
  • 使用@CachePut注解更新userCache緩存,將方法的返回值放入緩存中。
  • 使用多個@CacheEvict注解刪除userCacheaddressCachemessageCache緩存中以uid為鍵的數據。

2.4 @Caching注解的注意事項

  1. SpEL表達式:在@Caching注解的屬性中,可以使用Spring Expression Language(SpEL)表達式來動態生成緩存的鍵(key)。這提供了很大的靈活性,允許開發者根據方法的參數或返回值來定制緩存的鍵。
  2. 緩存配置:在使用@Caching注解之前,需要確保已經配置了Spring Cache的相關依賴和緩存管理器(CacheManager)。這通常通過在Spring Boot應用程序的主類或配置類上使用@EnableCaching注解來啟用緩存支持,并通過application.properties或application.yml文件進行自定義配置。
  3. 緩存同步:在使用@Cacheable和@CachePut注解時,需要注意緩存的同步問題。如果多個線程同時訪問同一個緩存鍵,可能會導致數據不一致的問題。因此,在使用這些注解時,需要確保緩存的同步機制得到妥善處理。

綜上所述,@Caching注解是Spring Cache提供的一個非常有用的工具,它允許開發者在一個方法或類上同時指定多個緩存操作相關的注解。通過合理使用@Caching注解,可以大大提高應用程序的性能和可維護性。

3 @After 、@Before 、@ Around

@After@Before@Around 是Spring AOP(面向切面編程)中的注解,它們用于定義切面的通知(Advice),這些通知在目標方法執行的不同階段執行額外的邏輯。以下是這些注解的詳細介紹及示例:

3.1 @Before 注解

  • 作用:前置通知,在目標方法執行之前執行。它通常用于執行一些前置條件檢查、日志記錄等。
  • 示例
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;@Aspect
@Component
public class MyBeforeAdvice {@Before("execution(* com.example.service.*.*(..))")public void beforeAdvice() {System.out.println("Before method execution");// 在這里可以執行前置邏輯,如日志記錄、權限檢查等}
}

在這個例子中,beforeAdvice 方法會在 com.example.service 包下所有類的所有方法執行之前執行。

3.2 @After 注解

  • 作用:后置通知,在目標方法執行之后執行,無論目標方法是否拋出異常。它通常用于執行一些清理工作、日志記錄等。
  • 示例
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class MyAfterAdvice {@After("execution(* com.example.service.*.*(..))")public void afterAdvice(JoinPoint joinPoint) {System.out.println("After method execution: " + joinPoint.getSignature());// 在這里可以執行后置邏輯,如日志記錄、資源釋放等}
}

在這個例子中,afterAdvice 方法會在 com.example.service 包下所有類的所有方法執行之后執行。

3.3 @Around 注解

  • 作用:環繞通知,可以包裹目標方法的執行,擁有最大的控制權。它可以在目標方法執行前后執行自定義邏輯,甚至可以決定是否繼續執行目標方法或改變其返回值。
  • 示例
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect
@Component
public class MyAroundAdvice {@Around("execution(* com.example.service.*.*(..))")public Object aroundAdvice(ProceedingJoinPoint pjp) throws Throwable {System.out.println("Before method execution");try {Object result = pjp.proceed(); // 執行目標方法System.out.println("After method execution");return result; // 返回目標方法的執行結果} catch (Throwable throwable) {// 處理異常System.out.println("Exception occurred: " + throwable.getMessage());throw throwable; // 重新拋出異常}}
}

在這個例子中,aroundAdvice 方法會在 com.example.service 包下所有類的所有方法執行前后執行自定義邏輯。它首先打印“Before method execution”,然后執行目標方法,并打印“After method execution”。如果目標方法拋出異常,它還會捕獲并處理該異常。

3.4 總結

  • @Before 注解用于在目標方法執行之前執行前置邏輯。
  • @After 注解用于在目標方法執行之后執行后置邏輯,無論目標方法是否拋出異常。
  • @Around 注解用于在目標方法執行前后執行自定義邏輯,并可以控制是否繼續執行目標方法或改變其返回值。

這些注解在Spring AOP中非常有用,可以幫助開發者在不修改目標方法代碼的情況下實現各種復雜的功能和邏輯。

4 docker network

Docker提供了一組命令來管理和配置Linux網絡,這些命令可以創建、列出、刪除和檢查網絡,幫助用戶在Docker容器之間建立通信。以下是一些常用的Docker網絡命令及其詳細介紹:

4.1 創建網絡

  • 命令docker network create [OPTIONS] NETWORK_NAME

  • 功能:創建一個新的Docker網絡。

  • 選項

    • --driver:指定網絡驅動程序(如bridge、host、overlay等)。
    • --subnet:指定子網。
    • --gateway:指定網關。
    • --ip-range:指定可用IP地址范圍。
    • --ipv6:啟用IPv6。
    • --label:為網絡添加標簽。
  • 示例docker network create --driver bridge --subnet 192.168.1.0/24 my_network

4.2 列出網絡

  • 命令docker network ls
  • 功能:列出所有可用的Docker網絡。
  • 輸出:包括NETWORK ID、NAME、DRIVER和SCOPE等信息。

4.3 查看網絡詳情

  • 命令docker network inspect [OPTIONS] NETWORK_NAME
  • 功能:查看指定Docker網絡的詳細信息。
  • 輸出:包括網絡名稱、ID、創建時間、作用域、驅動程序、IPAM配置(子網、網關等)、容器連接信息等。

4.4 連接容器到網絡

  • 命令docker network connect [OPTIONS] NETWORK_NAME CONTAINER_NAME

  • 功能:將已創建的容器連接到指定的Docker網絡中。

  • 選項:無特定選項,但可以使用--alias為容器在網絡中設置別名。

  • 示例docker network connect my_network my_container

4.5 斷開容器與網絡的連接

  • 命令docker network disconnect [OPTIONS] NETWORK_NAME CONTAINER_NAME

  • 功能:斷開指定容器與指定Docker網絡的連接。

  • 選項:無特定選項。

  • 示例docker network disconnect my_network my_container

4.6 刪除網絡

  • 命令docker network rm [OPTIONS] NETWORK_NAME

  • 功能:刪除指定的Docker網絡。

  • 選項:無特定選項,但可以同時刪除多個網絡,如docker network rm network1 network2

  • 示例docker network rm my_network

4.7 其他注意事項

  • 網絡類型:Docker支持多種網絡類型,包括bridge(橋接網絡,默認類型)、host(主機網絡)、overlay(覆蓋網絡,用于多主機集群)等。
  • 網絡隔離:通過創建不同的網絡,可以實現容器之間的隔離,提高安全性。
  • 容器間通信:容器可以通過自定義網絡在不同主機上安全地相互通信。

綜上所述,Docker網絡命令提供了強大的網絡管理功能,允許用戶創建、配置和管理Docker容器之間的網絡連接。通過使用這些命令,用戶可以實現容器之間的隔離、通信和網絡配置,滿足各種復雜的網絡需求。

5 ElasticsearchTemplate 和 RestHighLevelClient

ElasticsearchTemplate 和 RestHighLevelClient 都是用于與 Elasticsearch 進行交互的客戶端工具,但它們在實現方式、使用場景和功能特點上有所不同。以下是對兩者的詳細介紹以及它們之間的區別:

5.1 ElasticsearchTemplate

  1. 概述
    ElasticsearchTemplate 是 Spring Data Elasticsearch 提供的一個高級抽象,它封裝了底層的 Elasticsearch 客戶端操作,使得開發者可以更方便地與 Elasticsearch 進行交互。

  2. 特點

    • 簡化操作:通過提供一系列的方法,如索引、查詢、刪除等,簡化了與 Elasticsearch 的交互過程。
    • 豐富的操作方法:支持各種 CRUD 操作,以及復雜的查詢和聚合操作。
    • 自定義查詢:允許開發者通過 Java 代碼構建自定義的查詢條件,滿足更復雜的業務需求。
  3. 使用場景

    • 適用于使用 Spring 框架的開發者,特別是那些希望利用 Spring Data Elasticsearch 提供的便利性和豐富功能的開發者。

5.2 RestHighLevelClient

  1. 概述
    RestHighLevelClient 是 Elasticsearch 官方提供的一個高級 REST 客戶端,它基于 HTTP 協議與 Elasticsearch 進行交互。與低級的 REST 客戶端相比,RestHighLevelClient 提供了更高的抽象層次和更豐富的功能。

  2. 特點

    • 官方支持:由 Elasticsearch 官方提供,與 Elasticsearch 的兼容性更好。
    • 豐富的 API:提供了包括索引管理、數據管理、查詢等在內的豐富 API。
    • 高性能:通過優化 HTTP 請求和響應的處理,提高了與 Elasticsearch 交互的性能。
  3. 功能

    • 索引管理:支持創建、刪除、判斷索引是否存在等操作。
    • 數據管理:支持寫入、批量寫入、更新等操作。
    • 查詢功能:支持基本查詢、復合查詢、聚合查詢等,可以結合原生 Elasticsearch 查詢語法實現更復雜的查詢需求。
  4. 使用場景

    • 適用于需要在 Java 應用程序中集成 Elasticsearch 的開發者,特別是那些希望使用 Elasticsearch 官方提供的高級 REST 客戶端的開發者。

5.3 兩者區別

  1. 實現方式

    • ElasticsearchTemplate 是基于 Spring Data Elasticsearch 的,它封裝了底層的 Elasticsearch 客戶端操作,提供了更高層次的抽象。
    • RestHighLevelClient 是 Elasticsearch 官方提供的 REST 客戶端,它基于 HTTP 協議與 Elasticsearch 進行交互,提供了更豐富的 API 和更高的性能。
  2. 使用場景

    • ElasticsearchTemplate 更適用于使用 Spring 框架的開發者,特別是那些希望利用 Spring Data Elasticsearch 的便利性和豐富功能的開發者。
    • RestHighLevelClient 則更適用于需要在 Java 應用程序中集成 Elasticsearch 的開發者,特別是那些希望使用 Elasticsearch 官方提供的高級 REST 客戶端的開發者。
  3. 功能特點

    • ElasticsearchTemplate 提供了豐富的操作方法,但相對來說,它的抽象層次更高,可能對于某些復雜的查詢需求需要開發者進行更多的自定義封裝。
    • RestHighLevelClient 則提供了更豐富的 API 和更高的性能,對于復雜的查詢需求,它可以更好地結合原生 Elasticsearch 查詢語法來實現。

綜上所述,ElasticsearchTemplate 和 RestHighLevelClient 都是用于與 Elasticsearch 進行交互的重要工具,但它們在實現方式、使用場景和功能特點上有所不同。開發者在選擇時,應根據自己的技術棧、業務需求以及對 Elasticsearch 的熟悉程度來做出決策。

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

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

相關文章

如何優化Elasticsearch大文檔查詢?

記錄一次業務復雜場景下DSL優化的過程 背景 B端商城業務有一個場景就是客戶可見的產品列表是需要N多閘口及各種其它邏輯組合過濾的,各種閘口數據及產品數據都是存儲在ES的(有的是獨立索引,有的是作為產品屬性存儲在產品文檔上)。 在實際使用的過程中&a…

openCvSharp 計算機視覺圖片找茬

一、安裝包 <PackageReference Include"OpenCvSharp4" Version"4.10.0.20241108" /> <PackageReference Include"OpenCvSharp4.runtime.win" Version"4.10.0.20241108" /> 二、準備兩張圖片 三、編寫代碼 using OpenCv…

實戰:FRP內網穿透部署-支持ssh、web訪問

目錄 1 準備工作2 公網服務器部署server端2.1 frps.ini配置 3 內網客戶端部署client端3.1 frpc.ini配置&#xff08;內網服務器01&#xff09;3.2 frpc.ini配置&#xff08;內網服務器02&#xff09; 4 服務啟動腳本4.1 公網服務器 server4.2 內網服務器 client 2 systemctl常見…

Uniapp中實現加載更多、下拉刷新、返回頂部功能

一、加載更多&#xff1a; 在到達底部時&#xff0c;將新請求過來的數據追加到原來的數組即可&#xff1a; import {onReachBottom } from "dcloudio/uni-app";const pets ref([]); // 顯示數據function network() {uni.request({url: "https://api.thecatap…

C# 多線程 Task TPL任務并行

先總結一下 之前發展過程的要點 1&#xff1a; 為了保證多線程正確順序執行 線程同步 2&#xff1a; 為了節省操作系統線程資源 線程池 異步 方式管理 正常來講 使用這倆個要點 進行使用 多線程可以滿足開發使用需求 但是 新的問題產生了 那就是 多個異步操作 需要編寫大量的代…

C++單例模式的設計

單例模式&#xff08;Singleton Pattern&#xff09;是一種設計模式&#xff0c;用于確保一個類只有一個實例&#xff0c;并提供一個全局訪問點來訪問該實例。在C中&#xff0c;單例模式通常用于管理全局資源或共享狀態。 以下是C中實現單例模式的幾種常見方式&#xff1a; 懶…

HBASE學習(一)

1.HBASE基礎架構&#xff0c; 1.1 參考&#xff1a; HBase集群架構與讀寫優化&#xff1a;理解核心機制與性能提升-CSDN博客 1.2問題&#xff1a; 1.FLUSH對hbase的影響 2. HLog和memstore的區別 hlog中存儲的是操作記錄&#xff0c;比如寫、刪除。而memstor中存儲的是寫入…

Flutter:封裝ActionSheet 操作菜單

演示效果圖 action_sheet_util.dart import package:ducafe_ui_core/ducafe_ui_core.dart; import package:flutter/material.dart; import package:demo/common/index.dart;class ActionSheetUtil {/// 底部操作表/// [context] 上下文/// [title] 標題/// [items] 選項列表 …

【Rust練習】28.use and pub

練習題來自&#xff1a;https://practice-zh.course.rs/crate-module/use-pub.html 1 使用 use 可以將兩個同名類型引入到當前作用域中&#xff0c;但是別忘了 as 關鍵字. use std::fmt::Result; use std::io::Result;fn main() {}利用as可以將重名的內容取別名&#xff1a;…

Nginx 可觀測性最佳實踐

Nginx 介紹 Nginx 是一個開源、輕量級、高性能的 HTTP 和反向代理服務器&#xff0c;也可以用于 IMAP/POP3 代理服務器。Nginx 因其采用的異步非阻塞工作模型&#xff0c;使其具備高并發、低資源消耗的特性。高度模塊化設計也使得 Nginx 具備很好的擴展性&#xff0c;在處理靜…

《汽車維護與修理》是什么級別的期刊?是正規期刊嗎?能評職稱嗎?

?問題解答&#xff1a; 問&#xff1a;《汽車維護與修理》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知網收錄的正規學術期刊。 問&#xff1a;《汽車維護與修理》級別&#xff1f; 答&#xff1a;國家級。主管單位&#xff1a;中國汽車維修行業協會 …

PHP智慧小區物業管理小程序

&#x1f31f;智慧小區物業管理小程序&#xff1a;重塑社區生活&#xff0c;開啟便捷高效新篇章 &#x1f31f; 智慧小區物業管理小程序是一款基于PHPUniApp精心雕琢的智慧小區物業管理小程序&#xff0c;它猶如一股清新的科技之風&#xff0c;吹進了現代智慧小區的每一個角落…

洛谷P4868 Preprefix sum

洛谷傳送門 題目描述 前綴和&#xff08;prefix sum&#xff09;&#x1d446;&#x1d456;。 前前綴和&#xff08;preprefix sum&#xff09;則把 &#x1d446;&#x1d456; 作為原序列再進行前綴和。記再次求得前綴和第 &#x1d456; 個是 &#x1d446;&#x1d446…

機器學習中的凸函數和梯度下降法

一、凸函數 在機器學習中&#xff0c;凸函數 和 凸優化 是優化問題中的重要概念&#xff0c;許多機器學習算法的目標是優化一個凸函數。這些概念的核心思想圍繞著優化問題的簡化和求解效率。下面從簡單直觀的角度來解釋。 1. 什么是凸函數&#xff1f; 數學定義 一個函數 f…

vue3使用vue-native-websocket-vue3通訊

vue3使用vue-native-websocket-vue3通訊 插件使用一、啟用Vuex集成1.在mian.js中2.store/index.js文件中3.要websocket使用的頁面 二、啟用Piain集成1.在mian.js中2.根目錄下創建store文件夾&#xff0c;分別創建PiniaType.ts&#xff0c;store.ts&#xff0c;useSocketStore.t…

Windows圖形界面(GUI)-QT-C/C++ - Qt控件與布局系統詳解

公開視頻 -> 鏈接點擊跳轉公開課程博客首頁 -> ???鏈接點擊跳轉博客主頁 目錄 Qt布局系統(Layouts) 布局管理器基礎 高級布局技巧 嵌套布局 設置間距和邊距 常用控件詳解 按鈕類控件 QPushButton (標準按鈕) QRadioButton (單選按鈕) QCheckBox (復選框) …

深入理解 ECMAScript 2024 新特性:字符串 isWellFormed 方法

ECMAScript 2024 引入了一個新的字符串實例方法&#xff1a;String.prototype.isWellFormed。這一新增功能是為了幫助開發者更容易地驗證字符串是否為有效的 Unicode 文本。本文將詳細介紹這一方法的使用場景、實現原理及其在實際應用中的價值。 String.prototype.isWellFormed…

[Linux]Docker快速上手操作教程

前言 以下命令并不是docker的所有&#xff0c;僅涉及日常使用時最最常用的命令。 目的之一時給入門的朋友熟悉學習&#xff0c;其二時我自己偶爾使用時備忘。 一、概念 簡單介紹下docker的相關概念&#xff1a; 鏡像&#xff1a;Docker 鏡像是一個輕量級、可執行的獨立軟件…

【算法學習筆記】32:篩法求解歐拉函數

上節學習的是求一個數 n n n的歐拉函數&#xff0c;因為用的試除法&#xff0c;所以時間復雜度是 O ( n ) O(\sqrt{n}) O(n ?)&#xff0c;如果要求 m m m個數的歐拉函數&#xff0c;那么就會花 O ( m n ) O(m \sqrt{n}) O(mn ?)的時間。如果是求連續一批數的歐拉函數&#x…

生產管理看板助力節能科技公司實現數據自動化管理

在節能科技公司的生產過程中&#xff0c;數據管理的自動化是提高生產效率和產品質量的關鍵。然而&#xff0c;許多公司在數據記錄、展示、對比和存檔方面仍面臨諸多痛點&#xff0c;如產品檢測數據無法自動記錄、缺乏直觀的產線狀態展示、檢測數據對比繁瑣耗時&#xff0c;以及…