PostgreSQL 的事务管理和并发控制机制解析

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁
🦄 个人主页——libin9iOak的博客🎐
🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

文章目录

  • PostgreSQL 的事务管理和并发控制机制解析
    • 摘要:
    • 1. 引言
    • 2. 事务管理
      • 2.1 什么是事务?
      • 2.2 PostgreSQL 的事务实现
        • 2.2.1 写日志(Write-Ahead Logging)
        • 2.2.2 回滚日志(Undo Log)
      • 3. 多版本并发控制(MVCC)
      • 3.1 MVCC 的原理
      • 3.2 MVCC 的实现方式
        • 3.2.1 快照(Snapshot)
        • 3.2.2 可见性规则(Visibility Rules)
    • 4. 锁和并发控制
      • 4.1 行级锁
      • 4.2 表级锁
      • 4.3 锁对数据库性能和并发处理的影响
    • 5. 死锁和避免策略
      • 5.1 什么是死锁?
      • 5.2 死锁可能发生的原因
      • 5.3 PostgreSQL 的死锁检测和解决
      • 5.4 避免死锁的策略
    • 6. 事务隔离级别
      • 6.1 读未提交(Read Uncommitted)
      • 6.2 读已提交(Read Committed)
      • 6.3 可重复读(Repeatable Read)
      • 6.4 串行化(Serializable)
      • 6.5 隔离级别的应用场景
    • 7. 乐观并发控制
      • 7.1 乐观并发控制的概念
      • 7.2 PostgreSQL 中的乐观并发控制
    • 8. 性能优化和并发控制
      • 8.1 性能优化技巧
      • 8.2 性能优化与并发控制的冲突
    • 9. 结论
    • 10. 参考文献
  • 原创声明

在这里插入图片描述

PostgreSQL 的事务管理和并发控制机制解析

摘要:

在本篇博客中,我们将深入解析 PostgreSQL 的事务管理和并发控制机制。事务管理和并发控制是 PostgreSQL 强大功能的基石,它们保证了数据库的数据一致性和并发处理的高效性。

1. 引言

PostgreSQL是一个功能强大的开源关系型数据库管理系统。它以其可靠性、扩展性和高级功能而闻名。然而,要确保数据库的数据一致性和高效处理并发操作,就需要深入了解 PostgreSQL 的事务管理和并发控制机制。本篇博客将带领读者深入探讨这些重要的主题,为读者提供全面的了解。

2. 事务管理

事务是数据库操作的基本单位,它是一系列操作的逻辑单元,要么全部执行,要么全部回滚。在本节中,我们将深入探讨什么是事务以及事务的特性,即原子性、一致性、隔离性和持久性(ACID)。然后,我们将重点关注 PostgreSQL 如何实现事务的 ACID 特性,包括写日志和回滚日志等关键机制。

2.1 什么是事务?

事务是一组数据库操作的集合,这些操作要么全部成功执行,要么全部不执行,以保持数据库的一致性和完整性。事务具有以下特性:

  • 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败回滚,不存在部分执行的情况。如果任何操作失败,整个事务都将回滚,数据库状态将恢复到执行事务前的状态。

  • 一致性(Consistency):事务执行后,数据库必须保持一致状态。这意味着事务将使数据库从一个有效状态转换到另一个有效状态,而不会导致数据库处于中间、不一致的状态。

  • 隔离性(Isolation):并发事务的执行是相互隔离的,一个事务的执行不应影响其他事务的执行。隔离性确保每个事务在看到数据时就像在系统中是唯一运行的一样,避免了并发执行时可能产生的问题。

  • 持久性(Durability):一旦事务成功提交,其结果将永久保存在数据库中,即使发生系统故障,数据也不会丢失。

2.2 PostgreSQL 的事务实现

PostgreSQL 是一个支持事务的关系型数据库管理系统,它严格遵循 ACID 原则,确保数据的一致性和可靠性。要实现事务的 ACID 特性,PostgreSQL 采取了以下关键机制:

2.2.1 写日志(Write-Ahead Logging)

写日志是 PostgreSQL 实现事务持久性的重要机制。在事务执行期间,所有对数据库的修改操作将首先被写入事务日志,然后再应用到数据库。这样,即使系统发生故障,数据库也能通过重放日志中的操作来恢复到故障前的状态。

