从哈希表到红黑树:探讨 epoll 是如何管理事件的?

news2024/11/19 9:36:07

揭开pkill的秘密:在Linux中杀死进程的完整指南

  • 一、引言
  • 二、 传统事件管理的局限性
  • 三、epoll 概述
    • 3.1、epoll 的基本概念和工作原理
    • 3.2、epoll 在 Linux 内核中的实现方式
  • 四、哈希表在事件管理中的挑战
  • 五、 红黑树在 epoll 中的应用
  • 六、epoll 中的事件注册与触发
  • 七、红黑树的优势与局限性
  • 总结

博主简介


💡一个热爱分享高性能服务器后台开发知识的博主,目标是通过理论与代码实践的结合,让世界上看似难以掌握的技术变得易于理解与掌握。技能涵盖了多个领域,包括C/C++、Linux、Nginx、MySQL、Redis、fastdfs、kafka、Docker、TCP/IP、协程、DPDK等。
👉
🎖️ CSDN实力新星、CSDN博客专家、华为云云享专家、阿里云专家博主
👉


一、引言

在计算机领域,事件通知是一种重要的机制,用于监视和响应各种事件,例如网络连接、文件IO、定时器等。随着计算机应用变得越来越复杂,对于高性能事件通知机制的需求也越来越迫切。传统的事件通知机制可能存在效率低下的问题,因此需要一种更高效的解决方案。
在这里插入图片描述

epoll 是Linux操作系统中引入的一种事件通知机制,它具有出色的性能和扩展性,适用于高并发的应用场景。它的重要性在于它能够显著提高事件处理的效率,降低系统资源的消耗。

epoll 的高性能特性

  • epoll 使用非阻塞I/O,允许一个线程同时管理多个事件,避免了传统阻塞I/O的效率问题。
  • epoll 是事件驱动的,只有在事件发生时才会通知应用程序,避免了轮询的开销。
  • epoll 支持注册大量的文件描述符,适用于高并发环境。
  • epoll 内部使用了红黑树和双链表等高效数据结构来管理事件。

epoll的应用场景:在网络服务器中,epoll可以用于同时管理大量的网络连接,提供高性能的网络服务;在文件系统中,可以用于监控文件变化等。

与传统机制的比较:可以与传统的事件通知机制(如select和poll)进行比较,强调 epoll 的性能优势,包括避免了文件描述符集合的线性扫描等。

epoll作为高性能事件通知机制在现代计算机应用中扮演着重要角色。它通过提供高并发、低延迟、高效能的特性,使得应用能够更好地适应大规模连接和实时通信等需求,从而在事件管理中具有重要的地位。

本文旨在深入探讨epoll如何通过有效的数据结构优化事件管理,从而实现高性能的事件通知机制。通过详细分析epoll的工作原理、内部数据结构以及与其他事件通知机制的比较,本文旨在解释epoll是如何满足现代计算机应用对高并发、低延迟需求的,以及它在实际应用中的重要角色。

二、 传统事件管理的局限性

传统的事件管理方法主要包括阻塞式I/O模型和多路复用I/O模型(如select和poll)。这些方法在处理I/O事件时存在一些局限性,特别是在高并发情况下。

(1)阻塞式I/O模型: 在阻塞式I/O模型中,当程序需要等待某个事件完成时,它会阻塞(即停止执行),直到事件完成为止。这意味着程序在等待事件完成时无法继续执行其他任务,从而降低了程序的并发性能。例如,在网络编程中,如果一个连接没有数据可读取,那么整个程序可能会被阻塞,无法处理其他连接。

局限性:

  1. 低并发处理能力:每个连接都需要独立的线程或进程来处理,这在高并发环境下会导致资源消耗过大。
  2. 性能下降:阻塞式模型在等待事件完成时会浪费CPU时间,降低了系统的性能。
  3. 难以管理多个连接:当连接数量增加时,线程或进程的管理变得复杂,容易造成资源耗尽和上下文切换开销增加。

(2)多路复用I/O模型

  • select: select函数允许程序监视多个文件描述符的状态,当有可读或可写事件发生时通知程序进行处理。但是,select在监视大量文件描述符时性能下降严重,因为它需要线性扫描文件描述符列表。
  • poll: poll函数与select类似,但采用了更有效的数据结构,能够避免select的一些性能问题。然而,poll仍然需要遍历整个文件描述符列表,导致在大规模并发情况下仍然存在性能瓶颈。

