7天八股速记之C++后端——Day 1

坚持7天,短期内快速完成C++后端面试突击。每天10题,弥补后端八股知识缺漏,熟练掌握后端的高频考点,后端面试更有把握。

1. Redis 的五种数据结构 + 使用场景

  1. String(字符串)

    • 使用场景:存储单个值,例如缓存数据、计数器、分布式锁等。
  2. List(列表)

    • 使用场景:实现队列、栈、消息队列等,记录一系列有序的值,支持从两端插入和删除元素。
  3. Hash(哈希)

    • 使用场景:存储对象的字段和值,适用于存储、读取和更新对象属性,例如用户信息、配置信息等。
  4. Set(集合)

    • 使用场景:存储唯一值的无序集合,支持集合间的交集、并集、差集等操作,例如好友列表、标签系统等。
  5. Sorted Set(有序集合)

    • 使用场景:与Set相似,但每个元素关联了一个分数(score),根据分数进行排序,适用于排行榜、按权重筛选数据等场景。

2. Redis 内存淘汰策略

Redis 内存淘汰策略用于在内存不足时选择哪些键值对(Key-Value pairs)应该被删除以释放内存空间。

  1. Noeviction(无淘汰)
    当内存不足以容纳新写入的数据时,新写入操作会报错并返回一个内存错误(OOM)。

  2. Allkeys-lru(LRU算法)
    Least Recently Used(LRU)算法会删除最近最少使用的键,以释放内存空间。Redis会检查所有键的最近访问时间,并删除最近最少使用的键值对。

  3. Allkeys-random(随机淘汰)
    在内存不足时,Redis会随机选择键值对进行删除,这种策略是简单且不可预测的。

  4. Volatile-lru(带过期时间的LRU算法)
    类似于Allkeys-lru,但只会在设置了过期时间的键中选择淘汰。

  5. Volatile-ttl(带过期时间的TTL算法)
    类似于Allkeys-lru,但只会在设置了过期时间的键中选择淘汰,并优先选择剩余时间最短的键。

  6. Volatile-random(带过期时间的随机淘汰)
    类似于Allkeys-random,但只会在设置了过期时间的键中选择淘汰。

3. MySQL 和 Redis 数据一致性问题

  1. 数据同步延迟
    当应用同时使用MySQL和Redis时,如果更新数据到MySQL后立即查询Redis,由于数据同步的延迟,可能会导致Redis中的数据与MySQL中的数据不一致。

    • 解决方法:
      • 引入缓存失效机制:在数据更新时,及时使Redis中对应的缓存失效,确保下一次查询会重新从MySQL获取最新数据。
      • 使用主从复制:在MySQL中设置主从复制,将主库的更新同步到从库,应用读取数据时可以从从库获取,减少主库的压力。
  2. 数据丢失
    当写入Redis成功但MySQL写入失败时,可能会导致Redis中的数据和MySQL中的数据不一致。

    • 解决方法:
      • 使用事务:在应用层面确保Redis和MySQL的写入操作在同一个事务中,如果其中一个写入失败,则回滚另一个写入。
      • 引入消息队列:将写入Redis和MySQL的操作封装成消息,通过消息队列来确保消息的可靠传递,以避免数据丢失问题。
  3. 并发更新导致的数据不一致
    当多个客户端同时更新相同的数据时,可能会导致数据不一致的情况。

    • 解决方法:
      • 使用分布式锁:在更新操作之前获取分布式锁,确保同时只有一个客户端可以进行更新操作,从而避免并发更新导致的数据不一致问题。
      • 使用乐观锁或悲观锁:在MySQL中可以使用乐观锁(如通过版本号或时间戳)或悲观锁(如使用SELECT … FOR UPDATE语句)来确保并发更新的数据一致性。

4.Mysql 里面为什么用 B+ 树?

  1. 高效的范围查询
    B+树对范围查询的支持非常高效。在B+树中,相邻的节点彼此有序连接,这使得范围查询(例如,WHERE条件中使用了范围)可以通过遍历树中的部分节点来实现,而不必遍历整个数据集。

  2. 高效的顺序访问
    B+树的叶子节点形成了一个有序的链表,这使得顺序访问非常高效。例如,当需要按照索引顺序扫描表时,B+树可以快速地按顺序访问数据。

  3. 适用于磁盘存储
    B+树结构在磁盘存储上的性能非常好。由于B+树的节点大小通常可以设置得非常大,因此每个节点可以容纳更多的索引键值对,从而减少了磁盘I/O的次数。

  4. 支持快速的插入和删除
    B+树的平衡性质使得在其中进行插入和删除操作时,平均情况下的性能表现非常好。虽然插入和删除操作可能需要进行节点的分裂和合并,但这些操作的代价相对较低,因为它们只会影响树的局部结构。

  5. 易于实现
    B+树的结构相对简单,易于实现。这使得在数据库系统中广泛采用B+树作为索引结构,同时也便于优化和调整。