2.2.2 回滚日志(Undo Log)

回滚日志是为了实现事务的原子性和一致性而引入的机制。在事务执行期间,所有对数据库的修改操作都被记录在回滚日志中。如果事务回滚或发生错误,可以利用回滚日志来撤消已经执行的操作,从而将数据库恢复到原始状态。

3. 多版本并发控制(MVCC)

在本节中,我们将深入介绍 PostgreSQL 中的多版本并发控制(MVCC)机制。MVCC 是 PostgreSQL 处理并发操作的重要手段,它能够有效解决并发事务之间的隔离问题,确保数据库的数据一致性。

MVCC(Multi-Version Concurrency Control)是 PostgreSQL 中用于处理并发的重要机制。在并发环境中,多个事务同时读写数据库时可能会产生冲突,MVCC 通过维护数据的多个版本来解决这个问题。

MVCC 的原理是为每个事务创建一个可见性视图,这个视图决定了在该事务中可以看到哪些数据版本。当一个事务读取数据时,MVCC 确保它只看到在事务开始前已经存在的数据版本,而不会看到其他事务尚未提交的修改。这样,每个事务都像在独立的数据库中操作一样,不会互相干扰。

通过 MVCC,PostgreSQL 能够实现高度的隔离性,避免了许多并发问题,从而保障数据库的数据一致性。同时,MVCC 还提供了高并发性能,允许多个事务同时读取数据库,提升了数据库的并发处理能力。

3.1 MVCC 的原理

MVCC 的核心原理是为每个事务创建多个数据版本,这些版本可以同时存在于数据库中,而不会相互干扰。每个事务在开始时会创建一个可见性视图,这个视图决定了在该事务中可以看到哪些数据版本。

当一个事务对数据进行修改时,实际上是在创建新的数据版本,而不是直接在原始数据上进行修改。这样,其他事务仍然可以看到原始数据版本,不会受到正在进行的修改操作的影响。

3.2 MVCC 的实现方式

在 PostgreSQL 中,MVCC 的实现方式主要涉及以下两个关键概念:

3.2.1 快照(Snapshot)

快照是指每个事务在开始时所看到的数据库状态。每个事务都有自己的快照,它决定了在该事务中可以访问哪些数据版本。当事务执行时,它只能看到在该事务开始之前已经存在的数据版本,不会看到其他事务尚未提交的修改。

3.2.2 可见性规则(Visibility Rules)

可见性规则定义了每个事务在其快照下能够看到哪些数据版本。一般而言,事务只能看到满足以下条件的数据版本:

  • 数据版本的创建时间在事务开始之前。
  • 数据版本是由已提交的事务创建的。

通过快照和可见性规则,PostgreSQL 实现了高度的事务隔离性,从而避免了许多并发问题,例如脏读、不可重复读和幻读。

4. 锁和并发控制

在并发环境下,为了防止数据损坏和保持数据的一致性,PostgreSQL 使用锁来处理并发事务。锁是一种同步机制,它可以限制对数据库对象的访问,使得每个事务能够按照一定的顺序进行执行,从而避免并发冲突。

4.1 行级锁

行级锁是最细粒度的锁,它允许多个事务同时访问同一张表,但只有在修改同一行数据时才会发生冲突。行级锁能够在保持高并发性的同时,保证数据的一致性和完整性。

4.2 表级锁

表级锁是比较粗粒度的锁,它会锁定整张表,使得其他事务无法同时修改整张表的数据。表级锁适用于一些特定的操作场景,但在大多数情况下,行级锁更为常用,因为它能够提供更好的并发性能。

4.3 锁对数据库性能和并发处理的影响

锁在保证数据一致性的同时,也会对数据库的性能和并发处理能力产生影响。过度使用锁可能会导致事务等待时间增加,降低数据库的并发性能。因此,在设计数据库系统时,需要根据具体情况合理选择锁的粒度,以平衡数据一致性和并发性能之间的关系。

在接下来的篇章中,我们将继续探讨 PostgreSQL 的并发控制机制以及其他相关主题,帮助读者更全面地了解 PostgreSQL 数据库管理的核心概念。请继续关注!

5. 死锁和避免策略

在并发系统中,死锁是一个常见的问题,它可能导致事务无法继续执行,从而影响数据库的性能和可用性。在本节中,我们将详细解释什么是死锁,以及死锁可能发生的原因。然后,我们将探讨 PostgreSQL 如何检测和解决死锁,并提供避免死锁的策略。