局限性:

  1. 线性扫描开销:在大规模文件描述符列表中,需要遍历整个列表来查找有事件发生的文件描述符,导致性能下降。
  2. 额外内存开销:需要维护文件描述符集合,可能会消耗较多的内存空间。
  3. 不适用于高并发:当连接数量增加时,多路复用模型的性能也会逐渐下降。

这些传统事件管理方法在高并发环境下存在性能瓶颈,无法很好地满足现代计算机应用对高性能、低延迟的要求。

哈希表作为一种常见的数据结构,用于存储键值对。但是在高并发环境下,哈希表可能会面临以下性能问题:

  • 哈希冲突: 哈希表使用哈希函数将键映射到索引位置。不同的键可能映射到相同的索引,导致冲突。在高并发环境下,大量的并发插入、查找或删除操作可能导致大量的哈希冲突,从而降低操作的效率。

  • 竞争条件: 当多个线程或进程同时进行哈希表的插入、查找或删除操作时,可能会发生竞争条件。竞争条件可能导致数据一致性问题,甚至破坏哈希表的结构,导致不可预测的行为。

  • 锁竞争: 为了避免竞争条件,很多实现会采用锁机制,如互斥锁,来保护哈希表的操作。然而,在高并发环境下,频繁的锁竞争可能会导致性能下降,因为每个操作都需要等待获取锁。

  • 伸缩性问题: 在高并发情况下,哈希表可能需要频繁地进行扩容或收缩操作,以保持合适的负载因子。这些操作可能涉及重新计算哈希值、重新分配内存等,耗费时间和资源。

  • 缓存一致性: 在分布式环境中,多个节点可能共享同一个哈希表,需要考虑缓存一致性的问题。高并发的读写操作可能导致缓存不一致,需要采取额外的机制来保持数据的正确性。

三、epoll 概述

3.1、epoll 的基本概念和工作原理

epoll 是 Linux 操作系统提供的一种 I/O 事件通知机制,用于高效地管理大量的文件描述符(sockets、文件、设备等)的异步 I/O 操作。它的目的是在高并发的网络应用中提供更好的性能和资源利用率,相较于传统的 I/O 多路复用技术(如 select 和 poll)具有更高的效率。

基本概念: epoll 提供了一种非阻塞的 I/O 操作方式,它允许应用程序同时监视多个文件描述符,并在这些描述符上发生事件时通知应用程序。这些事件可以包括可读、可写、错误等情况。epoll 通过将文件描述符注册到一个特殊的数据结构中来管理,从而可以有效地等待多个事件。

工作原理:

  1. 首先需要通过 epoll_create 系统调用创建一个 epoll 实例,该实例代表了一个文件描述符的集合。
  2. 使用 epoll_ctl 系统调用将文件描述符添加到 epoll 实例中,并指定要监视的事件类型(读、写、错误等)。
  3. 使用 epoll_wait 系统调用等待事件的发生。该调用会阻塞,直到有注册的文件描述符上发生了指定的事件。一旦有事件发生,epoll_wait 返回事件的详细信息,包括触发事件的文件描述符和事件类型。
  4. 根据 epoll_wait 返回的事件信息,执行相应的操作。这可以包括读取数据、写入数据、连接处理等。

epoll 的优点:

  1. epoll 使用了事件就绪通知,避免了传统多路复用方法中需要轮询每个文件描述符的开销。
  2. epoll 可以有效地处理大量的并发连接,因为它不会随着文件描述符数量的增加而降低性能。
  3. epoll 只返回那些已经就绪的文件描述符,减少了应用程序不必要的处理。
  4. epoll 支持 “边缘触发” 模式,可以减少数据从内核到用户空间的拷贝次数。

3.2、epoll 在 Linux 内核中的实现方式

