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 {

    @Autowired
    private 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 的熟悉程度来做出决策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954516.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【React】脚手架进阶

目录 暴露webpack配置package.json的变化修改webpack.config.js配置less修改域名、端口号浏览器兼容处理处理跨域 暴露webpack配置 react-scripts对脚手架中的打包命令进行封装,如何暴露这些打包配置呢?上篇写到在package.json中的scripts配置项中有eje…

java项目之现代企业人力资源管理系统设计与实现(源码+文档)

大家好我是风歌,今天要和大家聊的是一款基于ssm的现代企业人力资源管理系统设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 现代企业人力资源管理系统设计与实现的主要使用者分为管理员、经理和普通员工三个角…

2025.1.15——三、报错注入

一、基本操作:整理已知信息,本题为报错注入,需进一步确认回显方式 二、用updatexml()解题步骤 step 1:依据回显方式判断题目类型 键入:1、1 and 11 、id2-1 得到:查询正确的回显 键入:1’、…

【IDEA 2024】学习笔记--文件选项卡

在我们项目的开发过程中,由于项目涉及的类过多,以至于我们会打开很多的窗口。使用IDEA默认的配置,个人觉得十分不便。 目录 一、设置多个文件选项卡按照文件字母顺序排列 二、设置多个文件选项卡分行显示 一、设置多个文件选项卡按照文件字…

自己动手搭建“接入 AI Agent 的数字人”

前言 本文的实战案例来自于开源项目:https://github.com/wan-h/awesome-digital-human-live2d。该项目可以运用Dify编排框架和Live2D驱动模型搭建智能数字人,实现智能对话并动态交互,大家可以自行部署尝试,项目效果如下。 开源&a…

Flink链接Kafka

一、基于 Flink 的 Kafka 消息生产者 Kafka 生产者的创建与配置: 代码通过 FlinkKafkaProducer 创建 Kafka 生产者,用于向 Kafka 主题发送消息。Flink 执行环境的配置: 配置了 Flink 的检查点机制,确保消息的可靠性,支…

电脑有两张网卡,如何实现同时访问外网和内网?

要是想让一台电脑用两张网卡,既能访问外网又能访问内网,那可以通过设置网络路由还有网卡的 IP 地址来达成。 检查一下网卡的连接 得保证电脑的两张网卡分别连到外网和内网的网络设备上,像路由器或者交换机啥的。 给网卡配上不一样的 IP 地…

dockerfile2.0

dockerfile实现lnmp nginx centos7 mysql centos7 php centos7 自定义镜像来实现整个架构 cd /opt mkdir nginx mysql php cd nginx 拖入nginx和wordpress vim Dockerfile vim nginx.conf ↓ worker_processes 1; events {worker_connections 1024; } http {include …

mysql-5.7.18保姆级详细安装教程

本文主要讲解如何安装mysql-5.7.18数据库: 将绿色版安装包mysql-5.7.18-winx64解压后目录中内容如下图,该例是安装在D盘根目录。 在mysql安装目录中新建my.ini文件,文件内容及各配置项内容如下图,需要先将配置项【skip-grant-tab…

【深度学习实战】kaggle 自动驾驶的假场景分类

本次分享我在kaggle中参与竞赛的历程,这个版本是我的第一版,使用的是vgg。欢迎大家进行建议和交流。 概述 判断自动驾驶场景是真是假,训练神经网络或使用任何算法来分类驾驶场景的图像是真实的还是虚假的。 图像采用 RGB 格式并以 JPEG 格式…

在Linux上如何让ollama在GPU上运行模型

之前一直在 Mac 上使用 ollama 所以没注意,最近在 Ubuntu 上运行发现一直在 CPU 上跑。我一开始以为是超显存了,因为 Mac 上如果超内存的话,那么就只用 CPU,但是我发现 Llama3.2 3B 只占用 3GB,这远没有超。看了一下命…

学习 Git 的工作原理,而不仅仅是命令

Git 是常用的去中心化源代码存储库。它是由 Linux 创建者 Linus Torvalds 创建的,用于管理 Linux 内核源代码。像 GitHub 这样的整个服务都是基于它的。因此,如果您想在 Linux 世界中进行编程或将 IBM 的 DevOps Services 与 Git 结合使用,那…

【MySQL实战】mysql_exporter+Prometheus+Grafana

要在Prometheus和Grafana中监控MySQL数据库,如下图: 可以使用mysql_exporter。 以下是一些步骤来设置和配置这个监控环境: 1. 安装和配置Prometheus: - 下载和安装Prometheus。 - 在prometheus.yml中配置MySQL通过添加以下内…

适配器模式案例

如果在这样的结构中 我们在Controller中注入,但我们后续需要修改Oss时,比如从minioService改成AliyunService时,需要改动的代码很多。于是我们抽象出一个FileService,让controller只跟fileservice耦合,这样我没只需要在…

AI大模型语音交互方案,ESP32-S3联网通信,设备智能化响应联动

在科技日新月异的当下,人工智能与物联网技术正以前所未有的速度重塑着我们的生活,玩具和潮玩领域也迎来了翻天覆地的变化。 AI语音交互在玩具和潮玩产品中的应用越来越广泛,ESP32-S3凭借其高性能、低功耗、丰富的外设接口和强大的AI能力&…

Android DataBinding 结合 ViewModel的使用

Android DataBinding 结合 ViewModel的使用 一、build.gradle引入对应的依赖 在build.gradle(app模块)里引入依赖,然后Sync Now一下: android {​viewBinding {enabled true}dataBinding {enabled true}} 完整的build.gradle代…

掌握Golang strings包:高效字符串处理指南

掌握Golang strings包:高效字符串处理指南 引言为什么要学习和掌握strings包本教程的目标 基本用法strings包概述导入strings包常用函数列表及简要介绍 字符串创建与基本操作创建字符串字符串连接:Join重复字符串:Repeat修改字符串&#xff1…

论文阅读:Searching for Fast Demosaicking Algorithms

今天介绍一篇有关去马赛克的工作,去马赛克是 ISP 流程里面非常重要的一个模块,可以说是将多姿多彩的大千世界进行色彩还原的重要一步。这篇工作探索的是如何从各种各样的去马赛克算法中,选择最佳的一种。 Abstract 本文提出了一种方法&…

自建RustDesk服务器

RustDesk服务端 下面的截图是我本地的一个服务器做为演示用,你自行的搭建服务需要该服务器有固定的ip地址 1、通过宝塔面板快速安装 2、点击【安装】后会有一个配置信息,默认即可 3、点击【确认】后会自动安装等待安装完成 4、安装完成后点击【打开…

JavaSE学习心得(反射篇)

反射 前言 获取class对象的三种方式 利用反射获取构造方法 利用反射获取成员变量 利用反射获取成员方法 练习 保存信息 跟配置文件结合动态创建 前言 接上期文章:JavaSE学习心得(多线程与网络编程篇) 教程链接:黑马…