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.mzph.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…

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…

Windows图形界面(GUI)-QT-C/C++ - Qt控件与布局系统详解

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 Qt布局系统(Layouts) 布局管理器基础 高级布局技巧 嵌套布局 设置间距和边距 常用控件详解 按钮类控件 QPushButton (标准按钮) QRadioButton (单选按钮) QCheckBox (复选框) …

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

ECMAScript 2024 引入了一个新的字符串实例方法&#xff1a;String.prototype.isWellFormed。这一新增功能是为了帮助开发者更容易地验证字符串是否为有效的 Unicode 文本。本文将详细介绍这一方法的使用场景、实现原理及其在实际应用中的价值。 String.prototype.isWellFormed…

生产管理看板助力节能科技公司实现数据自动化管理

在节能科技公司的生产过程中&#xff0c;数据管理的自动化是提高生产效率和产品质量的关键。然而&#xff0c;许多公司在数据记录、展示、对比和存档方面仍面临诸多痛点&#xff0c;如产品检测数据无法自动记录、缺乏直观的产线状态展示、检测数据对比繁琐耗时&#xff0c;以及…

【C++】B2112 石头剪子布

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述游戏规则&#xff1a;输入格式&#xff1a;输出格式&#xff1a;输入输出样例&#xff1a;解题分析与实现 &#x1f4af;我的做法实现逻辑优点与不足 &#x1f4af…

两分钟解决 :![rejected] master -> master (fetch first) , 无法正常push到远端库

目录 分析问题的原因解决 分析问题的原因 在git push的时候莫名遇到这种情况 若你在git上修改了如README.md的文件。由于本地是没有README.md文件的&#xff0c;所以导致 远端仓库git和本地不同步。 将远端、本地进行合并就可以很好的解决这个问题 注意&#xff1a;直接git pu…

微服务之松耦合

参考&#xff1a;https://microservices.io/post/architecture/2023/03/28/microservice-architecture-essentials-loose-coupling.html There’s actually two different types of coupling: runtime coupling - influences availability design-time coupling - influences…

hot100_240. 搜索二维矩阵 II

hot100_240. 搜索二维矩阵 II 直接遍历列减行增 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,4,7,1…

一步到位Python Django部署,浅谈Python Django框架

Django是一个使用Python开发的Web应用程序框架&#xff0c;它遵循MVC&#xff08;Model-View-Controller&#xff09;设计模式&#xff0c;旨在帮助开发人员更快、更轻松地构建和维护高质量的Web应用程序。Django提供了强大的基础设施和工具&#xff0c;以便于处理复杂的业务逻…

Apache PAIMON 学习

参考&#xff1a;Apache PAIMON&#xff1a;实时数据湖技术框架及其实践 数据湖不仅仅是一个存储不同类数据的技术手段&#xff0c;更是提高数据分析效率、支持数据驱动决策、加速AI发展的基础设施。 新一代实时数据湖技术&#xff0c;Apache PAIMON兼容Apache Flink、Spark等…