epoll 的实现方式主要涉及数据结构和算法的设计。在 Linux 内核中,epoll 的实现主要包括以下几个关键组件:

  • 红黑树(Red-Black Tree): epoll 使用红黑树来存储注册的文件描述符,这使得在添加、删除和查找文件描述符时的时间复杂度都是 O(log n)。红黑树是一种自平衡的二叉搜索树,能够保持树的相对平衡,从而保证操作的高效性能。

  • 就绪列表(Ready List): 内核会维护一个就绪列表,其中包含已经就绪的文件描述符。当文件描述符就绪时,它会被添加到这个列表中。应用程序可以通过系统调用来获取就绪列表中的文件描述符,从而避免了轮询所有文件描述符的开销。

  • 回调机制: 当文件描述符就绪时,内核会调用注册的回调函数来通知应用程序。这些回调函数是在应用程序代码中定义的,它们会处理实际的 I/O 操作。

  • 事件数据结构: 内核会使用数据结构来表示事件,这些数据结构包括有关文件描述符和事件类型的信息。应用程序通过查询这些数据结构,可以了解文件描述符的状态以及需要执行的操作。

epoll 的实现方式充分利用了数据结构和算法的优势,通过红黑树的高效查找和插入,以及就绪列表的通知机制,实现了在高并发情况下高效地管理和处理大量的 I/O 事件。这种设计使得应用程序能够及时地响应就绪的文件描述符,而不需要耗费大量的 CPU 资源在轮询上。

四、哈希表在事件管理中的挑战

  1. 哈希冲突(Collisions):冲突指的是两个或更多的键映射到了同一个桶(bucket)。在高并发情况下,由于并发写入,冲突可能会更加频繁。
  2. 并发安全性(Concurrency Safety):在大规模并发情况下,多个线程或进程同时对哈希表进行读写操作,可能导致数据一致性问题或竞态条件。
  3. 扩容(Resize):在哈希表中插入或删除大量的键值对时,可能会导致哈希表的负载因子增加,从而影响哈希表的性能。
  4. 在大规模并发情况下,读取性能可能成为一个瓶颈。

在大规模并发情况下需要高效地管理事件,可以选择:

  1. 事件队列:使用队列数据结构可以实现高效的事件管理。每当有新的事件发生时,将其添加到队列的末尾,并可以通过多线程或进程异步处理队列中的事件。这种方式可以避免并发冲突,同时保持高效的插入和删除操作。

  2. 树形数据结构:使用树形数据结构,如B树、红黑树或AVL树,可以实现更快速的查找和检索操作。可以根据事件的某种属性(例如时间戳)进行有序存储,并使用树结构进行快速搜索和范围查询。

  3. 基于乐观并发控制的哈希表:乐观并发控制(Optimistic Concurrency Control)是一种无锁技术,适用于高并发情况下的并发操作。基于乐观并发控制的哈希表可以实现更高的并发性能,通过版本号或时间戳来解决冲突,并保证数据一致性。

  4. 分布式数据结构:如果并发情况非常高,可以考虑使用分布式数据结构来处理事件。例如,将事件分布在多个节点或服务器上,通过分片或分区策略来均衡负载,并使用一致性哈希算法或分布式哈希表来管理事件。

五、 红黑树在 epoll 中的应用

红黑树是一种自平衡的二叉搜索树,它可以用于优化事件管理的性能,红黑树用作存储文件描述符的数据结构,起到了管理和组织文件描述符的作用。

  1. 高效的查找和插入:红黑树作为一种自平衡的二叉搜索树,具有快速的查找和插入操作。在 epoll 中,红黑树可以根据文件描述符的值作为键来存储和查找对应的文件描述符,以实现快速的查找和插入。

  2. 文件描述符的有序管理:红黑树中的节点按照键的有序性进行存储。在 epoll 中,可以根据文件描述符的某些属性(如文件描述符的值)将其有序地插入红黑树中。这样可以实现对文件描述符的有序管理,便于进行范围查询或按照一定顺序访问。

  3. 高效的事件检测和触发:在 epoll 中,红黑树存储的文件描述符通常与特定的事件关联。通过在红黑树上进行遍历,可以快速地检测出就绪的文件描述符(即有事件发生的文件描述符),从而触发相应的操作。

  4. 并发安全性支持:在 epoll 中,红黑树作为存储文件描述符的数据结构,需要支持高并发的访问和操作。为了保证并发安全性,可以使用锁机制(如读写锁或细粒度锁)来保护红黑树的并发访问。

六、epoll 中的事件注册与触发