5.1 什么是死锁?

死锁是指两个或多个事务彼此持有对方需要的资源,并且由于互相等待对方释放资源,导致所有事务都无法继续执行的情况。当发生死锁时,系统陷入了僵局,无法自动恢复,需要人工干预才能解决。

5.2 死锁可能发生的原因

死锁发生的原因通常包括以下几点:

  1. 循环等待:多个事务形成一个循环,每个事务都在等待另一个事务释放资源。

  2. 竞争资源:多个事务同时竞争相同的资源,但每个事务又持有其他事务需要的资源,导致死锁。

  3. 无法释放锁:某个事务在持有锁的情况下,需要获取其他事务持有的锁,但其他事务无法释放这些锁。

5.3 PostgreSQL 的死锁检测和解决

PostgreSQL 使用一种超时机制来检测死锁。当系统发现两个或多个事务之间存在循环等待时,它会选择中断其中一个事务,释放其所占有的资源,以解开死锁。被中断的事务会被回滚,然后可以由应用程序重新发起。

5.4 避免死锁的策略

为了避免死锁的发生,可以采取以下策略:

  1. 锁顺序排序:在应用程序中统一规定获取锁的顺序,避免不同事务以不同的顺序获取锁,从而降低死锁发生的概率。

  2. 降低事务的粒度:尽量减少事务持有锁的时间,缩小事务的范围,从而减少死锁的可能性。

  3. 使用辅助工具:使用专门的死锁检测工具,可以帮助及时发现死锁并解决。

6. 事务隔离级别

事务隔离级别是数据库管理系统用来控制并发事务之间相互影响的程度。PostgreSQL 支持多种事务隔离级别,每种级别定义了事务之间的可见性和并发性。不同的隔离级别在处理事务并发时有不同的性能和复杂性权衡。在本节中,我们将介绍 PostgreSQL 支持的事务隔离级别,并解释每种级别的特点和应用场景。

PostgreSQL 支持多种事务隔离级别,每种级别定义了事务之间的可见性和并发性。不同的隔离级别在处理事务并发时有不同的性能和复杂性权衡。在本节中,我们将介绍 PostgreSQL 支持的事务隔离级别,包括:

  • 读未提交(Read Uncommitted):允许一个事务读取另一个事务尚未提交的修改。

  • 读已提交(Read Committed):确保一个事务只能读取已提交的数据,解决了脏读问题。

  • 可重复读(Repeatable Read):确保在一个事务执行期间,多次读取同样的数据都能得到一致的结果,解决了不可重复读问题。

  • 串行化(Serializable):最高的隔离级别,确保事务之间完全串行执行,避免了幻读问题。

6.1 读未提交(Read Uncommitted)

读未提交是最低的事务隔离级别,它允许一个事务读取另一个事务尚未提交的修改。这意味着在一个事务中可以读取到其他事务的脏数据(未提交的数据),可能会导致脏读、不可重复读和幻读等问题。

由于读未提交级别的隔离性较低,一般情况下不建议在生产环境中使用该级别,因为它可能会引起严重的并发问题。

6.2 读已提交(Read Committed)

读已提交是较低的隔离级别,它确保一个事务只能读取已提交的数据。在这个级别下,事务之间的相互影响被控制在较小的范围内,避免了脏读问题。

虽然读已提交级别解决了脏读问题,但在并发环境下仍可能出现不可重复读和幻读问题。因为其他事务可能在当前事务读取数据的过程中进行了修改和提交。

6.3 可重复读(Repeatable Read)

可重复读是较高的隔离级别,它确保在一个事务执行期间,多次读取同样的数据都能得到一致的结果。在可重复读级别下,其他事务对数据的修改不会被读取,避免了脏读和不可重复读问题。

但在可重复读级别下,仍然可能出现幻读问题。幻读是指一个事务在读取某个范围的数据时,另一个事务在该范围内插入了新的数据,导致第一个事务重新读取时发现了新插入的数据。

6.4 串行化(Serializable)

串行化是最高的隔离级别,它确保事务之间完全串行执行,避免了脏读、不可重复读和幻读等所有并发问题。在串行化级别下,数据库会对事务进行强制排序,以保证每个事务的操作都像是在单独执行的数据库中进行的。