5.什么是事务

事务(Transaction)是指数据库管理系统(DBMS)执行的一组数据库操作单元,这些操作被视为单个逻辑工作单元,要么全部执行成功,要么全部失败,保证数据库的一致性和完整性。

事务具有以下四个特性(ACID):

  1. 原子性(Atomicity):事务中的所有操作要么全部执行成功,要么全部失败,不存在部分执行的情况。如果一个操作失败,整个事务将回滚到事务开始之前的状态。

  2. 一致性(Consistency):事务的执行必须保证数据库的一致性。事务在执行前后,数据库从一个一致的状态转变到另一个一致的状态。

  3. 隔离性(Isolation):事务的执行过程中,其所做的修改对其他事务是不可见的,即事务之间的操作是隔离的。这样可以防止多个事务并发执行时产生的一些问题,如脏读、不可重复读、幻读等。

  4. 持久性(Durability):一旦事务提交,其所做的修改将永久保存在数据库中,即使系统发生故障或重启,事务提交后的修改也不会丢失。

通过事务,可以保证在并发执行的情况下,数据库操作的正确性和可靠性,确保数据的完整性和一致性。在数据库系统中,事务是实现数据管理和并发控制的重要机制。

6.数据库的隔离级别,分别怎么解决可能出现的问题?

数据库的隔离级别定义了在多个事务并发执行时,事务之间的可见性和影响的程度。常见的隔离级别包括:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。下面是这些隔离级别可能出现的问题以及解决方法:

  1. 读未提交(Read Uncommitted)

    • 可能出现问题:脏读(Dirty Read):一个事务读取到了另一个事务未提交的数据。
    • 解决方法:不采取特殊措施,允许脏读。
  2. 读已提交(Read Committed)

    • 可能出现问题:不可重复读(Non-Repeatable Read):在一个事务内,同一个查询可能返回不同的结果。
    • 解决方法:使用行级锁或快照隔离,确保每次查询读取的数据是已提交的版本。
  3. 可重复读(Repeatable Read)

    • 可能出现问题:幻读(Phantom Read):一个事务在两次查询之间,另一个事务插入了新数据,导致第一个事务看到了不一致的结果。
    • 解决方法:使用间隙锁或快照隔离,防止其他事务在事务执行期间插入或删除数据。
  4. 串行化(Serializable)

    • 可能出现问题:并发性能低下,因为串行化级别要求所有事务按顺序执行。
    • 解决方法:将事务串行化执行,确保每个事务都完全按顺序执行,以避免任何并发问题。

不同的隔离级别提供了不同的性能和数据一致性保证,选择适当的隔离级别取决于应用的需求和数据访问模式。在实际应用中,可以根据具体情况选择合适的隔离级别,并结合数据库提供的锁机制来解决可能出现的并发问题。

7.讲讲 MVCC

MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种在数据库管理系统中实现事务并发的技术。MVCC允许读取和写入操作在并发执行时不互相干扰,从而提高了数据库的并发性能和可伸缩性。

在MVCC中,每个数据库行都有多个版本,每个版本都有一个时间戳或者序列号,用来表示它的创建时间或者更新顺序。当一个事务开始时,它会获得一个特定时间点或者序列号的快照视图,这个快照视图代表了数据库在事务开始时的状态。在事务执行期间,其他事务对数据库的修改不会影响到该事务的快照视图。

MVCC的核心原则包括:

  1. 可见性:一个事务只能看到它开始时数据库的状态,其他事务对数据的修改不会对它产生影响,即每个事务都在一个固定的快照视图上执行。

  2. 并发性:读写操作可以并发执行而不会互相干扰,读操作不会阻塞写操作,写操作也不会阻塞读操作,从而提高了数据库的并发性能。

  3. 数据一致性:MVCC保证事务的一致性,即使在多个并发事务执行的情况下,数据库也能保持一致的状态。

MVCC的实现通常基于两种技术:多版本数据和版本链。在多版本数据模型中,数据库中的每个数据行可以有多个版本,每个版本都有一个时间戳或者序列号来表示。在版本链模型中,每个数据行都有一个版本链,链中的每个节点都代表一个版本,链头指向最新版本,链尾指向最老版本。