epoll 使用红黑树(红黑树的一种变种,即事件多路分发的红黑树)来实现事件的注册和触发机制。epoll实现事件管理的过程:

  1. 创建红黑树和事件表:

    • 首先,创建一个红黑树,该红黑树用于存储需要监听的文件描述符(File Descriptor,简称 FD)对象。
    • 创建一个事件表,用于存储发生事件的文件描述符和相应的事件类型(如读、写)。
  2. 注册事件:

    • 将需要监听的文件描述符和感兴趣的事件类型(如 EPOLLIN - 可读事件,EPOLLOUT - 可写事件等)添加到红黑树中。
    • 在红黑树节点中存储文件描述符和相应的事件信息。
  3. 阻塞等待事件触发:

    • 将红黑树中的文件描述符注册到内核事件表中,开始监听事件。
    • 等待事件的发生,这个过程中 epoll 会使线程进入阻塞态。
  4. 事件的触发和处理:

    • 当某个文件描述符上有感兴趣的事件发生时,触发事件,并将该文件描述符加入内核事件表的就绪队列中。
    • epoll 从就绪队列中获取已触发的文件描述符,根据红黑树找到对应的节点,并从节点中获取事件信息。
    • epoll 会将该文件描述符和触发的事件放入一个就绪事件列表中,以等待后续的处理。
  5. 处理就绪的事件:

    • 从就绪事件列表中依次取出就绪的文件描述符和对应的事件类型。
    • 根据事件类型,执行相应的处理操作。
红黑树示意图:

                5 ()
                /  \
       3()    10()
                 
就绪事件列表:(FD1, EPOLLIN), (FD2, EPOLLOUT)

         +--------------+
         |              |
---- FD1 |    EPOLLIN   |
         |              |
         +--------------+
         |              |
---- FD2 |   EPOLLOUT   |
         |              |
         +--------------+

注册事件时将文件描述符添加到红黑树中,等待事件触发并将触发的文件描述符加入就绪队列,最后根据事件类型处理就绪事件。

在 epoll 中,红黑树的有序性对事件触发顺序至关重要。

  1. 事件触发顺序的影响:

    • 在 epoll 中,当多个文件描述符上的事件准备就绪时,触发的顺序可能对应不同的处理逻辑或业务需求。例如,在网络通信中,顺序可能决定了消息接收的顺序,而消息接收的顺序可能对应了业务逻辑的处理顺序。因此,确保正确的事件触发顺序对于满足应用程序的需求非常重要。
  2. 红黑树的有序性:

    • 红黑树是一种自平衡的二叉搜索树,它具有固定的存储和遍历顺序。在 epoll 中,红黑树的有序性保证了插入和删除操作的顺序,从而反映了注册事件的顺序。这对于后续的事件触发和处理非常关键。
  3. 事件触发的顺序保证:

    • epoll 在触发事件时,按照红黑树节点的有序顺序进行处理。具体来说,它会沿着红黑树中的左子树进行遍历,保证触发事件的顺序与节点在红黑树中的顺序一致。这样可以保证事件触发的顺序与注册事件的顺序保持一致。

七、红黑树的优势与局限性

在 epoll 中,红黑树具有以下优势:

  1. 快速的插入和删除操作:红黑树是一种自平衡的二叉搜索树,在插入和删除节点时能够保持树的平衡。插入和删除操作的时间复杂度为O(log n),其中n是红黑树中的节点数量。这使得红黑树能够高效地处理事件的注册和注销。

  2. 快速的查找操作:由于红黑树是按照键的有序性进行组织的,它具有快速的查找操作。查找一个键的时间复杂度也为O(log n),在 epoll 中可以根据文件描述符快速找到相应的事件。

  3. 高效的事件触发顺序:红黑树的有序性保证了事件触发顺序与节点在红黑树中的顺序一致。当多个事件同时准备就绪时,epoll 会按照红黑树节点的顺序依次触发事件,从而满足应用程序的需求。

  4. 数据结构的动态平衡性:红黑树会在插入和删除节点时进行颜色变换和旋转操作,以保持树的平衡性。这个动态平衡性能够使红黑树在面对频繁的插入和删除操作时保持较低的高度,减少了查找操作的时间复杂度。