串行化级别提供了最高的数据一致性和隔离性,但付出的代价是性能较低,因为事务之间无法并发执行。

6.5 隔离级别的应用场景

  • 读未提交:一般不建议在生产环境中使用,但在某些特殊情况下,如果对数据一致性要求不高,可以考虑使用。

  • 读已提交:适用于大多数情况,能够提供较好的性能和数据一致性。

  • 可重复读:适用于对数据一致性要求较高的场景,可以解决不可重复读问题。

  • 串行化:适用于对数据一致性要求极高的场景,可以解决所有并发问题,但性能较低。

在实际应用中,选择适当的隔离级别需要根据具体的业务需求和性能要求进行权衡。默认情况下,PostgreSQL 使用读已提交隔离级别,可以通过设置事务隔离级别来更改默认的隔离级别。

7. 乐观并发控制

乐观并发控制是一种不使用显式锁的并发控制方式,它通过乐观地假设事务之间不会产生冲突来处理并发。在本节中,我们将引入乐观并发控制的概念和原理,并解释 PostgreSQL 如何通过版本号或时间戳来实现乐观并发控制,从而避免了显式锁机制,提高了并发处理的效率。

7.1 乐观并发控制的概念

乐观并发控制是一种较为宽松的并发控制方式,它假设事务之间的冲突不太频繁发生。在乐观并发控制中,事务在执行读取操作时,并不会对数据进行加锁,而是在提交更新操作时检查是否发生了冲突。如果发现冲突,那么事务将会回滚,让应用程序重新尝试。

7.2 PostgreSQL 中的乐观并发控制

PostgreSQL 支持乐观并发控制通过使用版本号或时间戳来实现。具体来说,每个数据行都会有一个相关的版本号或时间戳,当事务更新数据时,会将版本号或时间戳进行更新,从而表示数据已经被修改。

在乐观并发控制中,当事务进行更新时,会先读取数据行的版本号或时间戳,并在提交更新时再次检查数据行的版本号或时间戳是否发生了变化。如果发现数据行的版本号或时间戳已经被其他事务修改,那么当前事务会回滚,并提示应用程序重新执行。

通过乐观并发控制,PostgreSQL 避免了显式的锁机制,提高了并发处理的效率,特别是在读多写少的场景中,乐观并发控制能够带来显著的性能提升。

8. 性能优化和并发控制

性能优化是提高数据库处理效率的关键。在本节中,我们将提供一些优化技巧,以提高事务处理的性能和并发处理能力。同时,我们将探讨性能优化对数据库并发控制的影响,以避免性能优化与数据一致性的冲突。

8.1 性能优化技巧

以下是一些常用的性能优化技巧,可以帮助提高数据库的处理效率:

  1. 合理使用索引:在数据库中添加适当的索引可以加快数据检索的速度,提高查询性能。

  2. 批量处理数据:尽量使用批量处理操作,减少数据库与应用程序之间的交互次数,从而提高处理效率。

  3. 减少数据冗余:避免数据冗余可以节约存储空间,同时减少数据的更新和维护操作。

  4. 优化查询语句:合理编写查询语句,尽量避免复杂的连接和子查询,从而减少查询的执行时间。

8.2 性能优化与并发控制的冲突

在进行性能优化时,需要特别注意与并发控制的冲突。某些性能优化策略可能会增加事务之间的竞争,导致并发冲突增加,进而影响数据库的数据一致性。因此,在优化数据库性能时,必须权衡优化的效果和数据一致性之间的关系,确保性能优化不会影响数据库的并发控制。

在实际应用中,需要根据具体情况综合考虑并发控制和性能优化的需求,采取合适的措施来提高数据库的处理效率,同时保证数据的一致性。

9. 结论

PostgreSQL 的事务管理和并发控制机制是其作为一款优秀数据库系统的重要基石。在本篇博客中,我们深入解析了 PostgreSQL 的事务管理和并发控制机制,以及其他相关主题,为读者提供了全面的了解。

通过学习事务管理,我们了解了事务的概念和特性,即原子性、一致性、隔离性和持久性(ACID)。我们还探讨了 PostgreSQL 如何实现事务的 ACID 特性,包括写日志和回滚日志等关键机制。