MVCC提供了一种高效且灵活的并发控制机制,被广泛应用于许多流行的数据库管理系统中,例如MySQL的InnoDB引擎、PostgreSQL等。

8.既然用了 MVCC 版本查看,为什么还会出现幻读?

尽管MVCC技术提供了快照读的能力,每个事务都在一个固定的快照视图上执行,但在某些情况下,仍然可能出现幻读(Phantom Read)的现象。幻读指的是一个事务在两次查询之间,另一个事务插入了新数据,导致第一个事务看到了不一致的结果。

幻读通常发生在以下情况下:

  1. 范围查询:当一个事务执行范围查询时,例如使用了WHERE条件的SELECT语句,而另一个事务在该范围内插入了新数据,导致第一个事务在两次查询之间看到了不同的结果,即出现了幻读。

  2. 并发事务的更新或插入操作:即使一个事务采用MVCC技术,其他并发事务的更新或插入操作仍然可能导致幻读。虽然MVCC技术保证了事务的一致性视图,但是如果其他事务在执行范围内插入了新数据,那么该范围内的查询结果可能发生变化,导致了幻读。

解决幻读的方法包括:

  1. 使用串行化隔离级别:串行化隔离级别会完全禁止并发事务的执行,从而避免了幻读的发生。但是串行化级别会影响数据库的并发性能,通常只在必要时才使用。

  2. 使用锁:可以在事务执行期间对需要查询的数据行或范围进行加锁,确保其他事务不能插入新数据,从而避免了幻读的发生。但是使用锁可能会导致性能下降和死锁的风险,因此需要谨慎使用。

  3. 使用间隙锁:间隙锁可以锁定一个范围而不是单个数据行,从而防止其他事务在这个范围内插入新数据,避免了幻读的发生。

虽然MVCC技术可以减少幻读的发生,但在特定的并发环境下,仍然需要考虑其他因素并采取适当的措施来防止幻读的发生。

9.乐观锁和悲观锁

乐观锁(Optimistic Locking)和悲观锁(Pessimistic Locking)是两种处理并发访问的数据库锁定机制,它们的选择取决于应用的需求和性能特征。

  1. 悲观锁

    • 工作原理:悲观锁假设在事务执行期间会发生并发冲突,因此在读取或修改数据之前会先锁定数据。如果一个事务获取了悲观锁,则其他事务不能对该数据进行操作,直到锁被释放。

    • 实现方式:在数据库层面,可以使用诸如行级锁或表级锁等机制来实现悲观锁。

    • 适用场景:悲观锁适用于并发写入频繁、冲突概率较高的场景,例如高并发的在线交易系统、数据更新频繁的管理系统等。

  2. 乐观锁

    • 工作原理:乐观锁假设在事务执行期间并发冲突的概率较低,因此不主动加锁,而是在提交事务时检查数据是否被其他事务修改过。如果检测到冲突,则拒绝当前事务的提交。

    • 实现方式:在数据层面,通常是通过在表中增加一个版本号字段或者使用时间戳来实现乐观锁。

    • 适用场景:乐观锁适用于读取操作频繁、写入操作较少、并发冲突概率较低的场景,例如读多写少的数据报表系统、博客系统等。

比较:

  • 并发性能:悲观锁会在事务开始时锁定数据,可能会降低并发性能,因为其他事务需要等待锁的释放。而乐观锁在大多数情况下不加锁,可以提高并发性能。

  • 冲突处理:悲观锁在事务开始时就预防了并发冲突,而乐观锁在事务提交时才进行检查和处理冲突。

  • 实现复杂度:悲观锁的实现相对简单,因为加锁和释放锁的过程都是数据库自动处理的;而乐观锁需要在应用层面进行冲突检测和处理,实现起来可能会更复杂一些。

在实际应用中,应根据具体的业务需求和性能特征选择合适的锁定机制。

10.乐观锁和悲观锁的使用场景