局限性:

  1. 动态平衡调整的复杂性:红黑树通过颜色变换和旋转操作来保持树的平衡。然而,这些操作在实现和理解上可能比较复杂,特别是在面对复杂的插入和删除操作时。

  2. 内存占用:红黑树相对于其他数据结构来说,会占用更多的内存空间。每个节点除了存储值和指针外还需要存储颜色信息,这增加了每个节点的空间开销。对于大规模数据集或内存受限的系统,红黑树的内存占用可能成为一个问题。

  3. 更新操作的开销:红黑树的动态平衡特性意味着插入和删除节点时需要进行颜色变换和旋转操作,以维持树的平衡。这些操作的开销可能会导致更新操作相对较慢,特别是在频繁插入和删除节点的情况下。

  4. 缓存性能:由于红黑树的节点在内存中不一定是连续存储的,因此在访问节点时可能会遇到缓存不命中的问题,从而影响访问性能。相比之下,其他数据结构如数组或链表在缓存中的局部性可能更好,因此在某些情况下可能具有更好的性能。

总结

  1. 红黑树在 epoll 中的角色:红黑树作为一种高效的数据结构,可以通过快速的查找、有序的存储和动态平衡的特性,优化事件的注册和触发机制。它用于存储注册事件的文件描述符,并确保事件的有序触发。

  2. 红黑树的优势:红黑树具有快速的增删查操作、有序性和动态平衡调整等优势。它能够实现快速的事件管理,支持高并发操作,并提供确定的事件触发顺序。

展望未来,事件管理机制如 epoll 可能会在以下方面继续发展:

  1. 更高的并发性能:随着计算机系统的硬件和软件技术的不断发展,事件管理机制可能会进一步优化,以提供更高的并发性能。这可能涉及到更高效的数据结构和算法设计,以及更好的并发控制机制。

  2. 更灵活的事件过滤和选择:随着应用场景的变化和需求的增长,事件管理机制可能会提供更灵活和精细的事件过滤和选择功能。这将使开发人员能够更细致地控制事件的触发条件和处理方式,并根据具体需求进行定制和优化。

  3. 更高级的异步编程模型:未来事件管理机制可能会与更高级的异步编程模型结合,以提供更强大的异步处理能力。例如,结合协程或异步任务框架,可以实现更好的事件驱动编程模式,提高代码的可读性和可维护性。

  4. 跨平台和跨语言支持:随着跨平台和跨语言开发的需求增加,事件管理机制可能会提供更好的跨平台和跨语言支持。这将使开发人员能够更方便地在不同的操作系统和编程语言之间进行事件管理和交互。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TCP 和 UDP 的区别、TCP 是如何保证可靠传输的?

先来介绍一些osi七层模型 分为应用层、表示层、会话层、运输层、网络层、链路层、物理层。 应用层(数据):确定进程之间通信的性质以及满足用户需要以及提供网络和用户应用,为应用程序提供服务,DNS,HTTP,HTTPS&#xf…

strcpy函数

目录 函数介绍: 函数声明: 具体使用: 情况一: 情况二: 注意事项: 1.源字符必须以 \0结束: 2.目标空间必须足够大,以确保能放源字符串: 3.目标空间必须可变&…

阿里2面:你们部署多少节点?1000W并发,当如何部署?

说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如阿里、网易、有赞、希音、百度、网易、滴滴的面试资格,遇到一几个很重要的面试题: 1000W并发,需部署多少个节点?如何觉得部署多少…

<八> objectARX开发:动态拖动Jig创建自定义实体

1、介绍 接上一篇文章,在某些情况下,CAD中的实体对象初始参数并不是固定的,我们需要通过jig动态拖动方式来绘制自定义实体,下面就用一个简单的例子来介绍一下自定义实体动态绘制。   实体形状:包括实体夹点和文字夹点拖动实现。 2、效果 3、源码 static void RYMyGrou…

软考:中级软件设计师:无线网,网络接入技术,ipv6

软考:中级软件设计师:无线网 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 &#x…

退出屏保前玩一把游戏吧!webBrowser中网页如何调用.NET方法

本文主要以 HackerScreenSaver 新功能的开发经历介绍 webBrowser中网页如何调用.NET方法的过程。 1. 背景 之前开源了一款名为 HackerScreenSaver 的 Windows 屏保程序。该程序具有模拟黑客炫酷界面的特点,用户可以将自定义的网页作为锁屏界面。不久前,…

1. import pandas as pd 导入库