了解多版本并发控制(MVCC)机制,我们了解了它是 PostgreSQL 中用于处理并发的重要方式,通过版本号或时间戳实现乐观并发控制,避免了显式锁机制,提高了并发处理的效率。

我们还讨论了锁和并发控制,了解了 PostgreSQL 如何使用锁来处理并发事务,包括行级锁和表级锁,并分析了不同类型的锁对数据库性能和并发处理的影响。

另外,我们深入探讨了死锁问题以及避免策略,以及 PostgreSQL 支持的不同事务隔离级别,包括读未提交、读已提交、可重复读和串行化,帮助读者选择适合自己应用的隔离级别。

最后,我们提供了性能优化技巧,以提高事务处理的性能和并发处理能力,并强调了在进行性能优化时要注意与并发控制的冲突,确保性能优化不会影响数据库的数据一致性。

综上所述,深入理解 PostgreSQL 的事务管理和并发控制机制对于优化和管理 PostgreSQL 数据库至关重要。通过合理地配置事务隔离级别和性能优化策略,我们能够充分发挥 PostgreSQL 强大功能的优势,确保数据库的数据一致性和高效处理并发操作。

在阅读本篇博客后,希望读者对 PostgreSQL 的事务管理和并发控制机制有了更深入的了解,并能够应用这些知识来优化和管理自己的 PostgreSQL 数据库。若想进一步深入学习,可以参考列出的参考文献,获取更多关于 PostgreSQL 的相关资料。感谢阅读本篇博客!

10. 参考文献

在本篇博客的撰写过程中,我们参考了相关的书籍、文章和官方文档,供读者进一步深入学习:

  • PostgreSQL 官方网站
  • 《PostgreSQL 9 高级技术》 - 唐明明
  • 《PostgreSQL 权威指南》 - 高桥哲夫
  • 《PostgreSQL 修炼之道》 - 张文升

希望这些参考文献能够帮助读者更深入地了解 PostgreSQL 的事务管理和并发控制机制。感谢您阅读本篇博客!

原创声明

======= ·

  • 原创作者: 猫头虎

作者wx: [ libin9iOak ]


本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

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

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

相关文章

Prompt Engineering论文梳理(主要为2022年)

AutoPrompt (EMNLP2020) Shin T, Razeghi Y, Logan IV R L, et al. Autoprompt: Eliciting knowledge from language models with automatically generated prompts[J]. arXiv preprint arXiv:2010.15980, 2020. 基本架构,original input t…

关联分析-Apriori

关联分析-Apriori 1. 定义 关联分析就是从大规模数据中,发现对象之间隐含关系与规律的过程,也称为关联规则学习。 2. 相关概念 2.1 事务、项与项集 订单号购买商品0001可乐、薯片0002口香糖、可乐0003可乐、口香糖、薯片 以上面的订单为例&#xf…

elasticsearch使用记录

参考文章:https://elasticsearch-py.readthedocs.io/en/v8.8.2/ 参考文章:https://cuiqingcai.com/6214.html 参考文章:https://www.cnblogs.com/cupleo/p/13953890.html elasticsearch版本:8.8.2(软件包发行版) python版本&#…

MySQL 读写分离

目录 一、什么是读写分离? 二、为什么要读写分离呢? 三、什么时候要读写分离? 四、主从复制与读写分离 五、MySQL 读写分离原理 六、企业 使用MySQL 读写分离场景 1)基于程序代码内部实现 2)基于中间代理层实现…

React重新渲染的触发机制及其优化策略

React是一个用于构建用户界面的JavaScript库,它的核心特点之一是使用虚拟DOM(Virtual DOM)来实现高效的组件渲染。那组件重新渲染的机制是如何呢?基于这些机制,如果进行优化呢? 虚拟DOM是一个用JavaScript对…

"科技与狠活"企业级无代码开发MES系统,一周实现数字化

随着科技的不断发展,企业级无代码开发平台成为了一种新型的解决方案,能够有效降低软件开发门槛,提升开发效率。在制造业领域,MES系统(Manufacturing Execution System)作为一种关键的生产管理工具&#xff…

C# 全局响应Ctrl+Alt+鼠标右键