乐观锁和悲观锁适用于不同的并发场景,根据应用需求和数据访问模式的不同,可以选择合适的锁定机制:

  1. 悲观锁的使用场景

    • 频繁写入的场景:当并发写入频繁时,悲观锁可以有效地防止数据的并发修改,确保数据的一致性。例如,在在线交易系统中,多个用户可能同时对同一笔订单进行修改,为了避免订单数据的不一致,可以使用悲观锁来锁定订单数据。

    • 需要强制顺序访问的场景:某些情况下,需要确保数据的顺序访问,例如对账操作,需要按照特定的顺序对数据进行处理。悲观锁可以在事务开始时锁定数据,确保只有一个事务可以访问数据,从而保证顺序访问。

    • 数据冲突概率较高的场景:在某些场景下,由于数据之间的关联性较高或者写入操作的复杂性较高,可能会导致数据冲突的概率较高。悲观锁可以在事务开始时锁定数据,确保数据的一致性和完整性。

  2. 乐观锁的使用场景

    • 读多写少的场景:当读取操作远远多于写入操作时,使用乐观锁可以减少锁的竞争,提高并发性能。例如,对于博客系统或者新闻网站等读多写少的场景,可以使用乐观锁来处理并发访问。

    • 无需强制顺序访问的场景:某些场景下,不需要强制顺序访问,只需要保证数据的一致性即可。在这种情况下,使用乐观锁可以减少对数据的加锁操作,提高系统的并发性能。

    • 冲突概率较低的场景:在某些场景下,并发冲突的概率较低,例如对于独立的用户操作或者对不相关数据的操作,可以使用乐观锁来处理并发访问。

总的来说,悲观锁适用于对并发冲突较为敏感的场景,需要在事务开始时就锁定数据;而乐观锁适用于读多写少、并发冲突较少的场景,可以在事务提交时检测并处理冲突。在实际应用中,应根据具体的业务需求和性能特征选择合适的锁定机制。

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

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

相关文章

MySQL 社区版 安装总结

很早就安装过MySQL,没有遇到过什么问题,直接next就行了,这次在新电脑上安装却遇到了一些问题,记录一下。 安装的是MySQL社区版,下载地址是www.mysql.com,进入后选择DOWNLOAD页面,选择MySQL Com…

【HBase】HBase高性能架构:如何保证大规模数据的高可用性

HBase高性能原理 HBase 能够提供高性能的数据处理能力,主要得益于其设计和架构的几个关键方面。这些设计特点使得 HBase 特别适合于大规模、分布式的环境中进行高效的数据读写操作。以下是 HBase 高性能的主要原因: 1. 基于列的存储 HBase 是一个列式…

【入门】方程的解

方程: a*ab*bc*cn&#xff0c;其中 0<a<b<c。请你求出它的所有解&#xff0c;结果按照 a 的值从小到大输出。 输入 输入一个整数 n&#xff0c;为方程等号右边的整数。 输出 输出若干行&#xff0c;每行包括 33 个空格隔开的整数&#xff0c;分别为 a,b,c 的值。 …

SqlServer专题

目录 1&#xff0c;连接数据库 2&#xff0c;连接池 1.何为连接池&#xff1f; 2.连接池运行原理。 3.如何查看连接池&#xff1f; 4.连接池注意事项。 3&#xff0c;一般SQL语句。 4&#xff0c;控制语句 1.判断语句 2.循环语句 5&#xff0c;视图 1.使用…

<计算机网络自顶向下> P2P应用

纯P2P架构 没有或者极少一直运行的Server&#xff0c;Peer节点间歇上网&#xff0c;每次IP地址都可能变化任意端系统都可以直接通信利用peer的服务能力&#xff0c;可扩展性好例子&#xff1a;文件分发; 流媒体; VoIP类别:两个节点相互上载下载文件&#xff0c;互通有无&#…

C# Solidworks二次开发:相机访问相关API详解

大家好&#xff0c;今天要介绍的API为相机相关的API&#xff0c;这篇文章比较适合女孩子&#xff0c;学会了相机就会拍照了&#xff0c;哈哈。 下面是要介绍的API: &#xff08;1&#xff09;第一个为GetFocalDistance&#xff0c;这个API的含义为获取相机的焦距&#xff0c;…

ASP.NET基于BS的图书销售管理系统的设计与实现

随着Internet的兴起&#xff0c;网络已经成为现代人生活中的一部分&#xff0c;越来越多的人喜欢在网上交易。本系统就是一个基于B/S模式的网络化的图书销售管理系统,采用的是ASP.NET技术&#xff0c;实现了用户注册信息管理、用户信息管理、图书销售点管理、图书信息管理、客户…

特征工程(IV)--特征选择

特征工程 有这么一句话在业界广泛流传&#xff1a;数据和特征决定了机器学习的上限&#xff0c;而模型和算法只是逼近这个上限而已。由此可见&#xff0c;特征工程在机器学习中占有相当重要的地位。在实际应用当中&#xff0c;可以说特征工程是机器学习成功的关键。 特征工程是…

《业务代表模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式&#xff08;极简c版&#xff09;》-CSDN博客 模式说明 方案&#xff1a; 业务代表模式将对特定业务的访问逻辑封装在一个代表对象中&#xff0c;客户端通过代表对象访问业务&#xff0c;而无需了解具体的业务逻辑。优点&#xff1a; 将业务…