【目录】 文章目录 1. import pandas as pd 导入库1. pandas库的概念2. 导入pandas库2.1 常规导入2.2 别名导入 3. 别名的作用4. 课堂练习 【正文】 1. import pandas as pd 导入库 【学习时间】 10分钟 1. pandas库的概念 pandas:熊猫panda的复数, …

基于体素形态学测量分析(VBM)的工具包比较及其在年龄预测中的应用

摘要 基于体素的形态学测量分析(VBM)通常用于灰质体积(GMV)的局部量化。目前存在多种实现VBM的方法。然而,如何比较这些方法及其在应用中的效用(例如对年龄效应的估计)仍不清楚。这会使研究人员疑惑他们应该在其项目中使用哪种VBM工具包。本研究以用户为中心&#…

【字节跳动青训营】后端笔记整理-4 | Go框架三件套之GORM的使用

**本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金。 我的go开发环境: *本地IDE:GoLand 2023.1.2 *go:1.20.6 *MySQL:8.0 本文介绍Go框架三…

百万级数据导入导出

导入 引入easyexcel <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.3.2</version></dependency>总结有三种导出方式&#xff1a; 单行读取&#xff0c;单行导入。这种方案最简单…

涛然自得周刊(第06期):韩版苏东坡的突围

作者&#xff1a;何一涛 日期&#xff1a;2023 年 8 月 27 日 涛然自得周刊主要精选作者阅读过的书影音内容&#xff0c;不定期发布。历史周刊内容可以看这里。 电影 兹山鱼谱 讲述丁若铨因政治事件被贬黜到了遥远的黑山岛。来到岛上后&#xff0c;丁被大自然环境疗愈&#…

自定义温度显示控件(四) — 终结篇

概述 详细讲述自定义温度控件的实现 详细 前言 在之前的文章中&#xff0c;已经讲到了自定义温度显示控件一步步进化的历程&#xff0c;大家有兴趣的话可参考以下文章&#xff1a; 自定义温度显示控件(一) 自定义温度显示控件(二) 自定义温度显示控件(三) 今天讲温度实现效…

CPU深度解析

操作系统课程 计算机组成 ALU:计算单元(运算器)PC:pc寄存器存执行指令Registers:寄存器存数据MMU:控制器程序的构成:指令+数据 总线:一个程序读入内存,全是由0和1构成,从内存读取到cpu计算,需要通过总线。一段01数据段是指令还是数据是通过来源总线区分的。总线分…

农村农产品信息展示网站的设计与实现(论文+源码)_kaic

摘 要 随着软件技术的迅速发展,农产品信息展示的平台越来越多,传统的农产品显示方法将被计算机图形技术取代。这种网站技术主要把农产品的描述、农产品价格、农产品图片等内容&#xff0c;通过计算机网络的开发技术&#xff0c;在互联网上进行展示&#xff0c;然后通过计算机网…

9 串口通信(三)

9.4 USART串口数据包 HEX数据包 1&#xff09;固定包长&#xff0c;含包头包尾 例如陀螺仪的数据&#xff0c;需要XYZ坐标一起打包 2&#xff09;可变包长&#xff0c;含包头包尾 如果定义的包头包尾刚刚好也是数据&#xff0c;这样容易混淆&#xff0c;解决的办法&#x…

java-Optional 类详解

目录 前言 Optional的构造方法 Optional的相关方法介绍 isPresent用法&#xff1a; get用法&#xff1a; filter用法&#xff1a; orElse用法&#xff1a; orElseGet用法 orElseThrow用法 map用法 flatMap用法&#xff1a; 前言 Optional 类是java8的新特性&#xff0…

Redis—Redis介绍(是什么/为什么快/为什么做MySQL缓存等)

一、Redis是什么 Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 提供了多种数据类型来支持不同的业务场景&#xff0c;比如 String(字符串)、…

基于springboot学生社团管理系统/基于Java的高校社团管理系统的设计与实现

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

130.【Spring注解】

Spring 注解 (一)、AOP功能测试1.AOP 使用步骤(1).导入AOP对应的依赖(2).编写业务逻辑类(3).编写切面类(4).编写配置类(5). 编写测试类 (二)、AOP 原理1.EnableAspectJAutoProxy(1).EnableAspectJAutoProxy源码(2).AspectJAutoProxyRegistrar 自定义注册bean源码(3).打断点进行…