一、简述 某些应用,我们希望全局自定义热键。按键少了会和别的应用程序冲突,按键多了可定用户操作不变。因此我计划左手用CtrlAlt,右手用鼠标右键呼出我自定义的菜单。 我使用键盘和鼠标事件进行简单测试(Ctrl鼠标右键&#xff…

[SQL系列] 从头开始学PostgreSQL 自增 权限和时间

[SQL系列] 从头开始学PostgreSQL 事务 锁 子查询_Edward.W的博客-CSDN博客https://blog.csdn.net/u013379032/article/details/131841058上一篇介绍了事务,锁,子查询 事务有点像是原子操作,需要有完整性,要么全都完成了&#xff…

2023年深圳杯数学建模A题影响城市居民身体健康的因素分析

2023年深圳杯数学建模 A题 影响城市居民身体健康的因素分析 原题再现: 以心脑血管疾病、糖尿病、恶性肿瘤以及慢性阻塞性肺病为代表的慢性非传染性疾病(以下简称慢性病)已经成为影响我国居民身体健康的重要问题。随着人们生活方式的改变&am…

flutter开发实战-RepaintBoundary实现Widget截图功能

flutter开发实战-RepaintBoundary实现Widget截图功能 在开发中,遇到需要使用截图,像iOS可以截图UIView获取到UIImage,在flutter中可以使用RepaintBoundary实现截图功能 相机拍摄的图片: RepaintBoundary截图后的图片 一、Re…

Docker 全栈体系(七)

Docker 体系(高级篇) 五、Docker-compose容器编排 1. 是什么 Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调…

python selenium爬虫自动登录实例

拷贝地址:python selenium爬虫自动登录实例_python selenium登录_Ustiniano的博客-CSDN博客 一、概述 我们要先安装selenium这个库,使用pip install selenium 命令安装,selenium这个库相当于机器模仿人的行为去点击浏览器上的元素&#xff0…

测试技术之测试用例质量的评估

第一,凭证测试用例的方式评估其品质,主要搜罗: 1)测试用例与需要规格剖析中需要条款的可追溯性,好比:咱们要求每一个需要条款至少有1个测试用例与之对于应。目的是为了评估测试的需要拆穿困绕率,以及合成需…

抖音seo源码开发源代码开发技术分享

一、 抖音SEO源码开发,需要掌握以下技术: 抖音API接口:抖音提供了丰富的API接口,包括用户信息、视频信息、评论信息等。 数据爬取技术:通过抓包分析抖音接口的数据结构,可以使用Python等编程语言编写爬虫程…

【低代码专题方案】iPaaS运维方案,助力企业集成平台智能化高效运维

01 场景背景 随着IT行业的发展和各家企业IT建设的需要,信息系统移动化、社交化、大数据、系统互联、数据打通等需求不断增多,企业集成平台占据各个企业领域,成为各业务系统数据传输的中枢。 集成平台承接的业务系统越多,集成平台…

Practice1|1207. 独一无二的出现次数、1365. 有多少小于当前数字的数字、941. 有效的山脉数组

1207. 独一无二的出现次数 1.题目: 给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。 示例 1: 输入:arr [1,2,2,1,1,3…

FPGA-DFPGL22学习7-gpio

系列文章目录 FPGA-DFPGL22学习6-led 文章目录 系列文章目录前言一、原理图1)key2)beeptouch端口对应1)key2)beeptouch 二、程序设计1)KEY2)beeptouch 三、程序编写1.KEY代码:2.beeptouch代码: 结论 前言 和原子哥一起学习FPGA …

JAVA面试总结-Redis篇章(四)——双写一致性

JAVA面试总结-Redis篇章(四)——双写一致性 问:redis 做为缓存,mysql的数据如何与redis进行同步呢?第一种情况,如果你的项目一致性要求高的话 采用以下逻辑我们应该先删除缓存,再修改数据库&…

「深度学习之优化算法」(十八)头脑风暴算法

1. 头脑风暴算法简介 (以下描述,均不是学术用语,仅供大家快乐的阅读)   可能大家对“头脑风暴”这个词不怎么熟,毕竟是外来词汇,其大概含义就是分组讨论,畅所欲言。   头脑风暴算法(Brain Storm Optimization)是根据人们进行“头脑风暴”讨论困难问题的解决方案的过…

Spring数据源

⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹 ⭐所属专栏:JavaEE、Spring 目录 1、简介2、作用3、开发步骤3.1、导入坐标3.2、创建对象c3p0druid提取jdbc.properties读取配…