【C语言】简易版扫雷+进阶版扫雷

目录 前言 一、分模块化 二、准备雷盘 2.1 游戏菜单 2.2 创建雷盘思路 2.3 构建雷盘 2.4 雷盘展示 2.4.1 初始化雷盘 2.4.2 打印雷盘 三、排雷 3.1 布置雷 3.2 排查雷 四、进阶版扫雷 总结 前言 C语言实现扫雷小游戏&#xff0c;帮我们更进一步的掌握数组、模块化…

Windows Server 2016虚拟机安装教程

一、VMware Workstation虚拟机软件的下载 官网下载入口&#xff1a;​​​​​​Download VMware Workstation Pro - VMware Customer Connect​​​​​ 下载好之后自己看着提示安装软件就好. 二、镜像文件的下载 下载网站入口&#xff1a;MSDN, 我告诉你 - 做一个安静…

Docker搭建Kanzi

Kanzi是一个虚拟形象产品&#xff0c;它具有丰富的自定义和交互能力&#xff0c;例如捏脸、换装、同步音乐动作、声源定位转向等。Kanzi的Docker镜像允许用户在容器化环境中部署和运行这些虚拟形象&#xff0c;为开发者和企业提供了便捷的解决方案。 Kanzi Docker镜像的功能 …

【Java EE】Spring核心思想(一)——IOC

文章目录 &#x1f38d;Spring 是什么&#xff1f;&#x1f384;什么是IoC呢&#xff1f;&#x1f338;传统程序开发&#x1f338;传统程序开发的缺陷&#x1f338;如何解决传统程序的缺陷&#xff1f;&#x1f338;控制反转式程序开发&#x1f338;对比总结 &#x1f332;理解…

汇编语言知识点整理(应付考试专用,想学习找其他的)

1 基础知识 1.1 信息在计算机内部的表示和存储 1.1.1 信息存储的基本概念 信息在计算机内部是以二进制数据的形式在存储器中存取的。介绍两个基本概念&#xff1a; 位&#xff08;Bit&#xff09; 计算机中最小的数据单位&#xff0c;一位有0、1两状态。Bit是计算机中最小…

MySQL优化表,表的碎片整理和空间回收,清理空间

1.sql -- 查看表占用空间大小。简单查询可以用show table status like blog_visit; select data_length, index_length, data_free, o.* from information_schema.tables o where table_schema in (lishuoboy-navigation) and table_nameblog_visit order by data_length des…

计算机服务器中了rmallox勒索病毒怎么办,rmallox勒索病毒解密流程步骤

在企业的生产运营过程中网络发挥着巨大作用&#xff0c;利用网络可以拓宽市场&#xff0c;提高办公效率&#xff0c;网络为企业的生产运营提供了极大便利&#xff0c;但也为企业的数据安全带来隐患。近日&#xff0c;云天数据恢复中心接到多家企业的求助&#xff0c;企业的计算…

使用 Verdaccio 私有化 npm 源指南

使用 Verdaccio 私有化 npm 源指南 使用 Verdaccio 私有化 npm 源指南 介绍什么是 Verdaccio为什么选择 Verdaccio部署 Verdaccio Nodejs 部署 全局局部 Docker 部署云服务商一键部署 注册用户发布私有 npm 包管理 npm 包项目使用私有源 全量切换部分切换 结尾源代码链接 介…

网络篇10 | 网络层 IP

网络篇10 | 网络层 IP 01 简介02 名称解释03 IP报文格式(IPv4)1&#xff09;4位版本协议(version)2&#xff09;4位首部长度(header length)3&#xff09;8位服务类型(Type Of Service, TOS)4&#xff09;16位总长度5&#xff09;16位(分片)标识6&#xff09;3位(分片)标志7&am…

【Java】Spring的概述

什么是Spring 据度娘所载&#xff1a;Spring是一个开源框架&#xff0c;Spring是于2003年兴起的一个轻量级的Java开发框架&#xff0c;由Rod Johnson创建。简单来说&#xff0c;Spring是一个分层的JavaSE/EEfull-stack(一站式)轻量级开源框架。 Spring的核心是控制反转(IoC)和…

4.14日网络编程学习

1.网络编程三要素 1.IP地址&#xff1a; IP地址&#xff1a;指互联网协议地址&#xff08;Internet Protocol Address&#xff09;&#xff0c;俗称IP。要想使网络中的计算机能够进行通信&#xff0c;必须为每台计算机指定一个标识号&#xff0c;通过这个标识号来指定接受数据…